Browse Source

Feb 20 [ADD] : Initial Commit 'education_university_management'

pull/358/merge
AjmalCybro 2 months ago
parent
commit
39153759ac
  1. 50
      education_university_management/README.rst
  2. 24
      education_university_management/__init__.py
  3. 87
      education_university_management/__manifest__.py
  4. 23
      education_university_management/controllers/__init__.py
  5. 92
      education_university_management/controllers/education_online_application.py
  6. 114
      education_university_management/controllers/education_university_management.py
  7. 32
      education_university_management/data/ir_sequence_data.xml
  8. 285
      education_university_management/data/mail_template_data.xml
  9. 12
      education_university_management/data/online_application_menu_data.xml
  10. 202
      education_university_management/demo/education_university_management_demo.xml
  11. 6
      education_university_management/doc/RELEASE_NOTES.md
  12. 53
      education_university_management/models/__init__.py
  13. 32
      education_university_management/models/account_journal.py
  14. 113
      education_university_management/models/account_move.py
  15. 83
      education_university_management/models/exam_result.py
  16. 44
      education_university_management/models/exam_subject_line.py
  17. 182
      education_university_management/models/exam_valuation.py
  18. 50
      education_university_management/models/exam_valuation_line.py
  19. 40
      education_university_management/models/fee_category.py
  20. 57
      education_university_management/models/fee_structure.py
  21. 50
      education_university_management/models/fee_structure_line.py
  22. 49
      education_university_management/models/fee_type.py
  23. 30
      education_university_management/models/reject_reason.py
  24. 33
      education_university_management/models/res_partner.py
  25. 43
      education_university_management/models/results_subject_line.py
  26. 38
      education_university_management/models/timetable_period.py
  27. 71
      education_university_management/models/timetable_schedule_line.py
  28. 39
      education_university_management/models/university_academic_year.py
  29. 353
      education_university_management/models/university_application.py
  30. 119
      education_university_management/models/university_attendance.py
  31. 51
      education_university_management/models/university_attendance_line.py
  32. 60
      education_university_management/models/university_batch.py
  33. 36
      education_university_management/models/university_course.py
  34. 39
      education_university_management/models/university_department.py
  35. 94
      education_university_management/models/university_document.py
  36. 33
      education_university_management/models/university_document_type.py
  37. 88
      education_university_management/models/university_exam.py
  38. 40
      education_university_management/models/university_exam_type.py
  39. 78
      education_university_management/models/university_faculty.py
  40. 55
      education_university_management/models/university_semester.py
  41. 146
      education_university_management/models/university_student.py
  42. 43
      education_university_management/models/university_subject.py
  43. 66
      education_university_management/models/university_syllabus.py
  44. 85
      education_university_management/models/university_timetable.py
  45. 30
      education_university_management/security/education_university_management_groups.xml
  46. 70
      education_university_management/security/ir.model.access.csv
  47. BIN
      education_university_management/static/description/assets/cybro-icon.png
  48. BIN
      education_university_management/static/description/assets/cybro-odoo.png
  49. 10
      education_university_management/static/description/assets/icons/arrows-repeat.svg
  50. BIN
      education_university_management/static/description/assets/icons/banner-1.png
  51. 73
      education_university_management/static/description/assets/icons/banner-2.svg
  52. BIN
      education_university_management/static/description/assets/icons/banner-bg.png
  53. 9
      education_university_management/static/description/assets/icons/banner-bg.svg
  54. 5
      education_university_management/static/description/assets/icons/banner-call.svg
  55. 5
      education_university_management/static/description/assets/icons/banner-mail.svg
  56. 343
      education_university_management/static/description/assets/icons/banner-pattern.svg
  57. 147
      education_university_management/static/description/assets/icons/banner-promo.svg
  58. 41
      education_university_management/static/description/assets/icons/brand-pair.svg
  59. BIN
      education_university_management/static/description/assets/icons/capture (1).png
  60. BIN
      education_university_management/static/description/assets/icons/check.png
  61. BIN
      education_university_management/static/description/assets/icons/chevron.png
  62. 5
      education_university_management/static/description/assets/icons/close-icon.svg
  63. BIN
      education_university_management/static/description/assets/icons/cogs.png
  64. 3
      education_university_management/static/description/assets/icons/collabarate-icon.svg
  65. BIN
      education_university_management/static/description/assets/icons/consultation.png
  66. BIN
      education_university_management/static/description/assets/icons/cybro-logo.png
  67. 1
      education_university_management/static/description/assets/icons/down.svg
  68. BIN
      education_university_management/static/description/assets/icons/ecom-black.png
  69. BIN
      education_university_management/static/description/assets/icons/education-black.png
  70. BIN
      education_university_management/static/description/assets/icons/faq.png
  71. 10
      education_university_management/static/description/assets/icons/feature-icon.svg
  72. BIN
      education_university_management/static/description/assets/icons/feature.png
  73. 10
      education_university_management/static/description/assets/icons/gear.svg
  74. BIN
      education_university_management/static/description/assets/icons/hero.gif
  75. 12
      education_university_management/static/description/assets/icons/hire-odoo.svg
  76. BIN
      education_university_management/static/description/assets/icons/hotel-black.png
  77. BIN
      education_university_management/static/description/assets/icons/img.png
  78. BIN
      education_university_management/static/description/assets/icons/license.png
  79. 13
      education_university_management/static/description/assets/icons/life-ring-icon.svg
  80. BIN
      education_university_management/static/description/assets/icons/lifebuoy.png
  81. 3
      education_university_management/static/description/assets/icons/mail.svg
  82. BIN
      education_university_management/static/description/assets/icons/manufacturing-black.png
  83. BIN
      education_university_management/static/description/assets/icons/notes.png
  84. 10
      education_university_management/static/description/assets/icons/notification icon.svg
  85. 4
      education_university_management/static/description/assets/icons/odoo-consultancy.svg
  86. 3
      education_university_management/static/description/assets/icons/odoo-licencing.svg
  87. BIN
      education_university_management/static/description/assets/icons/odoo-logo.png
  88. 9
      education_university_management/static/description/assets/icons/patter.svg
  89. BIN
      education_university_management/static/description/assets/icons/pattern1.png
  90. BIN
      education_university_management/static/description/assets/icons/photo-capture.png
  91. BIN
      education_university_management/static/description/assets/icons/pos-black.png
  92. 10
      education_university_management/static/description/assets/icons/puzzle-piece-icon.svg
  93. BIN
      education_university_management/static/description/assets/icons/puzzle.png
  94. 10
      education_university_management/static/description/assets/icons/replace-icon.svg
  95. BIN
      education_university_management/static/description/assets/icons/restaurant-black.png
  96. BIN
      education_university_management/static/description/assets/icons/screenshot-main.png
  97. BIN
      education_university_management/static/description/assets/icons/screenshot.png
  98. BIN
      education_university_management/static/description/assets/icons/service-black.png
  99. 10
      education_university_management/static/description/assets/icons/skype-fill.svg
  100. BIN
      education_university_management/static/description/assets/icons/skype.png

50
education_university_management/README.rst

@ -0,0 +1,50 @@
.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: AGPL-3
University Education Management
===============================
A strong and complete user-friendly ERP solution designed specifically for college administration is University Educational ERP. Details such as student entrance, enrollment information, faculty records, class management, and subject administration are simple to administer.
Configuration
=============
No additional configuration required
Company
-------
* `Cybrosys Techno Solutions <https://cybrosys.com/>`__
License
-------
Affero General Public License v3.0 (AGPL v3)
(https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Credits
------
Developer : (V16) Raneesha M K,
(V17) Jumana Jabin MP ,
(V18) Gayathri V,
Contact : odoo@cybrosys.com
Contacts
--------
* Mail Contact : odoo@cybrosys.com
* Website : https://cybrosys.com
Bug Tracker
-----------
Bugs are tracked on GitHub Issues. In case of trouble, please check there if
your issue has already been reported.
Maintainer
==========
.. image:: https://cybrosys.com/images/logo.png
:target: https://cybrosys.com
This module is maintained by Cybrosys Technologies.
For support and more information, please visit `Our Website <https://cybrosys.com/>`__
Further information
===================
HTML Description: `<static/description/index.html>`__

24
education_university_management/__init__.py

@ -0,0 +1,24 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import controllers
from . import models
from . import wizard

87
education_university_management/__manifest__.py

@ -0,0 +1,87 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V (odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
{
'name': ' University Education Management',
'version': '18.0.1.0.0',
'category': 'Industries',
'summary': """This modules helps to manage the university
education system""",
'description': """This module serves as a comprehensive solution for
efficiently managing the education system of a university enhancing
its overall functionality and user experience.""",
'author': 'Cybrosys Techno Solutions',
'company': 'Cybrosys Techno Solutions',
'maintainer': 'Cybrosys Techno Solutions',
'website': 'https://www.cybrosys.com',
'depends': ['mail', 'hr_recruitment', 'account', 'website'],
'data': [
'security/education_university_management_groups.xml',
'security/ir.model.access.csv',
'data/ir_sequence_data.xml',
'data/online_application_menu_data.xml',
'data/mail_template_data.xml',
'wizard/application_reject_views.xml',
'views/education_university_management_menus.xml',
'views/res_partner_views.xml',
'views/fee_category_views.xml',
'views/account_journal_views.xml',
'views/fee_types_views.xml',
'views/fee_structure_views.xml',
'views/account_move_views.xml',
'views/timetable_period_views.xml',
'views/university_exam_type_views.xml',
'views/university_exam_views.xml',
'views/exam_valuation_views.xml',
'views/exam_result_views.xml',
'views/university_timetable_views.xml',
'views/timetable_schedule_line_views.xml',
'views/university_application_views.xml',
'views/university_attendace_views.xml',
'views/university_attendance_line_views.xml',
'views/university_student_views.xml',
'views/university_document_type_views.xml',
'views/university_document_views.xml',
'views/reject_reason_views.xml',
'views/university_course_views.xml',
'views/university_department_views.xml',
'views/university_subject_views.xml',
'views/university_semester_views.xml',
'views/university_syllabus_views.xml',
'views/university_academic_year_views.xml',
'views/university_batch_views.xml',
'views/university_faculty_views.xml',
'views/student_portal_templates.xml',
'views/online_application_templates.xml',
],
'demo': ['demo/education_university_management_demo.xml'],
'assets': {
'web.assets_frontend': [
'/education_university_management/static/src/css/web_style.css',
'/education_university_management/static/src/js/online_application.js'
],
},
'images': ['static/description/banner.jpg'],
'license': 'AGPL-3',
'installable': True,
'auto_install': False,
'application': True,
}

23
education_university_management/controllers/__init__.py

@ -0,0 +1,23 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import education_online_application
from . import education_university_management

92
education_university_management/controllers/education_online_application.py

@ -0,0 +1,92 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
import base64
from odoo import http
from odoo.http import request
class OnlineAdmission(http.Controller):
"""Controller for taking online admission"""
@http.route('/university', type='http', auth='public', website=True)
def university_contact_us(self):
"""To redirect to contact page."""
return request.render('education_university_management.university')
@http.route('/applyonline', type='http', auth='public', website=True)
def online_admission(self):
"""To pass certain default field values
to the website registration form."""
vals = {
'department': request.env['university.department'].sudo().search(
[('semester_ids', '!=', False)]),
'course': request.env['university.course'].sudo().search([]),
'semester': request.env['university.semester'].sudo().search([]),
'year': request.env['university.academic.year'].sudo().search([]),
'doc_type': request.env['university.document.type'].sudo().search([
])
}
return request.render(
'education_university_management.online_admission',
vals)
@http.route('/admission/submit', type='http', auth='public',
website=True)
def register_admission(self, **post):
""" This will create a new student application with the values."""
if post:
guardian = request.env['res.partner'].sudo().create({
'name': post.get('father'),
'is_parent': True
})
application = request.env['university.application'].sudo().create({
'name': post.get('first_name'),
'last_name': post.get('last_name'),
'mother_name': post.get('mother'),
'father_name': post.get('father'),
'mobile': post.get('phone'),
'email': post.get('email'),
'date_of_birth': post.get('date'),
'academic_year_id': post.get('academic_year'),
'mother_tongue': post.get('tongue'),
'course_id': post.get('course'),
'department_id': post.get('department'),
'semester_id': post.get('semester'),
'street': post.get('communication_address'),
'per_street': post.get('communication_address'),
'guardian_id': guardian.id,
'image': base64.b64encode((post.get('image')).read())
})
doc_attachment = request.env['ir.attachment'].sudo().create({
'name': post.get('att').filename,
'res_name': 'Document',
'type': 'binary',
'datas': base64.encodebytes((post.get('att')).read()),
})
request.env['university.document'].sudo().create({
'document_type_id': post.get('doc_type'),
'attachment_ids': doc_attachment,
'application_ref_id': application.id
})
return request.render(
"education_university_management.submit_admission",
{})

114
education_university_management/controllers/education_university_management.py

@ -0,0 +1,114 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import http
from odoo.http import request, route
from odoo.addons.portal.controllers.portal import CustomerPortal
class StudentPortal(CustomerPortal):
"""Controller for creating a new portal design for student users"""
@http.route(['/home'], type='http', auth="user", website=True)
def student_portal(self):
"""New portal for student users"""
return request.render("education_university_management.student_portal")
@http.route(['/student/info'], type='http', auth="user", website=True)
def student_info(self):
"""Get basic details of students in the university"""
values = request.env['university.student'].sudo().search(
[('partner_id', '=', request.env.user.partner_id.id)])
full_name = values.name
if values.middle_name:
full_name = full_name + ' ' + values.middle_name
if values.last_name:
full_name = full_name + ' ' + values.last_name
if values.gender == 'female':
gender = 'Female'
elif values.gender == 'male':
gender = 'Male'
else:
gender = 'Other'
vals = {
'full_name': full_name,
'student': values,
'gender': gender,
}
return request.render("education_university_management.student_info",
{'values': vals})
@http.route(['/student/documents'], type='http', auth="user", website=True)
def student_documents(self):
"""Get documents of students in the university"""
student = request.env['university.student'].sudo().search([(
'partner_id',
'=',
request.env.user.partner_id.id)]).application_id
docs = request.env['university.document'].sudo().search(
[('application_ref_id', '=', student.id)])
attachment = request.env['ir.attachment'].sudo().browse(
docs.attachment_ids.ids)
attachment.public = True
return request.render(
"education_university_management.student_documents",
{'docs': docs})
@http.route(['/student/exam/results'], type='http', auth="user",
website=True)
def student_exam_result(self):
"""Get exam results of students in the university"""
student = request.env['university.student'].sudo().search(
[('partner_id', '=', request.env.user.partner_id.id)])
exam = request.env['exam.result'].sudo().search(
[('student_id', '=', student.id)])
return request.render(
"education_university_management.student_exam_result",
{'data': exam})
@http.route(['/student/result'], type='http', auth="user",
website=True)
def exam_subject(self):
"""Get subject wise exam results of students in the university"""
student = request.env['university.student'].sudo().search([(
'partner_id',
'=',
request.env.user.partner_id.id)])
exam = request.env['exam.result'].sudo().search(
[('student_id', '=', student.id)])
line = request.env['results.subject.line'].sudo().search(
[('result_id', '=', exam.id)])
data = {
'exam': exam,
'line': line
}
return request.render(
"education_university_management.student_result", data)
@route(['/my', '/my/home'], type='http', auth="user", website=True)
def home(self, **kw):
""" Overrided If the logged in user is a student,
they will be directed to the student portal."""
values = self._prepare_portal_layout_values()
if not request.env.user.partner_id.is_student:
return request.render("portal.portal_my_home", values)
else:
return request.redirect('/home')

32
education_university_management/data/ir_sequence_data.xml

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="1">
<!-- Sequences for university.document -->
<record id="seq_student_documents" model="ir.sequence">
<field name="name">Student Documents</field>
<field name="code">university.document</field>
<field name="prefix">DOC/%(range_year)s/</field>
<field eval="1" name="number_next"/>
<field eval="1" name="number_increment"/>
<field eval="True" name="use_date_range"/>
<field name="padding">3</field>
<field name="company_id" eval="False"/>
</record>
<!-- Sequences for university.application -->
<record id="seq_student_application" model="ir.sequence">
<field name="name">Student Application</field>
<field name="code">university.application</field>
<field name="prefix">SA</field>
<field name="padding">3</field>
<field name="company_id" eval="False"/>
</record>
<!-- Sequences for university.student -->
<record id="seq_students" model="ir.sequence">
<field name="name">Student</field>
<field name="code">university.student</field>
<field name="prefix"/>
<field name="padding">4</field>
<field name="company_id" eval="False"/>
</record>
</data>
</odoo>

285
education_university_management/data/mail_template_data.xml

@ -0,0 +1,285 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- This file is used for updating signup mail template for students also -->
<function name="write" model="ir.model.data">
<function name="search" model="ir.model.data">
<value eval="[('name', '=', 'set_password_email'), ('module', '=', 'auth_signup')]"/>
</function>
<value eval="{'noupdate': False}"/>
</function>
<record id="auth_signup.set_password_email" model="mail.template">
<field name="body_html" type="html">
<table border="0" cellpadding="0" cellspacing="0"
style="padding-top: 16px; background-color: #FFFFFF; font-family:Verdana, Arial,sans-serif; color: #454748; width: 100%; border-collapse:separate;">
<tr>
<td align="center">
<table border="0" cellpadding="0" cellspacing="0"
width="590"
style="padding: 16px; background-color: #FFFFFF; color: #454748; border-collapse:separate;">
<tbody>
<!-- HEADER -->
<tr>
<td align="center"
style="min-width: 590px;">
<table border="0" cellpadding="0"
cellspacing="0" width="590"
style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
<tr>
<td valign="middle">
<span style="font-size: 10px;">
Welcome to Odoo
</span>
<br/>
<span style="font-size: 20px; font-weight: bold;">
<t t-out="object.name or ''">
Marc Demo
</t>
</span>
</td>
<td valign="middle"
align="right">
<img t-attf-src="/logo.png?company={{ object.company_id.id }}"
style="padding: 0px; margin: 0px; height: auto; width: 80px;"
t-att-alt="object.company_id.name"/>
</td>
</tr>
<tr>
<td colspan="2"
style="text-align:center;">
<hr width="100%"
style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;"/>
</td>
</tr>
</table>
</td>
</tr>
<!-- CONTENT -->
<tr>
<td align="center"
style="min-width: 590px;">
<table border="0" cellpadding="0"
cellspacing="0" width="590"
style="min-width: 590px; background-color: white; padding: 0px 8px 0px 8px; border-collapse:separate;">
<t t-if="object.partner_id.is_student">
<tr>
<td valign="top"
style="font-size: 13px;">
<div>
Dear <t
t-out="object.name or ''">
Marc Demo</t>,
<br/>
<br/>
You have been
invited by <t
t-out="object.create_uid.name or ''">
OdooBot
</t> to connect on Odoo
Student Portal.
<br/>
<br/>
<br/>
Your sign in email
is:
<b>
<a t-attf-href="/web/login?login={{ object.email }}"
target="_blank"
t-out="object.email or ''">
mark.brown23@example.com
</a>
</b>
<br/>
And click on the
button below to
pick
a password and
activate your
account.
<br/>
<br/>
<center>
<div style="margin: 16px 0px 16px 0px;align:center">
<a t-att-href="object.signup_url"
style="background-color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; border-radius: 5px; font-size:13px;">
Login
</a>
</div>
</center>
<br/>
<br/>
Enjoy Odoo!
<br/>
--<br/>The <t
t-out="object.company_id.name or ''">
YourCompany
</t> Team
</div>
</td>
</tr>
</t>
<t t-else="">
<tr>
<td valign="top"
style="font-size: 13px;">
<div>
Dear <t
t-out="object.name or ''">
Marc Demo</t>,
<br/>
<br/>
You have been
invited by <t
t-out="object.create_uid.name or ''">
OdooBot
</t> of <t
t-out="object.company_id.name or ''">
YourCompany
</t> to connect on
Odoo.
<div style="margin: 16px 0px 16px 0px;">
<a t-att-href="object.signup_url"
style="background-color: #875A7B; padding: 8px 16px 8px 16px; text-decoration: none; color: #fff; border-radius: 5px; font-size:13px;">
Accept
invitation
</a>
</div>
<t t-set="website_url"
t-value="object.get_base_url()">
</t>
Your Odoo domain
is:
<b>
<a t-att-href='website_url'
t-out="website_url or ''">
http://yourcompany.odoo.com
</a>
</b>
<br/>
Your sign in email
is:
<b>
<a t-attf-href="/web/login?login={{ object.email }}"
target="_blank"
t-out="object.email or ''">
mark.brown23@example.com
</a>
</b>
<br/>
<br/>
Never heard of
Odoo?
It’s an all-in-one
business software
loved by 7+ million
users. It will
considerably
improve
your experience at
work and increase
your productivity.
<br/>
<br/>
Have a look at the <a
href="https://www.odoo.com/page/tour?utm_source=db&amp;utm_medium=auth"
style="color: #875A7B;">
Odoo Tour
</a> to discover the
tool.
<br/>
<br/>
Enjoy Odoo!
<br/>
--<br/>The <t
t-out="object.company_id.name or ''">
YourCompany
</t> Team
</div>
</td>
</tr>
</t>
<tr>
<td style="text-align:center;">
<hr width="100%"
style="background-color:rgb(204,204,204);border:medium none;clear:both;display:block;font-size:0px;min-height:1px;line-height:0; margin: 16px 0px 16px 0px;"/>
</td>
</tr>
</table>
</td>
</tr>
<!-- FOOTER -->
<tr>
<td align="center"
style="min-width: 590px;">
<table border="0" cellpadding="0"
cellspacing="0" width="590"
style="min-width: 590px; background-color: white; font-size: 11px; padding: 0px 8px 0px 8px; border-collapse:separate;">
<tr>
<td valign="middle"
align="left">
<t t-out="object.company_id.name or ''">
YourCompany
</t>
</td>
</tr>
<tr>
<td valign="middle"
align="left"
style="opacity: 0.7;">
<t t-out="object.company_id.phone or ''">
+1 650-123-4567
</t>
<t t-if="object.company_id.email">
|
<a t-att-href="'mailto:%s' % object.company_id.email"
style="text-decoration:none; color: #454748;"
t-out="object.company_id.email or ''">
info@yourcompany.com
</a>
</t>
<t t-if="object.company_id.website">
|
<a t-att-href="'%s' % object.company_id.website"
style="text-decoration:none; color: #454748;"
t-out="object.company_id.website or ''">
http://www.example.com
</a>
</t>
</td>
</tr>
</table>
</td>
</tr>
</tbody>
</table>
</td>
</tr>
<!-- POWERED BY -->
<tr>
<td align="center" style="min-width: 590px;">
<table border="0" cellpadding="0" cellspacing="0"
width="590"
style="min-width: 590px; background-color: #F1F1F1; color: #454748; padding: 8px; border-collapse:separate;">
<tr>
<td style="text-align: center; font-size: 13px;">
Powered by
<a target="_blank"
href="https://www.odoo.com?utm_source=db&amp;utm_medium=auth"
style="color: #875A7B;">Odoo
</a>
</td>
</tr>
</table>
</td>
</tr>
</table>
</field>
<field name="lang">{{ object.lang }}</field>
<field name="auto_delete" eval="True"/>
</record>
<function name="write" model="ir.model.data">
<function name="search" model="ir.model.data">
<value eval="[('name', '=', 'set_password_email'), ('module', '=', 'auth_signup')]"/>
</function>
<value eval="{'noupdate': True}"/>
</function>
</odoo>

12
education_university_management/data/online_application_menu_data.xml

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" ?>
<odoo>
<!-- This file is used for new website menu for online admission -->
<data noupdate="1">
<record id="apply_online_menu" model="website.menu">
<field name="name">University</field>
<field name="url">/university</field>
<field name="parent_id" ref="website.main_menu"/>
<field name="sequence" type="int">80</field>
</record>
</data>
</odoo>

202
education_university_management/demo/education_university_management_demo.xml

@ -0,0 +1,202 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!--Academic Year data-->
<record id="university_academic_year_data"
model="university.academic.year">
<field name="name">2022-2023</field>
<field name="start_date">2022-06-01</field>
<field name="end_date">2023-04-01</field>
<field name="is_active">1</field>
</record>
<!--Document type data 1-->
<record id="document_type_data" model="university.document.type">
<field name="name">TC</field>
<field name="description">Transfer Certificate</field>
</record>
<!--Document type data 2-->
<record id="document_type_data2" model="university.document.type">
<field name="name">Birth Certificate</field>
<field name="description">Birth Certificate of the student</field>
</record>
<!--Reject reason data-->
<record id="reject_reason_data" model="reject.reason">
<field name="name">Low Marks</field>
</record>
<!--University Course demo data 1-->
<record id="university_course_data1" model="university.course">
<field name="name">Degree</field>
<field name="category">ug</field>
<field name="no_semester">6</field>
</record>
<!--University Course demo data 2-->
<record id="university_course_data2" model="university.course">
<field name="name">BTech</field>
<field name="category">ug</field>
<field name="no_semester">8</field>
</record>
<!--University Department demo data 1-->
<record id="university_department_data1" model="university.department">
<field name="name">Computer Science</field>
<field name="code">CSE</field>
<field name="course_id" ref="university_course_data2"/>
</record>
<!--University Department demo data 2-->
<record id="university_department_data2" model="university.department">
<field name="name">Economics</field>
<field name="code">BA.ECO</field>
<field name="course_id" ref="university_course_data1"/>
</record>
<!--University Subjects demo data 1-->
<record id="university_subject_data1" model="university.subject">
<field name="name">English</field>
<field name="code">ENG</field>
<field name="type">compulsory</field>
<field name="is_language">1</field>
<field name="weightage">3</field>
</record>
<!--University Subjects demo data 2-->
<record id="university_subject_data2" model="university.subject">
<field name="name">Basics of Python</field>
<field name="code">PYTHON</field>
<field name="type">compulsory</field>
<field name="weightage">4</field>
</record>
<!--University Subjects demo data 3-->
<record id="university_subject_data3" model="university.subject">
<field name="name">Physics</field>
<field name="code">PHY</field>
<field name="type">compulsory</field>
<field name="weightage">4</field>
</record>
<!--University Subjects demo data 4-->
<record id="university_subject_data4" model="university.subject">
<field name="name">Chemistry</field>
<field name="code">CHE</field>
<field name="type">compulsory</field>
<field name="weightage">4</field>
</record>
<!--University Semester demo data 1-->
<record id="university_semester_data1" model="university.semester">
<field name="semester_no">6</field>
<field name="department_id" ref="university_department_data1"/>
</record>
<!--University Batch demo data-->
<record id="university_batch_data" model="university.batch">
<field name="semester_id" ref="university_semester_data1"/>
<field name="academic_year_id"
ref="university_academic_year_data"/>
<field name="batch_strength">30</field>
</record>
<!--University Timetable Period demo data 1-->
<record id="timetable_period_data1" model="timetable.period">
<field name="name">Period 1</field>
<field name="time_from">10.00</field>
<field name="time_to">11.00</field>
</record>
<!--University Timetable Period demo data 2-->
<record id="timetable_period_data2" model="timetable.period">
<field name="name">Period 2</field>
<field name="time_from">11.00</field>
<field name="time_to">12.00</field>
</record>
<!--University Faculty demo data 1-->
<record id="university_faculty_data1" model="university.faculty">
<field name="name">John</field>
<field name="last_name">Aryan</field>
<field name="date_of_birth">1993-02-25</field>
<field name="email">johnaryan@gmail.com</field>
<field name="mobile">+916745397801</field>
<field name="image" type="base64"
file="education_university_management/static/src/img/faculty1.jpeg"/>
</record>
<!--University Faculty demo data 2-->
<record id="university_faculty_data2" model="university.faculty">
<field name="name">Adams</field>
<field name="last_name">O</field>
<field name="date_of_birth">1993-02-25</field>
<field name="email">adams@gmail.com</field>
<field name="mobile">+919967934500</field>
<field name="image" type="base64"
file="education_university_management/static/src/img/faculty2.png"/>
</record>
<!-- Exam type demo data1 -->
<record id="university_exam_type_data1" model="university.exam.type">
<field name="name">First Internal</field>
<field name="exam_type">internal</field>
</record>
<!-- Exam type demo data2 -->
<record id="university_exam_type_data2" model="university.exam.type">
<field name="name">First Semester</field>
<field name="exam_type">sem</field>
</record>
<!-- University parent data1-->
<record id="university_parent_data1" model="res.partner">
<field name="name">Daniel George</field>
<field name="email">daniel@gmail.com</field>
<field name="is_parent" eval="True"/>
<field name="city">Banglore</field>
<field name="zip">530068</field>
<field name="country_id" ref="base.in"/>
<field name="street">560003 Majestic</field>
</record>
<!-- University parent data2-->
<record id="university_parent_data2" model="res.partner">
<field name="name">Joseph Alex</field>
<field name="email">joseph@cybrosys.com</field>
<field name="is_parent" eval="True"/>
<field name="city">Calicut</field>
<field name="zip">670645</field>
<field name="country_id" ref="base.in"/>
<field name="street">670645 Calicut</field>
</record>
<!--Student Application demo data1 -->
<record id="student_application_data" model="university.application">
<field name="name">John</field>
<field name="middle_name">Daniel</field>
<field name="last_name">Smith</field>
<field name="admission_date">2018-06-06 00:00:00</field>
<field name="course_id" ref="university_course_data1"/>
<field name="department_id" ref="university_department_data1"/>
<field name="semester_id" ref="university_semester_data1"/>
<field name="batch_id" ref="university_batch_data"/>
<field name="academic_year_id"
ref="university_academic_year_data"/>
<field name="father_name">Daniel George</field>
<field name="mother_name">Lissa Abraham</field>
<field name="guardian_id" ref="university_parent_data1"/>
<field name="date_of_birth">1994-11-11</field>
<field name="gender">male</field>
<field name="blood_group">a+</field>
<field name="street">Banglore</field>
<field name="is_same_address">1</field>
<field name="mobile">9998889988</field>
<field name="email">danielsmith@gmail.com</field>
<field name="image" type="base64"
file="education_university_management/static/src/img/student1.jpeg"/>
</record>
<!--Student Application demo data2 -->
<record id="student_application_data2" model="university.application">
<field name="name">Alana</field>
<field name="last_name">Joseph</field>
<field name="admission_date">2018-06-06 00:00:00</field>
<field name="course_id" ref="university_course_data1"/>
<field name="department_id" ref="university_department_data1"/>
<field name="semester_id" ref="university_semester_data1"/>
<field name="academic_year_id"
ref="university_academic_year_data"/>
<field name="father_name">Joseph Alex</field>
<field name="mother_name">Smitha</field>
<field name="guardian_id" ref="university_parent_data2"/>
<field name="date_of_birth">1994-11-11</field>
<field name="gender">female</field>
<field name="blood_group">o+</field>
<field name="street">Kochi</field>
<field name="is_same_address">1</field>
<field name="mobile">8936458900</field>
<field name="email">alana@gmail.com</field>
<field name="image" type="base64"
file="education_university_management/static/src/img/student2.jpeg"/>
</record>
</data>
</odoo>

6
education_university_management/doc/RELEASE_NOTES.md

@ -0,0 +1,6 @@
## Module <education_university_management>
#### 24.12.2024
#### Version 18.0.1.0.0
#### ADD
- Initial Commit University Education Management

53
education_university_management/models/__init__.py

@ -0,0 +1,53 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from . import account_journal
from . import account_move
from . import exam_result
from . import exam_subject_line
from . import exam_valuation
from . import exam_valuation_line
from . import fee_category
from . import fee_structure
from . import fee_structure_line
from . import fee_type
from . import reject_reason
from . import res_partner
from . import results_subject_line
from . import timetable_period
from . import timetable_schedule_line
from . import university_academic_year
from . import university_application
from . import university_attendance
from . import university_attendance_line
from . import university_batch
from . import university_course
from . import university_department
from . import university_document
from . import university_document_type
from . import university_exam
from . import university_exam_type
from . import university_faculty
from . import university_semester
from . import university_student
from . import university_subject
from . import university_syllabus
from . import university_timetable

32
education_university_management/models/account_journal.py

@ -0,0 +1,32 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class AccountJournal(models.Model):
"""Inherited account.journal model for adding a field to
determine the journal is fee journal or not"""
_inherit = 'account.journal'
is_fee = fields.Boolean('Is University fee?', default=False,
help="Enable if the journal for university "
"fee management")

113
education_university_management/models/account_move.py

@ -0,0 +1,113 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class AccountMove(models.Model):
"""Inheriting account move model for creating receipt for students fees"""
_inherit = 'account.move'
student_id = fields.Many2one('university.student',
string='Admission No',
help="Select student for creating fee "
"receipt")
student_name = fields.Char(string='Name',
help="Student name that your going to "
"make receipt", store=True,
related='student_id.partner_id.name')
semester_id = fields.Many2one(related='student_id.semester_id',
help="Semester of the student",
string='Semester')
batch_id = fields.Many2one(related='student_id.batch_id',
help="batch of the student", )
fee_structure_id = fields.Many2one('fee.structure',
help="Select a fee structure",
string='Fee Structure')
fee_structure_ids = fields.Many2many('fee.structure',
string="Fee Structure",
compute="_compute_fee_structure_ids",
help="Select a fee structure", )
is_fee = fields.Boolean(string='Is Fee', store=True, default=False,
help="To determine whether the account "
"move is for fee or not")
fee_category_id = fields.Many2one('fee.category',
help="Select a fee category",
string='Category')
partner_id = fields.Many2one(related='student_id.partner_id',
help="Set student partner in customer", )
journal_id = fields.Many2one(related='fee_category_id.journal_id',
help="Journal of the receipt")
@api.model_create_multi
def create(self, vals):
""" This method overrides the create method to add two fields to the
invoice: 'is_fee' and 'student_name'.The 'is_fee' field is used to
display fee items only in the fee tree view.
:param vals (dict): Dictionary containing the field values for the
new invoice record.
:returns class:`~account.move`: The created invoice record.
"""
partner = self.env['res.partner'].browse(vals[0].get('partner_id'))
if vals[0].get('fee_category_id'):
vals[0].update({
'is_fee': True,
'student_name': partner.name
})
res = super(AccountMove, self).create(vals)
return res
@api.onchange('fee_structure_id')
def _onchange_fee_structure_id(self):
"""Set default fee lines based on selected fee structure"""
lines = []
self.invoice_line_ids = False
for item in self:
for line in item.fee_structure_id.structure_line_ids:
name = line.fee_type_id.product_id.description_sale
if not name:
name = line.fee_type_id.product_id.name
fee_line = {
'price_unit': line.fee_amount,
'quantity': 1.00,
'product_id': line.fee_type_id.product_id,
'name': name,
'account_id': item.journal_id.default_account_id
}
lines.append((0, 0, fee_line))
item.invoice_line_ids = lines
@api.depends('fee_category_id')
def _compute_fee_structure_ids(self):
""" To find the fee structure in the selected category and assign them
to fee_structure_ids field for setting domain for
fee_category_id field """
for rec in self:
if rec.fee_category_id:
rec.fee_structure_ids = self.env['fee.structure'].search(
[('category_id', '=', rec.fee_category_id.id)]).ids
if not rec.fee_structure_ids:
raise ValidationError(
_("No Fee Structure found for selected Category, "
"Please choose another one"))
else:
rec.fee_structure_ids = False

83
education_university_management/models/exam_result.py

@ -0,0 +1,83 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class ExamResult(models.Model):
"""Creating a model for storing students exam result."""
_name = 'exam.result'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "Exam Result"
name = fields.Char(string='Name', help="Name of the exam result")
exam_id = fields.Many2one('university.exam', string='Exam',
help="Which exam does this result belong to")
batch_id = fields.Many2one('university.batch', string='Batch',
help="Which batch does this result belong to")
student_id = fields.Many2one('university.student',
string='Student', help="Result of student")
subject_line_ids = fields.One2many('results.subject.line',
'result_id',
help="Result of each subject in exam",
string='Subjects')
academic_year_id = fields.Many2one(related='batch_id.academic_year_id',
help="Academic year of the batch",
string='Academic Year')
company_id = fields.Many2one(
'res.company', string='Company', help="Which company's "
"result is",
default=lambda self: self.env.company)
total_pass_mark = fields.Float(string='Total Pass Mark', store=True,
help="Total mark to pass the exam",
readonly=True, compute='_total_marks_all')
total_max_mark = fields.Float(string='Total Max Mark', store=True,
help="Maximum mark of the exam",
readonly=True,
compute='_compute_total_marks')
total_mark_scored = fields.Float(string='Total Marks Scored', store=True,
help="Total mark scored by student",
readonly=True,
compute='_compute_total_marks')
is_overall_pass = fields.Boolean(string='Overall Pass/Fail', store=True,
help="Overall pass or fail ratio",
readonly=True,
compute='_compute_total_marks')
@api.depends('subject_line_ids.mark_scored')
def _compute_total_marks(self):
"""This method is for computing total mark scored and overall
pass details"""
for results in self:
total_pass_mark = 0
total_max_mark = 0
total_mark_scored = 0
is_overall_pass = True
for subjects in results.subject_line_ids:
total_pass_mark += subjects.pass_mark
total_max_mark += subjects.max_mark
total_mark_scored += subjects.mark_scored
if not subjects.is_pass:
is_overall_pass = False
results.total_pass_mark = total_pass_mark
results.total_max_mark = total_max_mark
results.total_mark_scored = total_mark_scored
results.is_overall_pass = is_overall_pass

44
education_university_management/models/exam_subject_line.py

@ -0,0 +1,44 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class ExamSubjectLine(models.Model):
"""For managing the subjects in the exam"""
_name = 'exam.subject.line'
_description = 'Subject Line of Exam'
subject_id = fields.Many2one('university.subject',
string='Subject', required=True,
help="Select subjects of exam")
date = fields.Date(string='Date', required=True,
help="Select date of the subject")
time_from = fields.Float(string='Time From', required=True,
help="Enter starting time of the subject")
time_to = fields.Float(string='Time To', required=True,
help="Enter ending time of the subject")
mark = fields.Integer(string='Mark', help="Enter mark for the subject")
exam_id = fields.Many2one('university.exam', string='Exam',
help="Relation to exam model")
company_id = fields.Many2one(
'res.company', string='Company', help="Company of the exam",
default=lambda self: self.env.company)

182
education_university_management/models/exam_valuation.py

@ -0,0 +1,182 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class ExamValuation(models.Model):
"""Used to manage the valuation of exams"""
_name = 'exam.valuation'
_description = "Exam Valuation"
_inherit = ['mail.thread', 'mail.activity.mixin']
name = fields.Char(string='Name', default='New', help="Name of the record")
exam_id = fields.Many2one('university.exam', string='Exam',
required=True, help="Select exam for valuation",
domain=[('state', '=', 'ongoing')])
batch_id = fields.Many2one(related='exam_id.batch_id', string='Batch',
help="Choose the batch that you want to"
" evaluate", required=True)
evaluator_id = fields.Many2one('university.faculty',
string='Evaluator',
help="Select a valuation evaluator")
mark = fields.Float(string='Max Mark',
help="Maximum mark of the selected subject",
required=True)
pass_mark = fields.Float(string='Pass Mark',
help="Mark needed to pass the exam ",
required=True)
state = fields.Selection([('draft', 'Draft'),
('completed', 'Completed'),
('cancel', 'Canceled')], default='draft',
help="Status of the valuation")
valuation_line_ids = fields.One2many('exam.valuation.line',
'valuation_id',
help="Students valuation details",
string='Students')
subject_id = fields.Many2one('university.subject',
string='Subject',
help="Choose subject of the exam for "
"valuation", required=True)
subject_ids = fields.Many2many('university.subject',
string="Subjects",
help="Subjects under the exam",
compute="_compute_subject_ids")
is_mark_sheet_created = fields.Boolean(string='Mark sheet Created',
help="Enable if a mark sheet for "
"the students in the batch is "
"created or not")
date = fields.Date(string='Date', default=fields.Date.today,
help="Date of the valuation")
academic_year_id = fields.Many2one(related='batch_id.academic_year_id',
string='Academic Year',
help="Academic year of the selected "
"batch")
company_id = fields.Many2one(
'res.company', string='Company',
help="Company of the valuation", default=lambda self: self.env.company)
def action_create_mark_sheet(self):
"""Button action for creating marksheet of students"""
students = self.batch_id.batch_student_ids
if len(students) < 1:
raise UserError(_('There are no students in this Batch'))
self.env['exam.valuation.line'].create(({'student_id': student.id,
'valuation_id': self.id,
}) for student in students)
self.is_mark_sheet_created = True
@api.model
def create(self, vals):
""" This method overrides the create method to check if the exam
valuation with respect to the subject and batch has already
been completed.
:param vals (dict): Dictionary containing the field values for
the new exam valuation record.
:returns class:`exam.valuation`The created exam valuation record.
:raises UserError: If a valuation sheet for the specified subject,
division, and exam already exists.
"""
res = super(ExamValuation, self).create(vals)
search_valuation = self.env['exam.valuation'].search(
[('exam_id', '=', res.exam_id.id),
('batch_id', '=', res.batch_id.id),
('subject_id', '=', res.subject_id.id),
('state', '!=', 'cancel')])
if len(search_valuation) > 1:
raise UserError(
_('Valuation Sheet for \n Subject --> %s \nDivision --> %s '
'\nExam --> %s \n is already created') % (
res.subject_id.name, res.batch_id.name,
res.exam_id.name))
return res
@api.depends('exam_id')
def _compute_subject_ids(self):
""" To find the subjects in the selected exam and assign them
to subject_ids field for setting domain for subject_id field.
"""
for rec in self:
rec.subject_ids = rec.exam_id.subject_line_ids.subject_id \
if rec.exam_id else False
def action_valuation_completed(self):
"""Method for completing the valuation and also creating the exam
result with the valuation line and verify whether or not the exam
with the subject and the student already exists; if not, a new exam
result will be created."""
self.name = str(self.exam_id.name)
result_obj = self.env['exam.result']
result_line_obj = self.env['results.subject.line']
for students in self.valuation_line_ids:
search_result = result_obj.search(
[('exam_id', '=', self.exam_id.id),
('batch_id', '=', self.batch_id.id),
('student_id', '=', students.student_id.id)])
if len(search_result) < 1:
result_data = {
'name': self.name,
'exam_id': self.exam_id.id,
'batch_id': self.batch_id.id,
'student_id': students.student_id.id,
}
result = result_obj.create(result_data)
result_line_data = {
'name': self.name,
'subject_id': self.subject_id.id,
'max_mark': self.mark,
'pass_mark': self.pass_mark,
'mark_scored': students.mark_scored,
'is_pass': students.is_pass,
'result_id': result.id,
}
result_line_obj.create(result_line_data)
else:
result_line_data = {
'subject_id': self.subject_id.id,
'max_mark': self.mark,
'pass_mark': self.pass_mark,
'mark_scored': students.mark_scored,
'is_pass': students.is_pass,
'result_id': search_result.id,
}
result_line_obj.create(result_line_data)
self.state = 'completed'
def action_set_to_draft(self):
"""Method to set the record to the draft stage,
and it will unlink all exam results with this valuation."""
for students in self.valuation_line_ids:
search_result = self.env['exam.result'].search(
[('exam_id', '=', self.exam_id.id),
('batch_id', '=', self.batch_id.id),
('student_id', '=', students.student_id.id)])
search_result_line = self.env['results.subject.line'].search(
[('result_id', '=', search_result.id),
('subject_id', '=', self.subject_id.id)])
search_result_line.unlink()
search_result.unlink()
self.state = 'draft'
def action_cancel_valuation(self):
"""Action to cancel the valuation"""
self.state = 'cancel'

50
education_university_management/models/exam_valuation_line.py

@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import UserError
class ExamValuationLine(models.Model):
"""Used to record the students pass mark details while valuing the exam"""
_name = 'exam.valuation.line'
_description = 'Exam Valuation Line'
student_id = fields.Many2one('university.student',
string='Students',
help="Students of batch")
mark_scored = fields.Float(string='Mark',
help="Scored mark of the student")
is_pass = fields.Boolean(string='Pass/Fail',
help="Enable if the student pass the exam",
default=False)
valuation_id = fields.Many2one('exam.valuation',
help="relation to exam valuation model",
string='Valuation Id')
@api.onchange('mark_scored', 'is_pass')
def _onchange_mark_scored(self):
"""to determine whether the scored mark exceeds the subject's
maximum mark and determine pass/fail depending on the scored mark."""
if self.mark_scored > self.valuation_id.mark:
raise UserError(_('Mark Scored must be less than Max Mark'))
self.is_pass = True if \
self.mark_scored >= self.valuation_id.pass_mark else False

40
education_university_management/models/fee_category.py

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class FeeCategory(models.Model):
"""For managing the categories for university fees"""
_name = 'fee.category'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "Categories of university fees"
name = fields.Char('Name', required=True,
help='Create a fee category suitable for institution.'
' Like Institutional, Hostel, Transportation, '
'Arts and Sports, etc')
journal_id = fields.Many2one('account.journal',
domain="[('is_fee', '=', 'True')]",
required=True, string='Journal',
help='Setting up of unique journal '
'for each category help to distinguish '
'account entries of each category ')

57
education_university_management/models/fee_structure.py

@ -0,0 +1,57 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class FeeStructure(models.Model):
"""Managing the fee structure for university students"""
_name = 'fee.structure'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "Fees structure of university"
name = fields.Char('Name', required=True,
help="Enter the name of fee structure")
currency_id = fields.Many2one('res.currency', string="Currency",
default=lambda
self: self.env.user.company_id.currency_id.id,
help="Currency of current company")
structure_line_ids = fields.One2many('fee.structure.line',
'fee_structure_id',
string='Fee Types',
help="Fee structure line")
description = fields.Text(string="Additional Information",
help="Any additional information about")
academic_year_id = fields.Many2one('university.academic.year',
help="Choose academic year",
string='Academic Year', required=True)
amount_total = fields.Float(string="Amount", currency_field='currency_id',
help="Total amount of the lines",
required=True, compute='_compute_total')
category_id = fields.Many2one('fee.category', string='Category',
help="Select th category for structure",
required=True)
@api.depends('structure_line_ids.fee_amount')
def _compute_total(self):
"""Method for computing total amount of the structure lines"""
self.amount_total = sum(
line.fee_amount for line in self.structure_line_ids)

50
education_university_management/models/fee_structure_line.py

@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class FeeStructureLines(models.Model):
_name = 'fee.structure.line'
_description = "Fee Structure lines"
fee_structure_id = fields.Many2one('fee.structure',
help="Relation to fee.structure",
string='Fee Structure',
ondelete='cascade', index=True)
category_id = fields.Many2one(related='fee_structure_id.category_id',
string="Category",
help="Fee category of structure")
fee_type_id = fields.Many2one('fee.type', string='Fee',
required=True, help="Select fee types")
currency_id = fields.Many2one('res.currency', string="Currency",
default=lambda
self: self.env.user.company_id.currency_id.id,
help="Currency of current company")
fee_amount = fields.Float('Amount', required=True,
help="Amount of the each fee type",
related='fee_type_id.lst_price')
payment_type = fields.Selection(string='Payment Type',
help="Payment type of fee type",
related="fee_type_id.payment_type")
fee_description = fields.Text('Description', help="Fee type "
"description",
related='fee_type_id.description_sale')

49
education_university_management/models/fee_type.py

@ -0,0 +1,49 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class FeeTypes(models.Model):
"""For managing payment method or type of student fees"""
_name = 'fee.type'
_inherit = ['mail.thread', 'mail.activity.mixin']
_inherits = {'product.product': 'product_id'}
_description = 'University fees'
payment_type = fields.Selection([
('onetime', 'One Time'),
('permonth', 'Per Month'),
('peryear', 'Per Year'),
('sixmonth', '6 Months'),
('threemonth', '3 Months')],
string='Payment Type', default='permonth',
help='Payment type describe how much a payment effective')
category_id = fields.Many2one('fee.category', string='Category',
help="Category of fee types",
required=True)
currency_id = fields.Many2one('res.currency', string="Currency",
default=lambda
self: self.env.user.company_id.currency_id.id,
help="Currency of current company")
product_id = fields.Many2one('product.product',
string='Product', required=True,
ondelete='cascade')

30
education_university_management/models/reject_reason.py

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class RejectReason(models.Model):
"""For managing rejection reasons for an application"""
_name = 'reject.reason'
_description = "Application reject reasons"
name = fields.Char(string="Name", help="Reject Reasons of application")

33
education_university_management/models/res_partner.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class ResPartner(models.Model):
"""Inherited model for adding two fields to determine
whether the partner student or parent"""
_inherit = 'res.partner'
is_student = fields.Boolean(string="Is a Student",
help="Enable if the partner is a student")
is_parent = fields.Boolean(string="Is a Parent",
help="Enable if the partner is a parent")

43
education_university_management/models/results_subject_line.py

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class ResultsSubjectLine(models.Model):
"""Used to manage subject details of student exam result"""
_name = 'results.subject.line'
_description = 'Results Subject Line'
name = fields.Char(string='Name', help="Name of the result")
subject_id = fields.Many2one('university.subject',
string='Subject',
help="Subjects of the exam")
max_mark = fields.Float(string='Max Mark', help="Maximum mark of subject")
pass_mark = fields.Float(string='Pass Mark',
help="Pass mark of the subject")
mark_scored = fields.Float(string='Mark Scored',
help="Marks scored by the students in subjects")
is_pass = fields.Boolean(string='Pass/Fail',
help="Enable if the student "
"pass the subject")
result_id = fields.Many2one('exam.result', string='Result Id',
help="Relation to result model")

38
education_university_management/models/timetable_period.py

@ -0,0 +1,38 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class TimetablePeriod(models.Model):
"""Manages the period details """
_name = 'timetable.period'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = 'Timetable Period'
name = fields.Char(string="Name", required=True, help="Enter Period Name")
time_from = fields.Float(string='From', required=True,
help="Start and End time of Period.")
time_to = fields.Float(string='To', required=True,
help="Start and End time of Period.")
company_id = fields.Many2one(
'res.company', string='Company', help="Current company",
default=lambda self: self.env.company)

71
education_university_management/models/timetable_schedule_line.py

@ -0,0 +1,71 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class TimeTableScheduleLine(models.Model):
""" Manages the schedule for subjects and faculty while
creating timetable"""
_name = 'timetable.schedule.line'
_description = 'Timetable Schedule'
_rec_name = 'period_id'
period_id = fields.Many2one('timetable.period',
string="Period", required=True,
help="select period")
faculty_id = fields.Many2one('university.faculty',
string='Faculty', required=True,
help="Set faculty who is taking ")
time_from = fields.Float(string='From', related='period_id.time_from',
readonly=False,
help="Start and End time of Period.")
time_till = fields.Float(string='Till', related='period_id.time_to',
readonly=False,
help="Start and End time of Period.")
subject_id = fields.Many2one('university.subject',
string='Subjects', required=True,
help="Select the subject to schedule timetable")
week_day = fields.Selection([
('0', 'Monday'),
('1', 'Tuesday'),
('2', 'Wednesday'),
('3', 'Thursday'),
('4', 'Friday'),
('5', 'Saturday'),
('6', 'Sunday'),
], string='Week', required=True, help="Select week for scheduling period")
timetable_id = fields.Many2one('university.timetable',
required=True, string="Timetable",
help="Relation to university.timetable")
batch_id = fields.Many2one('university.batch', string='Batch',
help="Batch")
@api.model
def create(self, vals):
""" This method overrides the create method to automatically store
:param vals (dict): Dictionary containing the field values for the
new timetable schedule line.
:returns class:`timetable.schedule.line`The created timetable
schedule line record. """
res = super(TimeTableScheduleLine, self).create(vals)
res.batch_id = res.timetable_id.batch_id.id
return res

39
education_university_management/models/university_academic_year.py

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversityAcademicYear(models.Model):
"""For managing university academic year"""
_name = 'university.academic.year'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Academic Year"
name = fields.Char(string="Name", help="Name of the academic year")
start_date = fields.Date(string="Start Date", required=True,
help="Enter the start date of the academic year")
end_date = fields.Date(string="End Date", required=True,
help="Enter the end date of the academic year")
is_active = fields.Boolean(
'Active', default=True,
help="If unchecked, it will allow you to hide the Academic "
"Year without removing it.")

353
education_university_management/models/university_application.py

@ -0,0 +1,353 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class UniversityApplication(models.Model):
""" For managing student applications to the courses of the university"""
_name = 'university.application'
_inherit = ['mail.thread']
_description = 'Applications for the admission'
@api.model
def create(self, vals):
"""Overriding the create method and assigning
the sequence for the record"""
if vals.get('application_no', _('New')) == _('New'):
vals['application_no'] = self.env['ir.sequence'].next_by_code(
'university.application') or _('New')
res = super(UniversityApplication, self).create(vals)
return res
name = fields.Char(string='Name', required=True,
help="Enter First name of Student")
middle_name = fields.Char(string='Middle Name',
help="Enter Middle name of Student")
last_name = fields.Char(string='Last Name',
help="Enter Last name of Student")
image = fields.Binary(string='Image',
attachment=True,
help="Provide the image of the Student")
academic_year_id = fields.Many2one(
'university.academic.year',
string='Academic Year',
help="Choose Academic year for which the admission is choosing")
course_id = fields.Many2one(
'university.course', string="Course",
required=True,
help="Enter Course to which the admission is seeking")
department_ids = fields.Many2many(
'university.department', string="Department",
compute="_compute_department_ids",
help="Enter department to which the admission is seeking")
department_id = fields.Many2one(
'university.department', string="Department",
required=True,
help="Enter department to which the admission is seeking")
semester_ids = fields.Many2many('university.semester',
string="Semester",
compute="_compute_semester_ids",
help="Enter semester to which the "
"admission is seeking")
semester_id = fields.Many2one('university.semester',
string="Semester", required=True,
help="Enter semester to which the admission "
"is seeking")
batch_ids = fields.Many2many('university.batch',
string="Batch", compute="_compute_batch_ids",
help="Enter batch to which the "
"admission is seeking")
batch_id = fields.Many2one('university.batch', string="Batch",
help="Enter batch to which the "
"admission is seeking")
admission_date = fields.Datetime('Admission Date',
help="Admission Taken date",
default=fields.Datetime.now,
required=True)
application_no = fields.Char(string='Application No',
help="Application number of new admission",
readonly=True, default=lambda self: _('New'))
company_id = fields.Many2one('res.company', string='Company',
help="Company of the application",
default=lambda self: self.env.user.company_id)
email = fields.Char(string="Email", required=True,
help="Enter E-mail id for contact purpose")
phone = fields.Char(string="Phone",
help="Enter Phone no. for contact purpose")
mobile = fields.Char(string="Mobile", required=True,
help="Enter Mobile num for contact purpose")
nationality_id = fields.Many2one('res.country',
string='Nationality', ondelete='restrict',
help="Select the Nationality")
mother_tongue = fields.Char(string="Mother Tongue",
help="Enter Student's Mother Tongue")
religion = fields.Char(string="Religion",
help="My Religion is ")
caste = fields.Char(string="Caste",
help="My Caste is ")
street = fields.Char(string='Street', help="Enter the street")
street2 = fields.Char(string='Street2', help="Enter the street2")
zip = fields.Char(change_default=True, string='ZIP code',
help="Enter the Zip Code")
city = fields.Char(string='City', help="Enter the City name")
state_id = fields.Many2one("res.country.state", string='State',
ondelete='restrict',
help="Select the State where you are from")
country_id = fields.Many2one('res.country', string='Country',
ondelete='restrict',
help="Select the Country")
is_same_address = fields.Boolean(
string="Permanent Address same as above",
default=True,
help="Tick the field if the Present and permanent address is same")
per_street = fields.Char(string='Street', help="Enter the street")
per_street2 = fields.Char(string='Street2', help="Enter the street2")
per_zip = fields.Char(change_default=True, string='ZIP code',
help="Enter the Zip Code")
per_city = fields.Char(string='City', help="Enter the City name")
per_state_id = fields.Many2one("res.country.state",
string='State', ondelete='restrict',
help="Select the State where you are from")
per_country_id = fields.Many2one('res.country',
string='Country', ondelete='restrict',
help="Select the Country")
date_of_birth = fields.Date(string="Date of Birth", required=True,
help="Enter your DOB")
guardian_id = fields.Many2one('res.partner', string="Guardian",
domain=[('is_parent', '=', True)],
required=True,
help="Tell us who will take care of you")
description = fields.Text(string="Note",
help="Description about the application")
father_name = fields.Char(string="Father", help="My father is")
mother_name = fields.Char(string="Mother", help="My mother's name is")
active = fields.Boolean(string='Active', default=True,
help="Is the application is active or not")
document_count = fields.Integer(compute='_compute_document_count',
string='# Documents',
help="Number of documents of application")
verified_by_id = fields.Many2one('res.users',
string='Verified by',
help="The Document is verified by")
reject_reason_id = fields.Many2one('reject.reason',
string='Reject Reason',
help="Application is rejected because")
gender = fields.Selection(
[('male', 'Male'), ('female', 'Female'), ('other', 'Other')],
string='Gender', required=True, default='male',
track_visibility='onchange',
help="Your Gender is")
blood_group = fields.Selection(
[('a+', 'A+'), ('a-', 'A-'), ('b+', 'B+'), ('o+', 'O+'),
('o-', 'O-'), ('ab-', 'AB-'), ('ab+', 'AB+')], string='Blood Group',
required=True, default='a+', track_visibility='onchange',
help="Your Blood Group is")
state = fields.Selection([('draft', 'Draft'),
('verification', 'Verify'),
('approve', 'Approve'), ('reject', 'Rejected'),
('done', 'Done')], string='State', required=True,
default='draft', track_visibility='onchange',
help="Status of the application")
prev_institute = fields.Char('Previous Institute',
help="Previously studied institution",)
prev_course = fields.Char('Previous Course',
help="Previously studied course")
prev_result = fields.Char('Previous Result',
help="Previously studied institution")
def _compute_document_count(self):
"""Return the count of the documents provided"""
for rec in self:
rec.document_count = self.env['university.document'].search_count(
[('application_ref_id', '=', rec.id)])
def action_document_view(self):
""" smart button action of viewing list of documents of application
:return dict: the list of documents view
"""
return {
'name': _('Documents'),
'domain': [('application_ref_id', '=', self.id)],
'res_model': 'university.document',
'type': 'ir.actions.act_window',
'view_id': False,
'view_mode': 'list,form',
'context': {'default_application_ref_id': self.id}
}
def action_send_verification(self):
"""Button action for sending the application for the verification"""
for rec in self:
if not self.env['university.document'].search(
[('application_ref_id', '=', rec.id)]):
raise ValidationError(_('No Documents provided'))
rec.write({
'state': 'verification'
})
def action_verify_application(self):
""" This method checks the status of documents related to the student
application. If no documents are provided or if the provided
documents are not in the 'done' state, it raises a validation error
Otherwise, it updates the verification status of the application
and approves it.
:raises ValidationError: If all documents are not verified or no
documents are provided.
"""
for rec in self:
doc_status = self.env['university.document'].search(
[('application_ref_id', '=', rec.id)]).mapped('state')
if doc_status:
if all(state in 'done' for state in doc_status):
rec.write({
'verified_by_id': self.env.uid,
'state': 'approve'
})
else:
raise ValidationError(
_('All Documents are not Verified Yet, '
'Please complete the verification'))
else:
raise ValidationError(_('No Documents provided'))
def action_reject(self):
"""This method updates the state of the student application to 'reject',
indicating that the application has been rejected for admission.
"""
for rec in self:
rec.write({
'state': 'reject'
})
def action_create_student(self):
""" This method creates a new student record using the data from the
application.It populates the student record with the relevant
information. It also assigns a user login for the student.
:returns dict: A dictionary containing the information required
to open the student form view."""
for rec in self:
values = {
'name': rec.name,
'last_name': rec.last_name,
'middle_name': rec.middle_name,
'application_id': rec.id,
'father_name': rec.father_name,
'mother_name': rec.mother_name,
'guardian_id': rec.guardian_id.id,
'street': rec.street,
'street2': rec.street2,
'city': rec.city,
'state_id': rec.state_id.id,
'country_id': rec.country_id.id,
'zip': rec.zip,
'is_same_address': rec.is_same_address,
'per_street': rec.per_street,
'per_street2': rec.per_street2,
'per_city': rec.per_city,
'per_state_id': rec.per_state_id.id,
'per_country_id': rec.per_country_id.id,
'per_zip': rec.per_zip,
'gender': rec.gender,
'date_of_birth': rec.date_of_birth,
'blood_group': rec.blood_group,
'nationality_id': rec.nationality_id.id,
'email': rec.email,
'mobile': rec.mobile,
'phone': rec.phone,
'image_1920': rec.image,
'is_student': True,
'religion': rec.religion,
'caste': rec.caste,
'mother_tongue': rec.mother_tongue,
'semester_id': rec.semester_id.id,
'academic_year_id': rec.academic_year_id.id,
'company_id': rec.company_id.id,
'batch_id': rec.batch_id.id,
}
if not rec.is_same_address:
pass
else:
values.update({
'per_street': rec.street,
'per_street2': rec.street2,
'per_city': rec.city,
'per_state_id': rec.state_id.id,
'per_country_id': rec.country_id.id,
'per_zip': rec.zip,
})
student = self.env['university.student'].create(values)
student.user_id = self.env['res.users'].create({
'name': student.name,
'login': student.email,
'groups_id': [(6, 0, [self.env.ref('base.group_portal').id])]
})
rec.write({
'state': 'done'
})
return {
'name': _('Student'),
'view_mode': 'form',
'res_model': 'university.student',
'type': 'ir.actions.act_window',
'res_id': student.id,
'context': self.env.context
}
@api.depends('course_id')
def _compute_department_ids(self):
""" To find the departments in the selected course and assign them
to department_ids field for setting domain for department_id field
"""
for rec in self:
rec.department_ids = self.env['university.department'].search(
[('course_id', '=',
self.course_id.id)]).ids if rec.course_id else False
@api.depends('department_id')
def _compute_semester_ids(self):
""" To find the semester in the selected department and assign them
to semester_ids field for setting domain for semester_id field"""
for rec in self:
rec.semester_ids = self.env['university.semester'].search(
[('department_id', '=',
self.department_id.id)]).ids if rec.department_id else False
@api.depends('semester_id')
def _compute_batch_ids(self):
""" To find the batch in the selected semester and assign them
to batch_ids field."""
for rec in self:
rec.batch_ids = self.env['university.batch'].search(
[('semester_id', '=',
self.semester_id.id)]).ids if rec.semester_id else False
@api.onchange('date_of_birth')
def _onchange_date_of_birth(self):
""" It checks if the provided date of birth makes the person under
18 years old.
:raises ValidationError: If the person is under 18."""
if self.date_of_birth:
if (fields.date.today().year - self.date_of_birth.year) < 18:
raise ValidationError(_('Please provide valid date of birth'))

119
education_university_management/models/university_attendance.py

@ -0,0 +1,119 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import UserError, ValidationError
class UniversityAttendance(models.Model):
"""For managing student daily attendance details"""
_name = 'university.attendance'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Student attendance"
name = fields.Char(string="Name", default="New",
help="Name of the attendance")
batch_id = fields.Many2one('university.batch', string="Batch",
required=True,
help="Select batch for the attendance")
faculty_id = fields.Many2one(related='batch_id.faculty_id',
string="Faculty",
help="Faculty in charge for the batch")
date = fields.Date(string="Date", default=fields.Date.today, required=True,
help="Select date of attendance")
attendance_line_ids = fields.One2many('university.attendance.line',
'attendance_id',
string='Attendance Line',
help="Students attendance "
"list/attendance line")
state = fields.Selection([('draft', 'Draft'), ('done', 'Done')],
default='draft', help="Status of attendance")
is_all_marked_morning = fields.Boolean(
string='All students are present in the morning',
help="Is all student present in the morning")
is_all_marked_afternoon = fields.Boolean(
string='All students are present in the afternoon',
help="Is all student present in the afternoon")
is_attendance_created = fields.Boolean(string='Attendance Created',
help="Is Attendance created or not")
@api.onchange('batch_id')
def _onchange_batch_id(self):
""" Method to clear the attendance line if the batch is changed """
if self.batch_id:
self.is_attendance_created = False
self.attendance_line_ids = False
def action_create_attendance_line(self):
"""Action to create attendance line with students in the batch"""
if self.search_count(
[('batch_id', '=', self.batch_id.id), ('date', '=', self.date),
('state', '=', 'done')]) == 1:
raise ValidationError(
_('Attendance for this batch on this date already exists.'))
self.name = str(self.date)
if len(self.batch_id.batch_student_ids) < 1:
raise UserError(_('There are no students in this Batch'))
for student in self.batch_id.batch_student_ids:
self.env['university.attendance.line'].create(
{'name': self.name,
'attendance_id': self.id,
'student_id': student.id,
'batch_id': self.batch_id.id,
'date': self.date, })
self.is_attendance_created = True
def action_mark_all_present_morning(self):
"""Action to mark all marked presents of students in the morning"""
for records in self.attendance_line_ids:
records.is_present_morning = True
self.is_all_marked_morning = True
def action_un_mark_all_present_morning(self):
"""Action to unmark all marked presents of students in the morning"""
for records in self.attendance_line_ids:
records.is_present_morning = False
self.is_all_marked_morning = False
def action_mark_all_present_afternoon(self):
"""Action to mark all marked presents of students in the afternoon"""
for records in self.attendance_line_ids:
records.is_present_afternoon = True
self.is_all_marked_afternoon = True
def action_un_mark_all_present_afternoon(self):
"""Action to unmark all marked presents of students in the afternoon"""
for records in self.attendance_line_ids:
records.is_present_afternoon = False
self.is_all_marked_afternoon = False
def action_attendance_done(self):
"""To compute absent of student is half/full day and
make the attendance to done stage"""
for records in self.attendance_line_ids:
if not records.is_present_morning and \
not records.is_present_afternoon:
records.full_day_absent = 1
elif not records.is_present_morning:
records.half_day_absent = 1
elif not records.is_present_afternoon:
records.half_day_absent = 1
self.state = 'done'

51
education_university_management/models/university_attendance_line.py

@ -0,0 +1,51 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversityAttendanceLine(models.Model):
"""For recording if the student is present during the day or not."""
_name = 'university.attendance.line'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = 'Attendance Lines'
name = fields.Char(string='Name', help="Name of the attendance")
attendance_id = fields.Many2one('university.attendance',
string='Attendance Id',
help="Relation field to attendance module")
student_id = fields.Many2one('university.student',
string='Student',
help="Students of the batch")
is_present_morning = fields.Boolean(string='Morning',
help="Is student is present in the "
"morning")
is_present_afternoon = fields.Boolean(string='After Noon',
help="Is student is present in "
"the afternoon")
full_day_absent = fields.Integer(string='Full Day',
help="Is student full day absent or not ")
half_day_absent = fields.Integer(string='Half Day',
help="Is student half day absent or not ")
batch_id = fields.Many2one('university.batch', string="Batch",
required=True,
help="Select batch for the attendance")
date = fields.Date(string='Date', required=True, help="Attendance date")

60
education_university_management/models/university_batch.py

@ -0,0 +1,60 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class UniversityBatch(models.Model):
"""For managing batches of every department in the university"""
_name = 'university.batch'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Batches"
@api.model
def create(self, vals):
"""Return the name as a str of semester + academic year"""
semester_id = self.env['university.semester'].browse(
vals['semester_id'])
academic_year_id = self.env['university.academic.year'].browse(
vals['academic_year_id'])
name = str(semester_id.name + ' - ' + academic_year_id.name)
vals['name'] = name
return super(UniversityBatch, self).create(vals)
name = fields.Char(string="Name", help="Name of the Batch", readonly=True)
semester_id = fields.Many2one('university.semester',
string="Semester", required=True,
help="Select the semester")
department_id = fields.Many2one(related='semester_id.department_id',
string="Department",
help="In which department this "
"batch belongs to")
academic_year_id = fields.Many2one('university.academic.year',
string="Academic Year", required=True,
help="Select the academic year")
batch_strength = fields.Integer(string='Batch Strength',
help="Total strength of the batch")
faculty_id = fields.Many2one('university.faculty',
string='Faculty', help="Batch tutor/Faculty")
batch_student_ids = fields.One2many('university.student',
'batch_id',
string="Students",
help="Students of this Batch")

36
education_university_management/models/university_course.py

@ -0,0 +1,36 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversityCourse(models.Model):
"""Used to managing the courses of university"""
_name = 'university.course'
_description = "University Courses"
name = fields.Char(string="Name", required=True, help="Name of the course")
category = fields.Selection(
[('ug', 'Under Graduation'), ('pg', 'Post Graduation'),
('diploma', 'Diploma')], string="Course Category", required=True,
help="In which category the course belong")
no_semester = fields.Integer(string="No.of Semester",
help="No.of semesters in each course")

39
education_university_management/models/university_department.py

@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversityDepartment(models.Model):
"""Used to manage department of every courses"""
_name = 'university.department'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Department"
name = fields.Char(string="Name", help="Name of the course")
code = fields.Char(string="Code", help="Code of the course", required=True)
course_id = fields.Many2one('university.course',
string="Course", required=True,
help="In what course the department belongs")
semester_ids = fields.One2many('university.semester',
'department_id',
string="Semester", required=1,
help="List of semesters under every course")

94
education_university_management/models/university_document.py

@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
class UniversityDocuments(models.Model):
"""For managing the student document verification details"""
_name = 'university.document'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "Students Documents"
name = fields.Char(string="Reference No.", copy=False,
help="Sequence of the document",
default=lambda self: _('New'))
document_type_id = fields.Many2one('university.document.type',
string="Document Type", required=True,
help="Choose the type of document")
application_ref_id = fields.Many2one('university.application',
string="Application Ref.",
help="Application reference of "
"document")
description = fields.Text(string='Description',
help="Enter a description about the document")
verified_date = fields.Date(string="Verified Date",
help="Date at the verification is done")
verified_by_id = fields.Many2one('res.users',
string='Verified by',
help="Document Verified user")
responsible_verified_id = fields.Many2one('hr.employee',
string="Responsible",
help="Responsible person for "
"verification")
attachment_ids = fields.Many2many(
'ir.attachment', 'university_attach_rel',
'doc_id', 'doc_attach_id',
string="Attachment", required=True,
help='You can attach the copy of your document',
copy=False)
state = fields.Selection(
[('draft', 'Draft'), ('correction', 'Correction'),
('done', 'Done')], string='State', required=True, default='draft',
help="Status of document", track_visibility='onchange')
@api.model
def create(self, vals):
""" This method overrides the create method to assign a sequence to
newly created records.
:param vals (dict): Dictionary containing the field values
for the new university document record.
:returns class:`~university.documents`: The created university
document record. """
if vals.get('name', _('New')) == _('New'):
vals['name'] = self.env['ir.sequence'].next_by_code(
'university.document') or _('New')
res = super(UniversityDocuments, self).create(vals)
return res
def action_verify_document(self):
""" This method updates the state of the university document to 'done'
if the documents are deemed perfect."""
for rec in self:
rec.write({
'verified_by_id': self.env.uid,
'verified_date': fields.Datetime.now().strftime("%Y-%m-%d"),
'state': 'done'
})
def action_need_correction(self):
""" This method updates the state of the university document to
'correction' if the documents are deemed not perfect and
require correction."""
for rec in self:
rec.write({
'state': 'correction'
})

33
education_university_management/models/university_document_type.py

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversityDocumentType(models.Model):
"""For managing document types in the document"""
_name = 'university.document.type'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Document Type"
name = fields.Char(string="Name", help="Name of the document type")
description = fields.Char(string="Description",
help="Description about type")

88
education_university_management/models/university_exam.py

@ -0,0 +1,88 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import UserError, ValidationError
class UniversityExam(models.Model):
"""Used to manage student exams of every semester"""
_name = 'university.exam'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Student Exam management"
name = fields.Char(string='Name', default='New', help="Name of the exam")
batch_id = fields.Many2one('university.batch', string='Batch',
help="Which batch's exam is")
exam_type_id = fields.Many2one('university.exam.type',
string='Type', help="Type of exam",
required=True)
start_date = fields.Date(string='Start Date', required=True,
help="Enter start date of the exam")
end_date = fields.Date(string='End Date', required=True,
help="Enter end date of the exam")
subject_line_ids = fields.One2many('exam.subject.line',
'exam_id', string='Subjects',
help="Subjects of the exam")
state = fields.Selection(
[('draft', 'Draft'),
('ongoing', 'On Going'),
('close', 'Closed'),
('cancel', 'Canceled')],
default='draft', help="Status of the exam")
academic_year_id = fields.Many2one(related='batch_id.academic_year_id',
string='Academic Year',
help="Academic year of batch")
company_id = fields.Many2one(
'res.company', string='Company', help="Company of the exam",
default=lambda self: self.env.company)
@api.constrains('start_date', 'end_date')
def check_dates(self):
""" This constraint method validates that the start date of the exam is
earlier than the end date.
:raises ValidationError: If the start date is greater than the
end date"""
for rec in self:
if rec.start_date > rec.end_date:
raise ValidationError(
_("Start date must be Anterior to end date"))
def action_close_exam(self):
""" This method sets the state of the exam to 'close',
indicating that the exam has been closed."""
self.state = 'close'
def action_cancel_exam(self):
""" This method sets the state of the exam to 'cancel',
indicating that the exam has been canceled."""
self.state = 'cancel'
def action_confirm_exam(self):
""" This method confirms the exam and checks if at least
one subject is added to the exam.
:raises UserError: If no subjects are added to the exam."""
if len(self.subject_line_ids) < 1:
raise UserError(_('Please Add Subjects'))
self.name = str(self.exam_type_id.name) + '/' + str(self.start_date)[
0:10] + ' (' + str(
self.batch_id.name) + ')'
self.state = 'ongoing'

40
education_university_management/models/university_exam_type.py

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversityExamType(models.Model):
"""For managing type of exams such as internal or semester"""
_name = 'university.exam.type'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = 'University Exam Type'
name = fields.Char(string='Name', required=True,
help="Name of the exam type")
exam_type = fields.Selection(
[('internal', 'Internal'), ('sem', 'Semester')],
string='Exam Type', default='internal',
help="Select exam type for exams")
company_id = fields.Many2one(
'res.company', string='Company', help="Company of the "
"exam type",
default=lambda self: self.env.company)

78
education_university_management/models/university_faculty.py

@ -0,0 +1,78 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversityFaculty(models.Model):
"""For managing faculties of university"""
_name = 'university.faculty'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Faculty records"
name = fields.Char(string='Name', required=True,
help="Enter the first name")
last_name = fields.Char(string='Last Name', help="Enter the last name")
image = fields.Binary(string="Image", attachment=True,
help="Image of the faculty")
date_of_birth = fields.Date(string="Date of Birth", required=True,
help="Enter the DOB")
email = fields.Char(string="Email", required=True,
help="Enter the Email for contact purpose")
phone = fields.Char(string="Phone",
help="Enter the Phone for contact purpose")
mobile = fields.Char(string="Mobile", required=True,
help="Enter the Mobile for contact purpose")
guardian_id = fields.Char(string="Guardian", help="Your guardian is ")
father_name = fields.Char(string="Father", help="Your Father name is ")
mother_name = fields.Char(string="Mother", help="Your Mother name is ")
degree_id = fields.Many2one('hr.recruitment.degree',
string="Degree",
Help="Select your Highest degree")
subject_line_ids = fields.Many2many('university.subject',
string='Subject Lines',
help="Subjects of Faculty")
employee_id = fields.Many2one('hr.employee',
string="Related Employee",
help="Related employee of faculty")
gender = fields.Selection(
[('male', 'Male'), ('female', 'Female'), ('other', 'Other')],
string='Gender', required=True, default='male',
help="Gender of the faculty",
track_visibility='onchange')
blood_group = fields.Selection(
[('a+', 'A+'), ('a-', 'A-'), ('b+', 'B+'), ('o+', 'O+'),
('o-', 'O-'), ('ab-', 'AB-'), ('ab+', 'AB+')],
string='Blood Group', required=True, default='a+',
help="Blood group of faculty", track_visibility='onchange')
def action_create_employee(self):
"""Creating the employee for the faculty"""
for rec in self:
emp_id = self.env['hr.employee'].create({
'name': rec.name + ' ' + rec.last_name,
'gender': rec.gender,
'birthday': rec.date_of_birth,
'image_1920': rec.image,
'work_phone': rec.phone,
'work_email': rec.email,
})
rec.employee_id = emp_id.id

55
education_university_management/models/university_semester.py

@ -0,0 +1,55 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class UniversitySemester(models.Model):
"""Used to manage the semester of department"""
_name = 'university.semester'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Semester"
name = fields.Char(string="Name", help="Name of the semester",
compute="compute_semester_name")
semester_no = fields.Integer(string="Semester", help="Semester number",
required=True)
department_id = fields.Many2one('university.department',
string="Department",
required=True,
help="In which department the semester "
"belongs to")
syllabus_ids = fields.One2many('university.syllabus',
'semester_id',
help="Syllabus of semester",
string="Syllabus")
@api.depends('semester_no','department_id')
def compute_semester_name(self):
""" Updates the name field dynamically based on the
department code and semester number."""
for rec in self:
if rec.department_id and rec.semester_no:
rec.name = f"{rec.department_id.code}/Sem {rec.semester_no}"
else:
rec.name = False

146
education_university_management/models/university_student.py

@ -0,0 +1,146 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
class UniversityStudent(models.Model):
"""To keep records of university student details"""
_name = 'university.student'
_inherit = ['mail.thread', 'mail.activity.mixin']
_inherits = {'res.partner': 'partner_id'}
_description = 'University student records'
@api.model
def create(self, vals):
""" This method overrides the create method to assign a sequence number
to the newly created record.
:param vals (dict): Dictionary containing the field values for the
new university student record.
:returns class: university.student The created university student
record."""
vals['admission_no'] = self.env['ir.sequence'].next_by_code(
'university.student')
res = super(UniversityStudent, self).create(vals)
return res
partner_id = fields.Many2one(
'res.partner', string='Partner', help="Student Partner",
required=True, ondelete="cascade")
middle_name = fields.Char(string='Middle Name',
help="Middle Name of the student")
last_name = fields.Char(string='Last Name', help="Last name of student")
application_no = fields.Char(string="Application No",
help="Application number of the student")
date_of_birth = fields.Date(string="Date of Birth", requird=True,
help="Date of Birth details")
guardian_id = fields.Many2one('res.partner', string="Guardian",
help="Student guardian details",
domain=[('is_parent', '=', True)])
father_name = fields.Char(string="Father", help="Student father details")
mother_name = fields.Char(string="Mother", help="Student mother details")
semester_id = fields.Many2one('university.semester',
string="Semester",
help="Which semester of student is")
department_id = fields.Many2one(related='semester_id.department_id',
help="Which department in semester",
string="Department")
course_id = fields.Many2one(related='department_id.course_id',
help="Which course in the department",
string="Course")
admission_no = fields.Char(string="Admission Number", readonly=True,
help="Admission no. of the student ")
gender = fields.Selection([('male', 'Male'),
('female', 'Female'),
('other', 'Other')],
help="Student gender details",
string='Gender', required=True, default='male',
track_visibility='onchange')
blood_group = fields.Selection([('a+', 'A+'),
('a-', 'A-'),
('b+', 'B+'),
('o+', 'O+'),
('o-', 'O-'),
('ab-', 'AB-'),
('ab+', 'AB+')],
string='Blood Group', required=True,
help="Student blood group details",
default='a+',
track_visibility='onchange')
company_id = fields.Many2one('res.company', string='Company',
help="Company")
per_street = fields.Char(string="Street", help="Street Address")
per_street2 = fields.Char(string="Street2", help="Street2 address")
per_zip = fields.Char(change_default=True, string="Zip",
help="Zip/Pincode details")
per_city = fields.Char(string="City", help="Student living city")
per_state_id = fields.Many2one("res.country.state",
string='State',help="State",
ondelete='restrict')
per_country_id = fields.Many2one('res.country',
string='Country',
help="Nationality of student",
ondelete='restrict')
mother_tongue = fields.Char(string="Mother Tongue",
help="Student mother tongue")
caste = fields.Char(string="Caste",
help="Student caste details")
religion = fields.Char(string="Religion",
help="Student religion details")
is_same_address = fields.Boolean(string="Is same Address?",
help="Enable if student have single "
"address")
nationality_id = fields.Many2one('res.country',
string='Nationality',
help="Nationality of student",
ondelete='restrict')
application_id = fields.Many2one('university.application',
help="Application no of student",
string="Application No")
user_id = fields.Many2one('res.users', string="User",
readonly=True,
help="Related User of the student")
batch_id = fields.Many2one('university.batch', string="Batch",
help="Relation to batches of university")
academic_year_id = fields.Many2one('university.academic.year',
string="Academic Year",
help="Academic year of the student")
def action_student_documents(self):
""" Open the documents submitted by the student along with the admission
application. This method retrieves the documents associated with
the admission application linked to the current student record.
:returns dict: A dictionary defining the action to open the
'university.document' records."""
self.ensure_one()
if self.application_id.id:
documents_list = self.env['university.document'].search(
[('application_ref_id', '=', self.application_id.id)]).mapped(
'id')
return {
'domain': [('id', 'in', documents_list)],
'name': _('Documents'),
'view_mode': 'list,form',
'res_model': 'university.document',
'view_id': False,
'context': {'application_ref_id': self.application_id.id},
'type': 'ir.actions.act_window'
}

43
education_university_management/models/university_subject.py

@ -0,0 +1,43 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import fields, models
class UniversitySubject(models.Model):
"""For managing subjects of every courses"""
_name = 'university.subject'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Subjects"
name = fields.Char(string="Subject", help="Name of the subject")
is_language = fields.Boolean(string="Language",
help="Tick if this subject is a language")
is_lab = fields.Boolean(string="Lab", help="Tick if this subject is a Lab")
code = fields.Char(string="Code", help="Enter the Subject Code")
type = fields.Selection(
[('compulsory', 'Compulsory'), ('elective', 'Elective')],
string='Type', default="compulsory",
help="Choose the type of the subject")
weightage = fields.Float(string='Weightage', default=1.0,
help="Enter the weightage for this subject")
description = fields.Text(string='Description',
help="Description about the subject")

66
education_university_management/models/university_syllabus.py

@ -0,0 +1,66 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models
class UniversitySyllabus(models.Model):
"""Manages the syllabus of department"""
_name = 'university.syllabus'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = "University Syllabus"
@api.model
def create(self, vals):
""" This method overrides the create method to generate the name for the
syllabus based on the department and subject.
:param vals (dict): Dictionary containing the field values for the
new university syllabus record.
:returns class:`university.syllabus` The created university
syllabus record."""
"""Return the name as a str of course code + subject code"""
semester_id = self.env['university.semester'].browse(
vals['semester_id'])
subject_id = self.env['university.subject'].browse(
vals['subject_id'])
name = str(semester_id.name) + '/' + str(
subject_id.code) + '-Syllabus'
vals['name'] = name
return super(UniversitySyllabus, self).create(vals)
name = fields.Char(string="Name", help="Syllabus name", readonly=True)
subject_id = fields.Many2one('university.subject',
required=True, string="Subject",
help="Select subject for syllabus")
total_hrs = fields.Float(string="Total Hrs",
help="Time for completing subjects")
description = fields.Text(string='Module Details',
help="Description about modules")
subject_code = fields.Char(related='subject_id.code', string="Code",
help="Subject code of selected subject")
subject_weightage = fields.Float(related='subject_id.weightage',
help="Points of the subject")
semester_id = fields.Many2one('university.semester',
string="Semester", required=True,
help="Select semester for syllabus")
department_id = fields.Many2one(related='semester_id.department_id',
string="Department",
help="Select department for syllabus")

85
education_university_management/models/university_timetable.py

@ -0,0 +1,85 @@
# -*- coding: utf-8 -*-
###############################################################################
#
# Cybrosys Technologies Pvt. Ltd.
#
# Copyright (C) 2024-TODAY Cybrosys Technologies(<https://www.cybrosys.com>)
# Author: Gayathri V(odoo@cybrosys.com)
#
# You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
#
# 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 AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
#
# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>.
#
###############################################################################
from odoo import api, fields, models, _
from odoo.exceptions import ValidationError
class UniversityTimeTable(models.Model):
"""Manages the timetable of every batch"""
_name = 'university.timetable'
_inherit = ['mail.thread', 'mail.activity.mixin']
_description = 'Timetable'
name = fields.Char(string="Name", compute="_compute_name",
help="Name of the timetable")
batch_id = fields.Many2one('university.batch', string='Batch',
help="Batch of the timetable",
required=True)
academic_year_id = fields.Many2one(related="batch_id.academic_year_id",
help="Batch academic year",
string='Academic Year')
mon_timetable_ids = fields.One2many('timetable.schedule.line',
'timetable_id',
help="Scheduled line of Monday",
domain=[('week_day', '=', '0')])
tue_timetable_ids = fields.One2many('timetable.schedule.line',
'timetable_id',
help="Scheduled line of Tuesday",
domain=[('week_day', '=', '1')])
wed_timetable_ids = fields.One2many('timetable.schedule.line',
'timetable_id',
help="Scheduled line of Wednesday",
domain=[('week_day', '=', '2')])
thur_timetable_ids = fields.One2many('timetable.schedule.line',
'timetable_id',
help="Scheduled line of Thursday",
domain=[('week_day', '=', '3')])
fri_timetable_ids = fields.One2many('timetable.schedule.line',
'timetable_id',
help="Scheduled line of Friday",
domain=[('week_day', '=', '4')])
sat_timetable_ids = fields.One2many('timetable.schedule.line',
'timetable_id',
help="Scheduled line of Saturday",
domain=[('week_day', '=', '5')])
company_id = fields.Many2one(
'res.company', string='Company', help="Company",
default=lambda self: self.env.company)
def _compute_name(self):
"""generate name for the timetable records"""
for rec in self:
rec.name = False
if rec.batch_id and rec.academic_year_id:
rec.name = "/".join([rec.batch_id.name, "Schedule"])
@api.constrains('batch_id')
def _check_batch(self):
""" This method ensures that only one timetable can be scheduled for a
specific Batch.
:raises: ValidationError if more than one timetable is already
scheduled for the Batch."""
batches = self.search_count([('batch_id', '=', self.batch_id.id)])
if batches > 1:
raise ValidationError(_('Timetable is already scheduled for '
'this Batch'))

30
education_university_management/security/education_university_management_groups.xml

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!--A New category for university education groups-->
<record model="ir.module.category" id="module_category_university">
<field name="name">University</field>
<field name="description">Helps you to manage your institution</field>
<field name="sequence">5</field>
</record>
<!--Staff security group-->
<record id="education_university_management_group_faculty" model="res.groups">
<field name="name">Staff</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="category_id" ref="module_category_university"/>
</record>
<!--HOD security group-->
<record id="education_university_management_group_hod" model="res.groups">
<field name="name">Head Of Department</field>
<field name="implied_ids"
eval="[(4, ref('education_university_management_group_faculty'))]"/>
<field name="category_id" ref="module_category_university"/>
</record>
<!--Principal security group-->
<record id="education_university_management_group_principal" model="res.groups">
<field name="name">Principal</field>
<field name="category_id" ref="module_category_university"/>
<field name="implied_ids" eval="[(4, ref('education_university_management_group_hod'))]"/>
<field name="users"
eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record>
</odoo>

70
education_university_management/security/ir.model.access.csv

@ -0,0 +1,70 @@
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_application_reject,access.application.reject.py,model_application_reject,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_course,access.university.course,model_university_course,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_department,access.university.department,model_university_department,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_subject,access.university.subject,model_university_subject,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_semester,access.university.semester,model_university_semester,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_syllabus,access.university.syllabus,model_university_syllabus,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_academic_year,access.university.academic.year,model_university_academic_year,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_batch,access.university.batch,model_university_batch,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_faculty,access.university.faculty,model_university_faculty,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_application,access.university.application,model_university_application,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_document_type,access.university.document.type,model_university_document_type,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_document,access.university.document,model_university_document,education_university_management.education_university_management_group_hod,1,1,1,1
access_reject_reason,access.reject.reason,model_reject_reason,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_student,access.university.student,model_university_student,education_university_management.education_university_management_group_hod,1,1,1,1
access_fee_category,access.fee.category,model_fee_category,education_university_management.education_university_management_group_hod,1,1,1,1
access_fee_type,access.fee.type,model_fee_type,education_university_management.education_university_management_group_hod,1,1,1,1
access_fee_structure,access.fee.structure,model_fee_structure,education_university_management.education_university_management_group_hod,1,1,1,1
access_fee_structure_line,access.fee.structure.line,model_fee_structure_line,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_attendance,access.university.attendance,model_university_attendance,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_attendance_line,access.university.attendance.line,model_university_attendance_line,education_university_management.education_university_management_group_hod,1,1,1,1
access_timetable_period,access.timetable.period,model_timetable_period,education_university_management.education_university_management_group_hod,1,1,1,1
access_timetable_schedule_line,access.timetable.schedule.line,model_timetable_schedule_line,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_timetable,access.university.timetable,model_university_timetable,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_exam_type,access.university.exam.type,model_university_exam_type,education_university_management.education_university_management_group_hod,1,1,1,1
access_university_exam,access.university.exam,model_university_exam,education_university_management.education_university_management_group_hod,1,1,1,1
access_exam_subject_line,access.exam.subject.line,model_exam_subject_line,education_university_management.education_university_management_group_hod,1,1,1,1
access_exam_valuation,access.exam.valuation,model_exam_valuation,education_university_management.education_university_management_group_hod,1,1,1,1
access_exam_valuation_line,access.exam.valuation.line,model_exam_valuation_line,education_university_management.education_university_management_group_hod,1,1,1,1
access_exam_result,access.exam.result,model_exam_result,education_university_management.education_university_management_group_hod,1,1,1,1
access_results_subject_line,access.results.subject.line,model_results_subject_line,education_university_management.education_university_management_group_hod,1,1,1,1
access_application_reject_faculty,access.application.reject.py,model_application_reject,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_course_faculty,access.university.course,model_university_course,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_department_faculty,access.university.department,model_university_department,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_subject_faculty,access.university.subject,model_university_subject,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_semester_faculty,access.university.semester,model_university_semester,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_syllabus_faculty,access.university.syllabus,model_university_syllabus,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_academic_year_faculty,access.university.academic.year,model_university_academic_year,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_batch_faculty,access.university.batch,model_university_batch,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_faculty_faculty,access.university.faculty,model_university_faculty,education_university_management.education_university_management_group_faculty,1,1,1,1
access_university_application_faculty,access.university.application,model_university_application,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_document_type_faculty,access.university.document.type,model_university_document_type,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_document_faculty,access.university.document,model_university_document,education_university_management.education_university_management_group_faculty,1,1,1,0
access_reject_reason_faculty,access.reject.reason,model_reject_reason,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_student_faculty,access.university.student,model_university_student,education_university_management.education_university_management_group_faculty,1,1,1,0
access_fee_category_faculty,access.fee.category,model_fee_category,education_university_management.education_university_management_group_faculty,1,1,1,0
access_fee_type_faculty,access.fee.type,model_fee_type,education_university_management.education_university_management_group_faculty,1,1,1,0
access_fee_structure_faculty,access.fee.structure,model_fee_structure,education_university_management.education_university_management_group_faculty,1,1,1,0
access_fee_structure_line_faculty,access.fee.structure.line,model_fee_structure_line,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_attendance_faculty,access.university.attendance,model_university_attendance,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_attendance_line_faculty,access.university.attendance.line,model_university_attendance_line,education_university_management.education_university_management_group_faculty,1,1,1,0
access_timetable_period_faculty,access.timetable.period,model_timetable_period,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_timetable_faculty,access.university.timetable,model_university_timetable,education_university_management.education_university_management_group_faculty,1,1,1,0
access_timetable_schedule_line_faculty,access.timetable.schedule.line,model_timetable_schedule_line,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_exam_type_faculty,access.university.exam.type,model_university_exam_type,education_university_management.education_university_management_group_faculty,1,1,1,0
access_university_exam_faculty,access.university.exam,model_university_exam,education_university_management.education_university_management_group_faculty,1,1,1,0
access_exam_subject_line_faculty,access.exam.subject.line,model_exam_subject_line,education_university_management.education_university_management_group_faculty,1,1,1,0
access_exam_valuation_faculty,access.exam.valuation,model_exam_valuation,education_university_management.education_university_management_group_faculty,1,1,1,0
access_exam_valuation_line_faculty,access.exam.valuation.line,model_exam_valuation_line,education_university_management.education_university_management_group_faculty,1,1,1,0
access_exam_result_faculty,access.exam.result,model_exam_result,education_university_management.education_university_management_group_faculty,1,1,1,0
access_results_subject_line_faculty,access.results.subject.line,model_results_subject_line,education_university_management.education_university_management_group_faculty,1,1,1,0
access_ir_sequence_public,access.ir.sequence.public,base.model_ir_sequence,base.group_public,1,1,1,1
access_ir_sequence_date_range_public,access.ir.sequence.date.range.public,base.model_ir_sequence_date_range,base.group_public,1,1,1,1
access_ir_sequence_public,access.ir.sequence.public,base.model_ir_sequence,base.group_portal,1,1,1,1
access_ir_sequence_date_range_public,access.ir.sequence.date.range.public,base.model_ir_sequence_date_range,base.group_portal,1,1,1,1
access_university_documents,access.university.document.portal,model_university_document,base.group_portal,1,1,1,1
access_university_documents,access.university.document.portal,model_university_document,base.group_public,1,1,1,1
access_university_documents,access.university.document.public,model_university_document,base.group_user,1,1,1,1
access_university_student,access.university.student,model_university_student,base.group_portal,1,1,1,1
access_university_student,access.university.student,model_university_student,base.group_user,1,1,1,1
1 id name model_id:id group_id:id perm_read perm_write perm_create perm_unlink
2 access_application_reject access.application.reject.py model_application_reject education_university_management.education_university_management_group_hod 1 1 1 1
3 access_university_course access.university.course model_university_course education_university_management.education_university_management_group_hod 1 1 1 1
4 access_university_department access.university.department model_university_department education_university_management.education_university_management_group_hod 1 1 1 1
5 access_university_subject access.university.subject model_university_subject education_university_management.education_university_management_group_hod 1 1 1 1
6 access_university_semester access.university.semester model_university_semester education_university_management.education_university_management_group_hod 1 1 1 1
7 access_university_syllabus access.university.syllabus model_university_syllabus education_university_management.education_university_management_group_hod 1 1 1 1
8 access_university_academic_year access.university.academic.year model_university_academic_year education_university_management.education_university_management_group_hod 1 1 1 1
9 access_university_batch access.university.batch model_university_batch education_university_management.education_university_management_group_hod 1 1 1 1
10 access_university_faculty access.university.faculty model_university_faculty education_university_management.education_university_management_group_hod 1 1 1 1
11 access_university_application access.university.application model_university_application education_university_management.education_university_management_group_hod 1 1 1 1
12 access_university_document_type access.university.document.type model_university_document_type education_university_management.education_university_management_group_hod 1 1 1 1
13 access_university_document access.university.document model_university_document education_university_management.education_university_management_group_hod 1 1 1 1
14 access_reject_reason access.reject.reason model_reject_reason education_university_management.education_university_management_group_hod 1 1 1 1
15 access_university_student access.university.student model_university_student education_university_management.education_university_management_group_hod 1 1 1 1
16 access_fee_category access.fee.category model_fee_category education_university_management.education_university_management_group_hod 1 1 1 1
17 access_fee_type access.fee.type model_fee_type education_university_management.education_university_management_group_hod 1 1 1 1
18 access_fee_structure access.fee.structure model_fee_structure education_university_management.education_university_management_group_hod 1 1 1 1
19 access_fee_structure_line access.fee.structure.line model_fee_structure_line education_university_management.education_university_management_group_hod 1 1 1 1
20 access_university_attendance access.university.attendance model_university_attendance education_university_management.education_university_management_group_hod 1 1 1 1
21 access_university_attendance_line access.university.attendance.line model_university_attendance_line education_university_management.education_university_management_group_hod 1 1 1 1
22 access_timetable_period access.timetable.period model_timetable_period education_university_management.education_university_management_group_hod 1 1 1 1
23 access_timetable_schedule_line access.timetable.schedule.line model_timetable_schedule_line education_university_management.education_university_management_group_hod 1 1 1 1
24 access_university_timetable access.university.timetable model_university_timetable education_university_management.education_university_management_group_hod 1 1 1 1
25 access_university_exam_type access.university.exam.type model_university_exam_type education_university_management.education_university_management_group_hod 1 1 1 1
26 access_university_exam access.university.exam model_university_exam education_university_management.education_university_management_group_hod 1 1 1 1
27 access_exam_subject_line access.exam.subject.line model_exam_subject_line education_university_management.education_university_management_group_hod 1 1 1 1
28 access_exam_valuation access.exam.valuation model_exam_valuation education_university_management.education_university_management_group_hod 1 1 1 1
29 access_exam_valuation_line access.exam.valuation.line model_exam_valuation_line education_university_management.education_university_management_group_hod 1 1 1 1
30 access_exam_result access.exam.result model_exam_result education_university_management.education_university_management_group_hod 1 1 1 1
31 access_results_subject_line access.results.subject.line model_results_subject_line education_university_management.education_university_management_group_hod 1 1 1 1
32 access_application_reject_faculty access.application.reject.py model_application_reject education_university_management.education_university_management_group_faculty 1 1 1 0
33 access_university_course_faculty access.university.course model_university_course education_university_management.education_university_management_group_faculty 1 1 1 0
34 access_university_department_faculty access.university.department model_university_department education_university_management.education_university_management_group_faculty 1 1 1 0
35 access_university_subject_faculty access.university.subject model_university_subject education_university_management.education_university_management_group_faculty 1 1 1 0
36 access_university_semester_faculty access.university.semester model_university_semester education_university_management.education_university_management_group_faculty 1 1 1 0
37 access_university_syllabus_faculty access.university.syllabus model_university_syllabus education_university_management.education_university_management_group_faculty 1 1 1 0
38 access_university_academic_year_faculty access.university.academic.year model_university_academic_year education_university_management.education_university_management_group_faculty 1 1 1 0
39 access_university_batch_faculty access.university.batch model_university_batch education_university_management.education_university_management_group_faculty 1 1 1 0
40 access_university_faculty_faculty access.university.faculty model_university_faculty education_university_management.education_university_management_group_faculty 1 1 1 1
41 access_university_application_faculty access.university.application model_university_application education_university_management.education_university_management_group_faculty 1 1 1 0
42 access_university_document_type_faculty access.university.document.type model_university_document_type education_university_management.education_university_management_group_faculty 1 1 1 0
43 access_university_document_faculty access.university.document model_university_document education_university_management.education_university_management_group_faculty 1 1 1 0
44 access_reject_reason_faculty access.reject.reason model_reject_reason education_university_management.education_university_management_group_faculty 1 1 1 0
45 access_university_student_faculty access.university.student model_university_student education_university_management.education_university_management_group_faculty 1 1 1 0
46 access_fee_category_faculty access.fee.category model_fee_category education_university_management.education_university_management_group_faculty 1 1 1 0
47 access_fee_type_faculty access.fee.type model_fee_type education_university_management.education_university_management_group_faculty 1 1 1 0
48 access_fee_structure_faculty access.fee.structure model_fee_structure education_university_management.education_university_management_group_faculty 1 1 1 0
49 access_fee_structure_line_faculty access.fee.structure.line model_fee_structure_line education_university_management.education_university_management_group_faculty 1 1 1 0
50 access_university_attendance_faculty access.university.attendance model_university_attendance education_university_management.education_university_management_group_faculty 1 1 1 0
51 access_university_attendance_line_faculty access.university.attendance.line model_university_attendance_line education_university_management.education_university_management_group_faculty 1 1 1 0
52 access_timetable_period_faculty access.timetable.period model_timetable_period education_university_management.education_university_management_group_faculty 1 1 1 0
53 access_university_timetable_faculty access.university.timetable model_university_timetable education_university_management.education_university_management_group_faculty 1 1 1 0
54 access_timetable_schedule_line_faculty access.timetable.schedule.line model_timetable_schedule_line education_university_management.education_university_management_group_faculty 1 1 1 0
55 access_university_exam_type_faculty access.university.exam.type model_university_exam_type education_university_management.education_university_management_group_faculty 1 1 1 0
56 access_university_exam_faculty access.university.exam model_university_exam education_university_management.education_university_management_group_faculty 1 1 1 0
57 access_exam_subject_line_faculty access.exam.subject.line model_exam_subject_line education_university_management.education_university_management_group_faculty 1 1 1 0
58 access_exam_valuation_faculty access.exam.valuation model_exam_valuation education_university_management.education_university_management_group_faculty 1 1 1 0
59 access_exam_valuation_line_faculty access.exam.valuation.line model_exam_valuation_line education_university_management.education_university_management_group_faculty 1 1 1 0
60 access_exam_result_faculty access.exam.result model_exam_result education_university_management.education_university_management_group_faculty 1 1 1 0
61 access_results_subject_line_faculty access.results.subject.line model_results_subject_line education_university_management.education_university_management_group_faculty 1 1 1 0
62 access_ir_sequence_public access.ir.sequence.public base.model_ir_sequence base.group_public 1 1 1 1
63 access_ir_sequence_date_range_public access.ir.sequence.date.range.public base.model_ir_sequence_date_range base.group_public 1 1 1 1
64 access_ir_sequence_public access.ir.sequence.public base.model_ir_sequence base.group_portal 1 1 1 1
65 access_ir_sequence_date_range_public access.ir.sequence.date.range.public base.model_ir_sequence_date_range base.group_portal 1 1 1 1
66 access_university_documents access.university.document.portal model_university_document base.group_portal 1 1 1 1
67 access_university_documents access.university.document.portal model_university_document base.group_public 1 1 1 1
68 access_university_documents access.university.document.public model_university_document base.group_user 1 1 1 1
69 access_university_student access.university.student model_university_student base.group_portal 1 1 1 1
70 access_university_student access.university.student model_university_student base.group_user 1 1 1 1

BIN
education_university_management/static/description/assets/cybro-icon.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
education_university_management/static/description/assets/cybro-odoo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

10
education_university_management/static/description/assets/icons/arrows-repeat.svg

@ -0,0 +1,10 @@
<svg width="34" height="34" viewBox="0 0 34 34" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_48_838)">
<path d="M0.000110011 16.2916C0.000110011 9.65172 5.40186 4.24997 12.0418 4.24997H26.9168V1.89405C26.9168 0.631803 28.4425 -3.05772e-05 29.335 0.892469L33.585 5.37339C34.1389 5.9273 34.1375 6.82405 33.585 7.37655L29.335 11.8575C28.4425 12.75 26.9168 12.1181 26.9168 10.8559V8.49997H12.0418C7.74503 8.49997 4.25011 11.9963 4.25011 16.2916C4.25011 17.4646 3.29953 18.4166 2.12511 18.4166C0.950693 18.4166 0.000110011 17.4646 0.000110011 16.2916ZM31.8751 15.5833C30.7007 15.5833 29.7501 16.5353 29.7501 17.7083C29.7501 22.0036 26.2552 25.5 21.9584 25.5H7.08344V23.1441C7.08344 21.8818 5.55769 21.25 4.66519 22.1425L0.415193 26.6234C-0.138723 27.1773 -0.138723 28.0741 0.415193 28.6266L4.66519 33.1075C5.55769 34 7.08344 33.3681 7.08344 32.1059V29.75H21.9584C28.5984 29.75 34.0001 24.3482 34.0001 17.7083C34.0001 16.5353 33.0495 15.5833 31.8751 15.5833Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_48_838">
<rect width="34" height="34" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
education_university_management/static/description/assets/icons/banner-1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 210 KiB

73
education_university_management/static/description/assets/icons/banner-2.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 209 KiB

BIN
education_university_management/static/description/assets/icons/banner-bg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 109 KiB

9
education_university_management/static/description/assets/icons/banner-bg.svg

@ -0,0 +1,9 @@
<svg width="1228" height="268" viewBox="0 0 1228 268" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M0 0H1228V252C1228 260.837 1220.84 268 1212 268H16C7.16347 268 0 260.837 0 252V0Z" fill="url(#paint0_linear_15_2077)"/>
<defs>
<linearGradient id="paint0_linear_15_2077" x1="613.495" y1="-14" x2="613.495" y2="268" gradientUnits="userSpaceOnUse">
<stop stop-color="#D7BFFF" stop-opacity="0"/>
<stop offset="1" stop-color="#D3D0DA" stop-opacity="0.5"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 495 B

5
education_university_management/static/description/assets/icons/banner-call.svg

@ -0,0 +1,5 @@
<svg width="24" height="25" viewBox="0 0 24 25" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M21 16.46V19.996C21.0001 20.2492 20.9042 20.493 20.7316 20.6782C20.559 20.8635 20.3226 20.9763 20.07 20.994C19.633 21.024 19.276 21.04 19 21.04C10.163 21.04 3 13.877 3 5.04004C3 4.76404 3.015 4.40704 3.046 3.97004C3.06372 3.71748 3.17658 3.48105 3.3618 3.30845C3.54703 3.13585 3.79082 3.03992 4.044 3.04004H7.58C7.70404 3.03991 7.8237 3.0859 7.91573 3.16906C8.00776 3.25222 8.0656 3.36662 8.078 3.49004C8.101 3.72004 8.122 3.90304 8.142 4.04204C8.34073 5.42896 8.748 6.77787 9.35 8.04304C9.445 8.24304 9.383 8.48204 9.203 8.61004L7.045 10.152C8.36445 13.2265 10.8145 15.6766 13.889 16.996L15.429 14.842C15.4919 14.754 15.5838 14.6909 15.6885 14.6637C15.7932 14.6365 15.9042 14.6468 16.002 14.693C17.267 15.2939 18.6156 15.7002 20.002 15.898C20.141 15.918 20.324 15.94 20.552 15.962C20.6752 15.9747 20.7894 16.0326 20.8724 16.1246C20.9553 16.2166 21.0012 16.3362 21.001 16.46H21Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

5
education_university_management/static/description/assets/icons/banner-mail.svg

@ -0,0 +1,5 @@
<svg width="24" height="22" viewBox="0 0 24 22" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M3 2.75H21C21.2652 2.75 21.5196 2.84658 21.7071 3.01849C21.8946 3.19039 22 3.42355 22 3.66667V18.3333C22 18.5764 21.8946 18.8096 21.7071 18.9815C21.5196 19.1534 21.2652 19.25 21 19.25H3C2.73478 19.25 2.48043 19.1534 2.29289 18.9815C2.10536 18.8096 2 18.5764 2 18.3333V3.66667C2 3.42355 2.10536 3.19039 2.29289 3.01849C2.48043 2.84658 2.73478 2.75 3 2.75ZM12.06 10.7094L5.648 5.71817L4.353 7.11517L12.073 13.1239L19.654 7.11058L18.346 5.72367L12.061 10.7094H12.06Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 624 B

343
education_university_management/static/description/assets/icons/banner-pattern.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 136 KiB

147
education_university_management/static/description/assets/icons/banner-promo.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 214 KiB

41
education_university_management/static/description/assets/icons/brand-pair.svg

@ -0,0 +1,41 @@
<svg width="722" height="91" viewBox="0 0 722 91" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_76_492)">
<path d="M3.96206 36.4143H16.4878C17.0972 33.1867 18.1886 30.0692 19.7253 27.1662C22.0512 22.5767 25.4478 18.6146 29.628 15.6148C30.3275 15.1152 31.0219 14.6705 31.7114 14.2658V8.67495C31.7121 8.15446 31.6101 7.63895 31.4112 7.15796C31.2123 6.67696 30.9205 6.23993 30.5524 5.87189C30.1844 5.50384 29.7474 5.21203 29.2664 5.01315C28.7854 4.81427 28.2699 4.71224 27.7494 4.71289H3.96206C2.91126 4.71289 1.90349 5.13032 1.16046 5.87335C0.417433 6.61638 3.15053e-06 7.62415 3.15053e-06 8.67495V32.4473C-0.000653502 32.968 0.101344 33.4838 0.300161 33.965C0.498979 34.4463 0.790718 34.8837 1.15869 35.2521C1.52667 35.6206 1.96367 35.9128 2.44469 36.1123C2.92572 36.3117 3.44133 36.4143 3.96206 36.4143Z" fill="#231F20"/>
<path d="M26.2803 36.4143H27.7492C28.2699 36.4143 28.7855 36.3116 29.2666 36.1122C29.7476 35.9128 30.1846 35.6205 30.5525 35.252C30.9205 34.8836 31.2123 34.4462 31.4111 33.965C31.6099 33.4837 31.7119 32.9679 31.7112 32.4472V21.4854C30.4259 23.5406 29.3433 25.7159 28.4786 27.9805C27.3964 30.6889 26.6579 33.5222 26.2803 36.4143Z" fill="#231F20"/>
<path d="M15.9182 42.4053C15.9165 41.0255 16.0033 39.647 16.178 38.2783H3.96205C2.91079 38.2796 1.90304 38.6982 1.16016 39.442C0.417269 40.1858 -8.33757e-07 41.1941 0 42.2454L0 67.8913C-8.33757e-07 68.9426 0.417269 69.9508 1.16016 70.6947C1.90304 71.4385 2.91079 71.857 3.96205 71.8584H29.613C30.6627 71.8505 31.6672 71.43 32.4095 70.6878C33.1517 69.9455 33.5722 68.941 33.58 67.8913V60.6867C28.5838 60.4868 24.4435 58.7847 21.1593 55.5805C17.6619 52.1697 15.9148 47.7779 15.9182 42.4053Z" fill="#B22126"/>
<path d="M63.1879 40.1416H39.4055C38.8844 40.1409 38.3682 40.2431 37.8866 40.4422C37.405 40.6414 36.9674 40.9336 36.5989 41.3021C36.2304 41.6706 35.9382 42.1082 35.7391 42.5898C35.54 43.0714 35.4378 43.5875 35.4385 44.1087V55.2004C37.0405 55.7764 38.7324 56.0624 40.4348 56.0448C42.9361 56.0853 45.4022 55.4519 47.5745 54.2111C50.0647 52.6651 52.2871 50.7246 54.1546 48.4654V52.4275C48.9551 57.7568 42.7164 60.5098 35.4385 60.6863V67.886C35.4463 68.9357 35.8668 69.9402 36.6091 70.6824C37.3513 71.4247 38.3558 71.8452 39.4055 71.853H63.1879C64.2376 71.8452 65.242 71.4247 65.9843 70.6824C66.7266 69.9402 67.1471 68.9357 67.1549 67.886V44.1087C67.1549 43.0565 66.737 42.0475 65.993 41.3035C65.249 40.5596 64.24 40.1416 63.1879 40.1416Z" fill="#231F20"/>
<path d="M63.1879 4.71297H37.5419C36.4915 4.71429 35.4845 5.13215 34.7418 5.87489C33.9991 6.61763 33.5812 7.62463 33.5799 8.67502V13.2566C36.09 11.9862 38.8559 11.3028 41.6689 11.2581C44.9697 11.2581 47.6627 12.249 49.7479 14.2309C51.833 16.2128 52.8739 18.7808 52.8705 21.9352C52.9064 24.6318 52.2802 27.2961 51.0469 29.6944C50.9919 29.8143 50.932 29.9342 50.862 30.0541C50.862 30.0841 50.8271 30.1241 50.8071 30.1541C50.3864 30.8401 49.7531 31.3699 49.0036 31.6629C48.2541 31.9559 47.4294 31.996 46.655 31.7771C45.8806 31.5581 45.199 31.0922 44.7138 30.4502C44.2286 29.8082 43.9664 29.0252 43.9672 28.2205C43.9601 27.5105 44.1654 26.8145 44.5567 26.222C45.5827 24.3205 46.1152 22.1921 46.1056 20.0316C46.1056 18.133 45.6692 16.6241 44.7965 15.5049C44.3888 14.9675 43.8589 14.5348 43.2507 14.2429C42.6425 13.951 41.9735 13.8081 41.2991 13.8262C39.1807 13.8262 36.9174 15.1452 34.5092 17.7833C34.1994 18.123 33.8896 18.4827 33.5949 18.8425V34.311C33.5955 34.8321 33.4934 35.3483 33.2942 35.8299C33.0951 36.3115 32.8029 36.7491 32.4344 37.1176C32.0659 37.4861 31.6283 37.7783 31.1467 37.9774C30.6651 38.1765 30.149 38.2787 29.6278 38.278H26.1304C26.1004 38.7777 26.0854 39.2773 26.0854 39.7769C26.0854 44.5334 27.4344 48.4338 30.1324 51.4782C31.1249 52.6139 32.2982 53.5778 33.6049 54.3311V42.2451C33.6049 41.1938 34.0221 40.1855 34.765 39.4417C35.5079 38.6979 36.5157 38.2793 37.5669 38.278H63.2129C64.265 38.278 65.274 37.8601 66.018 37.1161C66.762 36.3721 67.1799 35.3631 67.1799 34.311V8.67502C67.1793 8.15238 67.0753 7.63501 66.8741 7.15264C66.6729 6.67028 66.3784 6.23243 66.0074 5.86426C65.6364 5.49609 65.1964 5.20485 64.7125 5.00727C64.2286 4.80969 63.7105 4.70968 63.1879 4.71297Z" fill="#B22126"/>
<path d="M119.037 6.17721V17.5987H118.087C117.371 14.6209 116.039 12.336 114.09 10.7438C112.24 9.18871 109.897 8.34376 107.48 8.36059C105.453 8.35176 103.473 8.97333 101.814 10.1393C100.128 11.2806 98.8172 12.8956 98.0473 14.7808C97.0001 17.3752 96.4804 20.1522 96.5184 22.9497C96.4851 25.6754 96.8623 28.3905 97.6376 31.0038C98.3837 33.4286 99.5495 35.2606 101.135 36.4997C102.72 37.7388 104.779 38.3583 107.31 38.3583C109.293 38.379 111.251 37.9124 113.011 36.9993C114.733 36.09 116.552 34.5261 118.467 32.3078V35.1507C116.842 36.9203 114.878 38.3458 112.691 39.3426C110.473 40.2503 108.093 40.6925 105.697 40.6416C102.448 40.7028 99.2319 39.9778 96.3236 38.5282C93.6588 37.1874 91.456 35.0802 89.9983 32.4777C88.5371 29.9073 87.7708 27.0006 87.7749 24.0439C87.7777 20.8934 88.6304 17.802 90.2431 15.0956C91.8236 12.3238 94.1364 10.0405 96.9281 8.49549C99.6453 6.95916 102.715 6.15514 105.837 6.16222C108.357 6.20019 110.848 6.70854 113.181 7.66111C114.67 8.24734 115.618 8.53879 116.024 8.53546C116.276 8.5371 116.525 8.48745 116.757 8.38953C116.989 8.2916 117.199 8.14745 117.373 7.96588C117.807 7.458 118.066 6.82385 118.112 6.15723L119.037 6.17721Z" fill="black"/>
<path d="M157.148 6.93164V7.82598C156.244 7.90593 155.379 8.23447 154.65 8.77527C153.841 9.44144 152.562 11.2967 150.813 14.3411L143.658 26.2773V34.2713C143.658 35.9701 143.748 37.0276 143.928 37.444C144.156 37.9107 144.524 38.2936 144.982 38.5381C145.626 38.8905 146.353 39.0631 147.086 39.0378H148.934V39.9371H130.448V38.9728H132.172C132.972 39.0166 133.77 38.8441 134.48 38.4732C134.936 38.2101 135.288 37.7995 135.479 37.3091C135.656 36.9194 135.744 35.8984 135.744 34.2463V27.6412L127.98 13.5167C126.441 10.7288 125.355 9.08837 124.722 8.5954C123.987 8.06809 123.099 7.79767 122.194 7.82598V6.93164H137.998V7.82598H137.293C136.601 7.7672 135.906 7.91129 135.295 8.24067C135.136 8.32984 135.002 8.45588 134.903 8.6081C134.804 8.76032 134.743 8.93421 134.725 9.11502C134.725 9.70125 135.373 11.1685 136.669 13.5167L142.624 24.4286L148.545 14.491C150.02 12.0595 150.758 10.4457 150.758 9.64962C150.754 9.42828 150.694 9.21158 150.583 9.02008C150.472 8.82858 150.314 8.66864 150.124 8.55543C149.574 8.15073 148.56 7.91091 147.086 7.82598V6.93164H157.148Z" fill="black"/>
<path d="M179.866 22.4151C182.994 23.1446 185.191 24.0273 186.456 25.0632C187.327 25.7396 188.027 26.611 188.5 27.6071C188.973 28.6033 189.206 29.6965 189.179 30.7989C189.195 31.9871 188.932 33.1624 188.412 34.2306C187.891 35.2987 187.127 36.2299 186.182 36.9493C183.74 38.9079 180.184 39.8888 175.515 39.8921H158.752V38.9728C160.277 38.9728 161.312 38.8296 161.855 38.5431C162.341 38.3207 162.741 37.9452 162.994 37.4739C163.214 37.0193 163.324 35.9051 163.324 34.1214V12.7123C163.324 10.9337 163.214 9.8095 162.994 9.34984C162.75 8.85687 162.342 8.46452 161.84 8.24067C161.29 7.96421 160.261 7.82598 158.752 7.82598V6.93164H174.555C178.332 6.93164 181.005 7.26473 182.574 7.9309C184.08 8.54684 185.374 9.58864 186.296 10.9287C187.174 12.1792 187.648 13.668 187.655 15.1955C187.656 16.7787 187.038 18.2994 185.932 19.4324C184.776 20.6914 182.754 21.6857 179.866 22.4151ZM171.018 23.6542V34.2264V35.4405C170.969 35.7998 171.004 36.1656 171.12 36.5092C171.236 36.8528 171.43 37.1651 171.686 37.4218C171.942 37.6785 172.254 37.8726 172.597 37.9891C172.941 38.1056 173.306 38.1413 173.666 38.0935C174.914 38.104 176.146 37.8072 177.253 37.2291C178.322 36.6711 179.193 35.7993 179.751 34.731C180.343 33.6039 180.644 32.3466 180.626 31.0737C180.65 29.6203 180.28 28.1875 179.556 26.9268C178.904 25.7558 177.863 24.8493 176.614 24.3637C175.37 23.8691 173.486 23.6392 171.003 23.6542H171.018ZM171.018 21.7556C173.323 21.7556 175.022 21.4975 176.114 20.9812C177.142 20.5106 178.01 19.75 178.612 18.7928C179.235 17.6992 179.538 16.4528 179.487 15.1955C179.539 13.9431 179.241 12.701 178.627 11.6082C178.036 10.671 177.176 9.93434 176.159 9.49474C175.09 9.01176 173.371 8.77694 171.003 8.79026L171.018 21.7556Z" fill="black"/>
<path d="M204.138 24.8683V34.1064C204.138 35.8901 204.248 37.0093 204.463 37.4739C204.711 37.9623 205.118 38.3517 205.617 38.5781C206.172 38.8529 207.196 38.9928 208.705 38.9928V39.8921H191.857V38.9728C193.356 38.9728 194.415 38.8279 194.955 38.5431C195.435 38.3174 195.83 37.9423 196.079 37.4739C196.299 37.0193 196.409 35.9051 196.409 34.1214V12.7123C196.409 10.9337 196.299 9.8095 196.079 9.34984C195.833 8.85885 195.426 8.4673 194.925 8.24067C194.376 7.96587 193.341 7.82598 191.837 7.82598V6.93164H207.151C211.148 6.93164 214.064 7.20644 215.9 7.75603C217.691 8.2681 219.274 9.33516 220.421 10.8038C221.591 12.2877 222.21 14.1308 222.175 16.0199C222.202 17.1558 221.981 18.284 221.527 19.3256C221.073 20.3672 220.397 21.2971 219.547 22.0504C218.185 23.1754 216.57 23.9507 214.84 24.3087L222.779 35.4754C223.421 36.4497 224.163 37.354 224.993 38.1734C225.663 38.6676 226.468 38.9463 227.301 38.9728V39.8722H216.924L206.302 24.8683H204.138ZM204.138 8.70532V23.1446H205.522C207.776 23.1446 209.459 22.9347 210.578 22.5251C211.695 22.1139 212.629 21.3209 213.217 20.2867C213.908 18.9924 214.239 17.536 214.176 16.0698C214.176 13.5551 213.588 11.6998 212.412 10.504C211.236 9.30821 209.344 8.70865 206.736 8.70532H204.138Z" fill="black"/>
<path d="M246.092 6.46642C251.342 6.27323 255.607 7.80542 258.888 11.063C262.169 14.3206 263.807 18.3959 263.804 23.2889C263.869 27.2766 262.574 31.1675 260.132 34.3207C256.888 38.5376 252.309 40.6443 246.397 40.641C240.485 40.6377 235.901 38.6292 232.647 34.6155C230.09 31.4121 228.738 27.4121 228.83 23.3139C228.83 18.4175 230.495 14.3372 233.826 11.073C237.157 7.80875 241.246 6.27323 246.092 6.46642ZM246.382 8.02026C243.384 8.02026 241.091 9.56079 239.502 12.6418C238.223 15.1699 237.584 18.7989 237.584 23.5287C237.584 29.1546 238.571 33.3181 240.546 36.0195C241.202 36.9265 242.072 37.6568 243.079 38.1451C244.086 38.6334 245.199 38.8643 246.317 38.8174C247.803 38.8704 249.268 38.4448 250.494 37.6033C251.923 36.5674 253.034 34.9019 253.826 32.607C254.619 30.312 255.016 27.3426 255.016 23.6986C255.016 19.3418 254.611 16.0809 253.801 13.9159C252.992 11.7508 251.96 10.2236 250.704 9.33429C249.437 8.45253 247.925 7.99271 246.382 8.02026Z" fill="black"/>
<path d="M288.97 6.17699L289.235 17.1688H288.236C287.885 14.6146 286.668 12.2581 284.788 10.4938C283.187 8.91862 281.039 8.02351 278.793 7.99564C277.364 7.91684 275.959 8.39094 274.871 9.31966C274.423 9.69261 274.062 10.1582 273.811 10.6844C273.561 11.2106 273.428 11.7848 273.422 12.3674C273.406 13.0489 273.579 13.7215 273.921 14.3109C274.52 15.2067 275.289 15.9757 276.185 16.5743C277.884 17.6257 279.644 18.5751 281.456 19.4172C285.343 21.3191 287.952 23.1111 289.285 24.7932C290.599 26.433 291.305 28.4774 291.283 30.5789C291.29 31.9257 291.006 33.2581 290.451 34.4851C289.896 35.7121 289.082 36.8048 288.066 37.6886C285.917 39.6871 283.189 40.6863 279.882 40.6863C278.894 40.6914 277.908 40.5858 276.944 40.3716C275.748 40.0718 274.578 39.6741 273.447 39.1825C272.844 38.8962 272.193 38.7266 271.528 38.6828C271.041 38.7082 270.574 38.8826 270.189 39.1825C269.675 39.5638 269.28 40.0837 269.05 40.6813H268.146V28.2006H269.05C269.759 31.698 271.132 34.3627 273.167 36.1947C275.202 38.0267 277.399 38.9526 279.757 38.9726C281.342 39.0506 282.895 38.5136 284.094 37.4737C284.597 37.0496 285.003 36.5212 285.282 35.9252C285.561 35.3292 285.708 34.6796 285.712 34.0213C285.709 33.227 285.495 32.4478 285.093 31.763C284.608 30.9527 283.968 30.2463 283.209 29.6845C281.792 28.6929 280.287 27.8333 278.713 27.1164C275.715 25.6442 273.56 24.3885 272.247 23.3492C271.012 22.4007 269.981 21.2108 269.22 19.8518C268.511 18.5549 268.146 17.0979 268.16 15.62C268.144 14.361 268.393 13.1126 268.891 11.9564C269.39 10.8002 270.126 9.76213 271.053 8.90996C272.026 7.98966 273.172 7.27121 274.424 6.79612C275.676 6.32104 277.009 6.09872 278.348 6.14202C279.396 6.14028 280.44 6.26952 281.456 6.52673C282.434 6.80729 283.383 7.1821 284.289 7.6459C284.998 8.04833 285.775 8.31598 286.582 8.43531C286.766 8.44492 286.951 8.41514 287.123 8.34795C287.296 8.28076 287.452 8.1777 287.581 8.0456C287.944 7.48124 288.176 6.84276 288.261 6.17699H288.97Z" fill="black"/>
<path d="M328.666 6.93164V7.82598C327.761 7.90412 326.896 8.23285 326.168 8.77527C325.355 9.44144 324.074 11.2967 322.326 14.3411L315.171 26.2773V34.2713C315.171 35.9701 315.261 37.0276 315.441 37.444C315.669 37.9118 316.04 38.295 316.5 38.5381C317.143 38.8916 317.87 39.0643 318.603 39.0378H320.447V39.9371H301.961V38.9728H303.685C304.486 39.0158 305.285 38.8433 305.998 38.4732C306.453 38.2092 306.805 37.7989 306.997 37.3091C307.177 36.9194 307.267 35.8984 307.267 34.2463V27.6412L299.498 13.5167C297.955 10.7288 296.87 9.08837 296.24 8.5954C295.504 8.06943 294.616 7.79916 293.712 7.82598V6.93164H309.51V7.82598H308.806C308.113 7.76807 307.419 7.91211 306.807 8.24067C306.649 8.32984 306.514 8.45588 306.415 8.6081C306.316 8.76032 306.255 8.93421 306.238 9.11502C306.238 9.70125 306.885 11.1685 308.181 13.5167L314.137 24.4286L320.057 14.491C321.526 12.0595 322.261 10.4457 322.261 9.64962C322.257 9.42886 322.197 9.21265 322.087 9.02127C321.977 8.82989 321.82 8.66961 321.631 8.55543C321.077 8.15073 320.062 7.91091 318.593 7.82598V6.93164H328.666Z" fill="black"/>
<path d="M352.608 6.17706L352.873 17.1689H351.874C351.52 14.6133 350.3 12.2567 348.416 10.4938C346.571 8.82842 344.572 7.99571 342.421 7.99571C340.992 7.9169 339.587 8.39101 338.499 9.31972C338.049 9.69134 337.687 10.1567 337.437 10.6832C337.186 11.2097 337.054 11.7845 337.05 12.3675C337.034 13.049 337.207 13.7216 337.549 14.311C338.147 15.2055 338.914 15.9744 339.808 16.5743C341.509 17.6243 343.271 18.5736 345.084 19.4172C348.941 21.3158 351.542 23.1061 352.888 24.7882C354.202 26.4281 354.908 28.4724 354.886 30.5739C354.893 31.9212 354.609 33.2541 354.053 34.4813C353.496 35.7084 352.682 36.8008 351.664 37.6836C349.522 39.6822 346.796 40.6814 343.485 40.6814C342.495 40.6867 341.508 40.5811 340.542 40.3666C339.354 40.0649 338.193 39.6672 337.07 39.1775C336.467 38.8913 335.816 38.7217 335.151 38.6779C334.664 38.7032 334.197 38.8776 333.812 39.1775C333.298 39.56 332.901 40.0794 332.668 40.6764H331.769V28.2007H332.668C333.384 31.6981 334.758 34.3628 336.79 36.1947C338.822 38.0267 341.023 38.9527 343.395 38.9727C344.983 39.0533 346.541 38.5161 347.742 37.4738C348.56 36.7963 349.111 35.8492 349.294 34.8026C349.477 33.7559 349.281 32.6782 348.741 31.763C348.255 30.9538 347.615 30.2477 346.857 29.6846C345.44 28.6924 343.935 27.8327 342.361 27.1165C339.363 25.6443 337.209 24.3885 335.9 23.3493C334.665 22.4008 333.634 21.2109 332.873 19.8519C332.164 18.555 331.799 17.098 331.814 15.62C331.797 14.3611 332.046 13.1127 332.544 11.9565C333.043 10.8003 333.779 9.76219 334.706 8.91003C335.679 7.98949 336.824 7.2709 338.077 6.7958C339.329 6.3207 340.662 6.09851 342.001 6.14208C343.049 6.14035 344.093 6.26959 345.109 6.5268C346.069 6.79899 347 7.16203 347.892 7.61099C348.602 8.01369 349.382 8.28134 350.19 8.40041C350.375 8.41132 350.56 8.38215 350.732 8.31488C350.905 8.24762 351.06 8.14385 351.189 8.0107C351.557 7.44809 351.791 6.80896 351.874 6.14208L352.608 6.17706Z" fill="black"/>
<path d="M101.65 56.0352L101.82 59.6425H101.385C101.348 59.1737 101.233 58.7143 101.045 58.2835C100.84 57.8725 100.514 57.5343 100.111 57.3142C99.6313 57.0849 99.1029 56.9769 98.5719 56.9994H96.4285V68.7507C96.4285 69.7 96.5284 70.2896 96.7333 70.5244C96.9082 70.6936 97.1173 70.8235 97.3465 70.9053C97.5757 70.9872 97.8197 71.0191 98.0623 70.999H98.5919V71.4187H92.0967V70.999H92.6413C92.903 71.025 93.167 70.9846 93.4089 70.8816C93.6508 70.7785 93.8628 70.6162 94.0253 70.4095C94.2419 69.885 94.3276 69.3157 94.2751 68.7507V56.9994H92.4265C91.9101 56.9763 91.3931 57.0302 90.8926 57.1593C90.4809 57.3244 90.1314 57.6144 89.8934 57.9887C89.5861 58.4872 89.4139 59.0572 89.3937 59.6425H88.9341L89.1139 56.0352H101.65Z" fill="black"/>
<path d="M117.318 64.9529C117.237 66.2587 117.637 67.549 118.442 68.5802C118.759 68.987 119.163 69.317 119.625 69.5454C120.087 69.7738 120.595 69.8948 121.11 69.8992C121.747 69.9116 122.371 69.7131 122.884 69.3346C123.478 68.825 123.916 68.1583 124.148 67.4111L124.498 67.6409C124.329 68.7006 123.847 69.6856 123.114 70.4688C122.759 70.8797 122.318 71.2073 121.823 71.4284C121.327 71.6495 120.789 71.7585 120.246 71.7479C119.638 71.751 119.037 71.6222 118.484 71.3703C117.931 71.1184 117.44 70.7494 117.043 70.2889C116.112 69.2009 115.635 67.7969 115.709 66.3668C115.709 64.5932 116.164 63.2042 117.078 62.2099C117.506 61.7261 118.035 61.3414 118.627 61.0825C119.219 60.8237 119.86 60.6969 120.506 60.7111C121.038 60.6936 121.568 60.7867 122.063 60.9845C122.557 61.1823 123.005 61.4805 123.379 61.8602C123.761 62.2734 124.057 62.759 124.25 63.2884C124.442 63.8179 124.526 64.3804 124.498 64.9429L117.318 64.9529ZM117.318 64.2934H122.129C122.124 63.8141 122.043 63.3386 121.89 62.8844C121.715 62.474 121.421 62.1258 121.045 61.8852C120.699 61.6497 120.29 61.5227 119.871 61.5204C119.556 61.5225 119.244 61.5882 118.955 61.7135C118.666 61.8389 118.405 62.0213 118.187 62.2499C117.665 62.8028 117.357 63.5237 117.318 64.2834V64.2934Z" fill="black"/>
<path d="M147.58 67.4509C147.389 68.6537 146.812 69.7617 145.937 70.6086C145.207 71.3115 144.236 71.7084 143.224 71.7178C142.63 71.7112 142.046 71.5734 141.512 71.3142C140.978 71.0551 140.508 70.681 140.136 70.2189C139.217 69.0956 138.749 67.671 138.822 66.2218C138.789 65.4923 138.902 64.7636 139.152 64.0776C139.402 63.3916 139.786 62.7619 140.281 62.2248C140.723 61.7376 141.263 61.3495 141.866 61.086C142.469 60.8225 143.12 60.6896 143.778 60.696C144.68 60.6627 145.565 60.9494 146.276 61.5054C146.559 61.6933 146.796 61.9428 146.969 62.2352C147.142 62.5277 147.247 62.8555 147.276 63.1941C147.28 63.323 147.258 63.4515 147.21 63.5711C147.161 63.6908 147.088 63.7989 146.996 63.8886C146.891 63.9817 146.768 64.053 146.635 64.0984C146.502 64.1439 146.361 64.1625 146.221 64.1534C146.033 64.1648 145.844 64.1319 145.671 64.0573C145.497 63.9826 145.343 63.8684 145.222 63.7237C145.061 63.4474 144.973 63.1343 144.967 62.8144C144.946 62.4351 144.782 62.0779 144.508 61.8151C144.194 61.5732 143.804 61.4525 143.408 61.4754C143.06 61.464 142.714 61.534 142.397 61.6797C142.081 61.8254 141.803 62.0428 141.585 62.3148C140.939 63.1538 140.613 64.1952 140.665 65.2526C140.643 66.4126 140.961 67.5537 141.58 68.5351C141.825 68.9714 142.183 69.3338 142.616 69.5843C143.05 69.8348 143.542 69.9642 144.043 69.9591C144.78 69.963 145.493 69.6923 146.041 69.1996C146.581 68.6659 146.996 68.0192 147.256 67.306L147.58 67.4509Z" fill="black"/>
<path d="M164.987 55.29V62.8894C165.558 62.1977 166.233 61.5978 166.986 61.1107C167.437 60.8606 167.944 60.7267 168.46 60.721C169.001 60.7158 169.529 60.8916 169.959 61.2206C170.429 61.6155 170.758 62.1518 170.898 62.7495C171.081 63.6213 171.155 64.5125 171.118 65.4025V69.0798C171.089 69.5351 171.142 69.9918 171.273 70.4288C171.35 70.6108 171.485 70.762 171.657 70.8585C171.973 70.9913 172.315 71.0462 172.657 71.0183V71.428H167.575V71.0183H167.81C168.158 71.0505 168.507 70.9737 168.809 70.7985C169.011 70.6323 169.152 70.4038 169.209 70.149C169.24 69.7935 169.252 69.4366 169.244 69.0798V65.4025C169.282 64.6534 169.221 63.9026 169.064 63.1692C168.972 62.8478 168.775 62.5664 168.505 62.3698C168.23 62.1859 167.905 62.0933 167.575 62.105C167.171 62.1114 166.774 62.2123 166.416 62.3998C165.873 62.7119 165.386 63.114 164.977 63.5889V69.0848C164.947 69.5313 164.988 69.9798 165.097 70.4138C165.194 70.6015 165.348 70.7537 165.537 70.8485C165.892 70.9917 166.275 71.0515 166.656 71.0233V71.433H161.515V71.0233C161.89 71.042 162.264 70.9682 162.604 70.8085C162.773 70.7133 162.902 70.5609 162.969 70.3788C163.084 69.9577 163.13 69.5206 163.104 69.0848V59.6668C163.126 58.9362 163.097 58.2051 163.019 57.4784C162.995 57.27 162.904 57.0751 162.759 56.9238C162.626 56.8189 162.459 56.7657 162.289 56.7739C162.024 56.7967 161.763 56.8572 161.515 56.9538L161.355 56.5591L164.468 55.29H164.987Z" fill="black"/>
<path d="M189.449 62.92C190.668 61.4544 191.834 60.7217 192.947 60.7217C193.467 60.7073 193.979 60.8557 194.411 61.1463C194.872 61.5013 195.212 61.9899 195.385 62.5453C195.583 63.2229 195.667 63.9286 195.635 64.6338V69.0705C195.607 69.5228 195.661 69.9764 195.795 70.4095C195.878 70.5964 196.02 70.7508 196.199 70.8491C196.516 70.9791 196.858 71.0338 197.199 71.009V71.4187H192.072V71.009H192.287C192.635 71.0402 192.984 70.9634 193.286 70.7892C193.491 70.6247 193.634 70.3957 193.691 70.1397C193.735 69.785 193.75 69.4275 193.736 69.0705V64.8186C193.784 64.1125 193.657 63.4056 193.366 62.7601C193.241 62.5463 193.058 62.3723 192.837 62.2582C192.617 62.1442 192.369 62.0947 192.122 62.1156C191.223 62.1156 190.329 62.6153 189.434 63.6145V69.1104C189.401 69.549 189.443 69.9901 189.559 70.4145C189.649 70.6235 189.803 70.7986 189.999 70.9141C190.361 71.0422 190.745 71.0933 191.128 71.064V71.4737H186.002V71.064H186.232C186.429 71.0888 186.629 71.0654 186.816 70.9958C187.002 70.9262 187.168 70.8124 187.301 70.6643C187.529 70.1852 187.624 69.6537 187.576 69.1254V65.2683C187.599 64.5079 187.572 63.7469 187.496 62.99C187.469 62.7801 187.376 62.5842 187.231 62.4304C187.096 62.3281 186.93 62.2767 186.761 62.2855C186.5 62.2955 186.243 62.3531 186.002 62.4554L185.832 62.0457L188.965 60.7766H189.464L189.449 62.92Z" fill="black"/>
<path d="M215.989 60.7212C216.718 60.699 217.441 60.8501 218.099 61.1619C218.757 61.4737 219.332 61.9374 219.777 62.5148C220.574 63.5052 221.003 64.7411 220.991 66.0122C220.978 66.991 220.75 67.955 220.321 68.8352C219.948 69.7034 219.325 70.441 218.531 70.9543C217.738 71.4676 216.809 71.7335 215.864 71.718C215.136 71.7387 214.414 71.5784 213.762 71.2514C213.111 70.9244 212.551 70.441 212.132 69.8444C211.363 68.8264 210.952 67.5828 210.963 66.307C210.971 65.3166 211.214 64.3422 211.673 63.4641C212.051 62.6376 212.659 61.9375 213.424 61.4475C214.19 60.9576 215.08 60.6985 215.989 60.7012V60.7212ZM215.64 61.4606C215.212 61.466 214.794 61.5887 214.431 61.8154C213.969 62.1122 213.618 62.553 213.431 63.0694C213.16 63.8061 213.033 64.588 213.057 65.3727C213.022 66.7323 213.333 68.0785 213.961 69.2848C214.56 70.384 215.355 70.9286 216.339 70.9286C216.692 70.9328 217.04 70.8529 217.355 70.6956C217.671 70.5384 217.944 70.3082 218.153 70.0243C218.627 69.4147 218.867 68.3805 218.867 66.9016C218.867 65.0563 218.469 63.604 217.673 62.5448C217.45 62.2098 217.148 61.9351 216.793 61.7451C216.438 61.5551 216.042 61.4557 215.64 61.4556V61.4606Z" fill="black"/>
<path d="M238.967 55.29V69.0698C238.939 69.506 238.986 69.9438 239.107 70.3638C239.194 70.5747 239.349 70.7505 239.547 70.8635C239.896 71.0003 240.272 71.0566 240.646 71.0283V71.438H235.55V71.0283C235.89 71.0556 236.231 71.006 236.549 70.8834C236.735 70.766 236.878 70.5904 236.954 70.3838C237.081 69.9614 237.131 69.5199 237.104 69.0798V59.6318C237.126 58.9097 237.099 58.1869 237.024 57.4684C237.002 57.2636 236.912 57.0719 236.769 56.9238C236.643 56.8199 236.482 56.7664 236.319 56.7739C236.061 56.7884 235.807 56.8494 235.57 56.9538L235.38 56.5591L238.478 55.29H238.967Z" fill="black"/>
<path d="M259.807 60.7212C260.535 60.6999 261.258 60.8513 261.916 61.163C262.574 61.4748 263.149 61.9381 263.594 62.5149C264.391 63.5052 264.82 64.7411 264.808 66.0123C264.796 66.9911 264.567 67.955 264.139 68.8352C263.765 69.7034 263.142 70.441 262.349 70.9543C261.555 71.4677 260.627 71.7335 259.682 71.718C258.953 71.7401 258.23 71.5803 257.579 71.2532C256.927 70.9261 256.367 70.442 255.95 69.8444C255.181 68.8265 254.77 67.5828 254.78 66.3071C254.788 65.3166 255.032 64.3422 255.49 63.4642C255.867 62.6369 256.475 61.9361 257.241 61.446C258.007 60.9558 258.898 60.6972 259.807 60.7012V60.7212ZM259.452 61.4607C259.026 61.4662 258.609 61.5889 258.248 61.8154C257.786 62.1123 257.435 62.553 257.249 63.0695C256.975 63.8055 256.848 64.5879 256.874 65.3727C256.839 66.7323 257.15 68.0785 257.778 69.2848C258.378 70.384 259.172 70.9286 260.151 70.9286C260.505 70.9332 260.854 70.8535 261.17 70.6963C261.486 70.539 261.761 70.3086 261.97 70.0243C262.445 69.4147 262.685 68.3805 262.685 66.9016C262.685 65.0563 262.287 63.6041 261.49 62.5448C261.266 62.2088 260.962 61.9334 260.606 61.7434C260.249 61.5533 259.851 61.4545 259.447 61.4557L259.452 61.4607Z" fill="black"/>
<path d="M281.985 67.6312C281.381 67.3504 280.872 66.8988 280.521 66.3321C280.187 65.7759 280.014 65.1375 280.022 64.4885C280.019 63.9886 280.12 63.4935 280.321 63.0356C280.522 62.5776 280.816 62.167 281.186 61.8305C281.587 61.4565 282.059 61.1659 282.574 60.9755C283.088 60.7851 283.636 60.6987 284.184 60.7213C285.096 60.6979 285.995 60.9504 286.762 61.4458H288.96C289.151 61.4363 289.341 61.4463 289.53 61.4757C289.578 61.4916 289.617 61.5257 289.64 61.5707C289.695 61.6838 289.719 61.8098 289.71 61.9354C289.718 62.0742 289.699 62.2133 289.655 62.3451C289.623 62.3851 289.582 62.4161 289.535 62.435C289.345 62.467 289.152 62.4788 288.96 62.47H287.611C288.095 63.1637 288.31 64.009 288.218 64.8495C288.127 65.69 287.733 66.4687 287.112 67.0416C286.283 67.7591 285.209 68.128 284.114 68.0708C283.581 68.0683 283.052 67.9926 282.54 67.846C282.272 68.0556 282.044 68.311 281.865 68.6004C281.762 68.7662 281.702 68.9551 281.691 69.15C281.693 69.2221 281.71 69.293 281.742 69.3577C281.774 69.4223 281.819 69.4793 281.875 69.5248C282.089 69.678 282.342 69.7681 282.605 69.7846C282.82 69.8145 283.349 69.8395 284.194 69.8645C285.753 69.9045 286.762 69.9544 287.221 70.0244C287.856 70.0882 288.45 70.3627 288.91 70.8038C289.116 71.0092 289.278 71.2541 289.386 71.5237C289.494 71.7934 289.546 72.0822 289.54 72.3726C289.52 72.8354 289.402 73.2888 289.195 73.7029C288.987 74.1171 288.694 74.4827 288.336 74.7759C287.072 75.9092 285.415 76.5028 283.719 76.4296C282.415 76.4696 281.128 76.1218 280.022 75.4304C279.452 75.0507 279.167 74.6609 279.167 74.2512C279.17 74.0623 279.214 73.8764 279.297 73.7067C279.515 73.288 279.78 72.8957 280.087 72.5375C280.142 72.4676 280.526 72.0379 281.246 71.3134C280.939 71.145 280.658 70.9329 280.412 70.6839C280.255 70.5117 280.167 70.2873 280.167 70.0544C280.19 69.7212 280.302 69.4003 280.492 69.1251C280.916 68.5586 281.419 68.0555 281.985 67.6312ZM281.87 71.4184C281.559 71.7435 281.289 72.106 281.066 72.4976C280.897 72.7755 280.803 73.092 280.791 73.4169C280.807 73.6194 280.876 73.8141 280.992 73.9809C281.108 74.1478 281.266 74.2807 281.451 74.3662C282.459 74.8951 283.592 75.1386 284.728 75.0706C286.087 75.0706 287.097 74.8308 287.726 74.3512C287.998 74.1896 288.227 73.9659 288.396 73.6984C288.564 73.4309 288.667 73.1272 288.695 72.8123C288.701 72.6288 288.648 72.4484 288.544 72.2973C288.439 72.1463 288.289 72.0326 288.116 71.9729C287.358 71.7547 286.571 71.6552 285.783 71.6782C284.475 71.6609 283.169 71.5742 281.87 71.4184ZM283.959 61.2659C283.689 61.2635 283.421 61.3225 283.177 61.4385C282.933 61.5544 282.719 61.7244 282.55 61.9354C282.128 62.5331 281.928 63.2595 281.985 63.9889C281.924 64.9748 282.195 65.9529 282.755 66.7668C282.927 67.0025 283.152 67.1935 283.413 67.3239C283.674 67.4543 283.962 67.5203 284.254 67.5163C284.523 67.5228 284.79 67.4682 285.035 67.3566C285.28 67.2449 285.496 67.0791 285.668 66.8717C286.089 66.2815 286.287 65.5609 286.227 64.8382C286.288 63.8361 286.012 62.8424 285.443 62.0153C285.274 61.7799 285.051 61.5888 284.793 61.4583C284.535 61.3278 284.248 61.2618 283.959 61.2659Z" fill="black"/>
<path d="M307.272 60.7212V69.07C307.244 69.5078 307.291 69.9472 307.412 70.369C307.492 70.5778 307.639 70.7537 307.831 70.8686C308.147 70.9993 308.49 71.054 308.831 71.0285V71.4382H303.784V71.0285C304.124 71.0512 304.464 71.0018 304.784 70.8836C304.974 70.7679 305.12 70.5921 305.198 70.384C305.33 69.9626 305.383 69.5205 305.353 69.08V65.0829C305.376 64.3519 305.341 63.6201 305.248 62.8946C305.222 62.7063 305.136 62.5314 305.003 62.3949C304.867 62.2963 304.702 62.2469 304.534 62.255C304.269 62.2654 304.009 62.3229 303.764 62.4249L303.604 62.0152L306.737 60.7462L307.272 60.7212ZM306.327 55.2902C306.479 55.2882 306.628 55.3164 306.768 55.3731C306.908 55.4299 307.036 55.514 307.143 55.6206C307.25 55.7271 307.334 55.854 307.392 55.9938C307.449 56.1335 307.478 56.2833 307.477 56.4344C307.478 56.5856 307.449 56.7355 307.392 56.8754C307.334 57.0152 307.249 57.1422 307.142 57.2488C306.98 57.4095 306.775 57.5189 306.552 57.5631C306.328 57.6074 306.097 57.5845 305.886 57.4974C305.676 57.4104 305.496 57.263 305.369 57.0738C305.242 56.8846 305.174 56.6621 305.173 56.4344C305.172 56.2829 305.201 56.1327 305.259 55.9926C305.316 55.8525 305.401 55.7254 305.509 55.6187C305.617 55.5121 305.744 55.4281 305.885 55.3717C306.026 55.3152 306.176 55.2875 306.327 55.2902Z" fill="black"/>
<path d="M324.759 64.9529C324.673 66.2584 325.072 67.5496 325.878 68.5802C326.195 68.9862 326.599 69.3156 327.061 69.5439C327.523 69.7722 328.031 69.8937 328.546 69.8992C329.185 69.9115 329.81 69.7131 330.324 69.3346C330.917 68.8238 331.355 68.1575 331.588 67.4111L331.938 67.6409C331.768 68.6999 331.286 69.6843 330.554 70.4688C330.199 70.8798 329.757 71.2074 329.26 71.4285C328.764 71.6495 328.225 71.7586 327.681 71.7478C327.074 71.7507 326.473 71.6217 325.92 71.3698C325.367 71.1179 324.875 70.7492 324.479 70.2889C323.548 69.2009 323.07 67.7969 323.145 66.3668C323.145 64.5931 323.599 63.2042 324.514 62.2099C324.943 61.7257 325.472 61.3408 326.065 61.0819C326.657 60.8231 327.3 60.6965 327.946 60.711C328.478 60.6937 329.007 60.7868 329.501 60.9846C329.994 61.1825 330.442 61.4806 330.814 61.8602C331.198 62.273 331.495 62.7584 331.688 63.2878C331.881 63.8173 331.966 64.38 331.938 64.9429L324.759 64.9529ZM324.759 64.2934H329.565C329.563 63.8141 329.484 63.3384 329.33 62.8844C329.152 62.4761 328.859 62.1288 328.486 61.8852C328.139 61.651 327.73 61.5242 327.312 61.5204C326.996 61.523 326.683 61.5888 326.393 61.7141C326.103 61.8394 325.841 62.0216 325.623 62.2499C325.1 62.8022 324.794 63.5239 324.759 64.2834V64.2934Z" fill="black"/>
<path d="M352.913 60.7215V64.2589H352.538C352.387 63.4142 352.002 62.6286 351.429 61.9906C350.953 61.5828 350.341 61.3689 349.715 61.391C349.25 61.3692 348.793 61.5185 348.431 61.8107C348.283 61.9183 348.162 62.0576 348.075 62.2185C347.989 62.3793 347.94 62.5576 347.931 62.74C347.922 63.1345 348.051 63.5197 348.296 63.8292C348.694 64.2619 349.182 64.6029 349.725 64.8284L351.384 65.6328C352.919 66.3823 353.685 67.3682 353.682 68.5906C353.696 69.0292 353.606 69.4648 353.42 69.8623C353.235 70.2598 352.958 70.6081 352.613 70.8789C351.941 71.4429 351.092 71.7509 350.215 71.7483C349.477 71.7321 348.744 71.6178 348.036 71.4086C347.838 71.3395 347.631 71.3007 347.422 71.2936C347.332 71.2965 347.246 71.3261 347.174 71.3787C347.102 71.4312 347.047 71.5043 347.017 71.5884H346.642V67.8762H347.017C347.149 68.7843 347.573 69.6247 348.226 70.2694C348.765 70.7836 349.48 71.0731 350.225 71.0788C350.694 71.0977 351.153 70.9328 351.504 70.6191C351.662 70.4809 351.788 70.3103 351.874 70.1189C351.96 69.9275 352.004 69.7199 352.003 69.51C352.008 69.2643 351.962 69.0203 351.866 68.7938C351.77 68.5674 351.628 68.3637 351.449 68.1959C350.782 67.6487 350.044 67.1949 349.255 66.8469C348.444 66.4971 347.712 65.9873 347.102 65.3481C346.752 64.8774 346.575 64.3002 346.602 63.7143C346.592 63.3155 346.664 62.9189 346.816 62.5498C346.967 62.1808 347.194 61.8473 347.482 61.5709C347.783 61.2811 348.139 61.0552 348.53 60.9067C348.921 60.7581 349.337 60.6901 349.755 60.7065C350.264 60.7205 350.769 60.808 351.254 60.9663C351.504 61.0529 351.764 61.1099 352.028 61.1362C352.128 61.1433 352.227 61.115 352.308 61.0562C352.412 60.9582 352.494 60.8389 352.548 60.7065L352.913 60.7215Z" fill="black"/>
<path d="M359.183 8.9948V2.82439H356.885V2H362.421V2.82439H360.107V8.9948H359.183Z" fill="#231F20"/>
<path d="M363.34 8.9948V2H364.729L366.383 6.94133C366.532 7.40598 366.642 7.74573 366.712 7.97556C366.792 7.72075 366.917 7.35102 367.087 6.85639L368.756 2H370V8.9948H369.111V3.13915L367.082 8.9948H366.228L364.229 3.03923V8.9948H363.34Z" fill="#231F20"/>
</g>
<line x1="418.5" y1="91" x2="418.5" y2="1" stroke="#E7E7E7"/>
<path d="M689.289 19.2031C682.98 19.2031 676.812 21.0739 671.567 24.579C666.321 28.084 662.233 33.0658 659.818 38.8945C657.404 44.7232 656.772 51.1369 658.003 57.3245C659.234 63.5122 662.272 69.1959 666.733 73.657C671.194 78.1181 676.878 81.1561 683.065 82.3869C689.253 83.6177 695.667 82.986 701.495 80.5717C707.324 78.1574 712.306 74.0689 715.811 68.8232C719.316 63.5776 721.187 57.4104 721.187 51.1015C721.187 42.6415 717.826 34.528 711.844 28.5459C705.862 22.5638 697.748 19.2031 689.289 19.2031ZM689.289 70.2405C685.503 70.2405 681.803 69.118 678.655 67.015C675.508 64.912 673.055 61.9228 671.606 58.4256C670.158 54.9285 669.779 51.0802 670.517 47.3676C671.256 43.655 673.079 40.2448 675.755 37.5681C678.432 34.8915 681.842 33.0687 685.555 32.3302C689.267 31.5917 693.115 31.9707 696.613 33.4193C700.11 34.8679 703.099 37.321 705.202 40.4684C707.305 43.6158 708.428 47.3161 708.428 51.1015C708.428 56.1774 706.411 61.0455 702.822 64.6348C699.233 68.2241 694.364 70.2405 689.289 70.2405Z" fill="#8F8F8F"/>
<path d="M622.492 19.2031C616.183 19.2031 610.016 21.0739 604.77 24.579C599.524 28.084 595.436 33.0658 593.021 38.8945C590.607 44.7232 589.975 51.1369 591.206 57.3245C592.437 63.5122 595.475 69.1959 599.936 73.657C604.397 78.1181 610.081 81.1561 616.269 82.3869C622.456 83.6177 628.87 82.986 634.699 80.5717C640.527 78.1574 645.509 74.0689 649.014 68.8232C652.519 63.5776 654.39 57.4104 654.39 51.1015C654.39 46.9125 653.565 42.7646 651.962 38.8945C650.359 35.0244 648.009 31.508 645.047 28.5459C642.085 25.5839 638.569 23.2343 634.699 21.6312C630.829 20.0282 626.681 19.2031 622.492 19.2031ZM622.492 70.2405C618.706 70.2405 615.006 69.118 611.859 67.015C608.711 64.912 606.258 61.9228 604.809 58.4256C603.361 54.9285 602.982 51.0802 603.72 47.3676C604.459 43.655 606.282 40.2448 608.958 37.5681C611.635 34.8915 615.045 33.0687 618.758 32.3302C622.47 31.5917 626.319 31.9707 629.816 33.4193C633.313 34.8679 636.302 37.321 638.405 40.4684C640.508 43.6158 641.631 47.3161 641.631 51.1015C641.631 56.1774 639.614 61.0455 636.025 64.6348C632.436 68.2241 627.568 70.2405 622.492 70.2405Z" fill="#8F8F8F"/>
<path d="M488.898 19.2031C482.589 19.2031 476.422 21.0739 471.177 24.579C465.931 28.084 461.842 33.0658 459.428 38.8945C457.014 44.7232 456.382 51.1369 457.613 57.3245C458.844 63.5122 461.882 69.1959 466.343 73.657C470.804 78.1181 476.488 81.1561 482.675 82.3869C488.863 83.6177 495.277 82.986 501.105 80.5717C506.934 78.1574 511.916 74.0689 515.421 68.8232C518.926 63.5776 520.797 57.4104 520.797 51.1015C520.797 42.6415 517.436 34.528 511.454 28.5459C505.472 22.5638 497.358 19.2031 488.898 19.2031ZM488.898 70.2405C485.113 70.2405 481.413 69.118 478.265 67.015C475.118 64.912 472.665 61.9228 471.216 58.4256C469.768 54.9285 469.389 51.0802 470.127 47.3676C470.866 43.655 472.688 40.2448 475.365 37.5681C478.042 34.8915 481.452 33.0687 485.165 32.3302C488.877 31.5917 492.725 31.9707 496.223 33.4193C499.72 34.8679 502.709 37.321 504.812 40.4684C506.915 43.6158 508.037 47.3161 508.037 51.1015C508.037 56.1774 506.021 61.0455 502.432 64.6348C498.842 68.2241 493.974 70.2405 488.898 70.2405Z" fill="#714B67"/>
<path d="M581.214 0C579.522 0 577.899 0.672142 576.703 1.86856C575.506 3.06498 574.834 4.68768 574.834 6.37967V25.5187C569.088 21.2089 562.055 18.9648 554.874 19.1496C547.694 19.3345 540.786 21.9375 535.269 26.5372C529.752 31.137 525.949 37.4642 524.475 44.4944C523.002 51.5247 523.944 58.8465 527.15 65.2743C530.356 71.7022 535.638 76.8599 542.14 79.9123C548.642 82.9648 555.984 83.7333 562.977 82.0934C569.971 80.4536 576.206 76.5014 580.673 70.8767C585.141 65.252 587.579 58.2842 587.594 51.1012V6.37967C587.594 4.68768 586.921 3.06498 585.725 1.86856C584.529 0.672142 582.906 0 581.214 0ZM555.695 70.1764C551.91 70.1764 548.21 69.0539 545.062 66.9509C541.915 64.8479 539.462 61.8588 538.013 58.3616C536.564 54.8644 536.185 51.0161 536.924 47.3035C537.662 43.5909 539.485 40.1807 542.162 37.504C544.839 34.8274 548.249 33.0046 551.961 32.2661C555.674 31.5276 559.522 31.9066 563.019 33.3552C566.517 34.8038 569.506 37.2569 571.609 40.4043C573.712 43.5517 574.834 47.252 574.834 51.0374C574.834 56.1134 572.818 60.9814 569.229 64.5707C565.639 68.16 560.771 70.1764 555.695 70.1764Z" fill="#8F8F8F"/>
<defs>
<clipPath id="clip0_76_492">
<rect width="370" height="74.4297" fill="white" transform="translate(0 2)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 36 KiB

BIN
education_university_management/static/description/assets/icons/capture (1).png

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

BIN
education_university_management/static/description/assets/icons/check.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

BIN
education_university_management/static/description/assets/icons/chevron.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 310 B

5
education_university_management/static/description/assets/icons/close-icon.svg

@ -0,0 +1,5 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="Group">
<path id="Vector" d="M14 25.6666C7.55651 25.6666 2.33334 20.4434 2.33334 13.9999C2.33334 7.55642 7.55651 2.33325 14 2.33325C20.4435 2.33325 25.6667 7.55642 25.6667 13.9999C25.6667 20.4434 20.4435 25.6666 14 25.6666ZM14 23.3333C16.4754 23.3333 18.8493 22.3499 20.5997 20.5996C22.35 18.8492 23.3333 16.4753 23.3333 13.9999C23.3333 11.5246 22.35 9.1506 20.5997 7.40026C18.8493 5.64992 16.4754 4.66659 14 4.66659C11.5247 4.66659 9.15069 5.64992 7.40035 7.40026C5.65001 9.1506 4.66668 11.5246 4.66668 13.9999C4.66668 16.4753 5.65001 18.8492 7.40035 20.5996C9.15069 22.3499 11.5247 23.3333 14 23.3333ZM14 12.3503L17.2993 9.04975L18.9502 10.7006L15.6497 13.9999L18.9502 17.2993L17.2993 18.9501L14 15.6496L10.7007 18.9501L9.04984 17.2993L12.3503 13.9999L9.04984 10.7006L10.7007 9.04975L14 12.3503Z" fill="white"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 929 B

BIN
education_university_management/static/description/assets/icons/cogs.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

3
education_university_management/static/description/assets/icons/collabarate-icon.svg

@ -0,0 +1,3 @@
<svg width="32" height="32" viewBox="0 0 32 32" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M3.66675 6.66667C3.66675 5.74619 4.41294 5 5.33341 5H13.3334C14.2539 5 15.0001 5.74619 15.0001 6.66667V10.6667C15.0001 11.219 15.4478 11.6667 16.0001 11.6667C16.5524 11.6667 17.0001 11.219 17.0001 10.6667V6.66667C17.0001 4.64162 15.3585 3 13.3334 3H5.33341C3.30837 3 1.66675 4.64162 1.66675 6.66667V25.3333C1.66675 27.3584 3.30837 29 5.33341 29H13.3334C15.3585 29 17.0001 27.3584 17.0001 25.3333V21.3333C17.0001 20.781 16.5524 20.3333 16.0001 20.3333C15.4478 20.3333 15.0001 20.781 15.0001 21.3333V25.3333C15.0001 26.2538 14.2539 27 13.3334 27H5.33341C4.41294 27 3.66675 26.2538 3.66675 25.3333V6.66667ZM5.66675 9.33333C5.66675 8.04467 6.71142 7 8.00008 7H10.6667C11.9554 7 13.0001 8.04467 13.0001 9.33333V12V16V18.6667C13.0001 19.9553 11.9554 21 10.6667 21H8.00008C6.71142 21 5.66675 19.9553 5.66675 18.6667V16V12V9.33333ZM11.0001 9.33333V11H7.66675V9.33333C7.66675 9.14924 7.81599 9 8.00008 9H10.6667C10.8508 9 11.0001 9.14924 11.0001 9.33333ZM11.0001 13H7.66675V15H11.0001V13ZM7.66675 17V18.6667C7.66675 18.8508 7.81599 19 8.00008 19H10.6667C10.8508 19 11.0001 18.8508 11.0001 18.6667V17H7.66675ZM25.6667 9.33333C25.6667 8.04467 26.7114 7 28.0001 7H29.3334C29.8857 7 30.3334 7.44772 30.3334 8C30.3334 8.55228 29.8857 9 29.3334 9H28.0001C27.816 9 27.6667 9.14924 27.6667 9.33333V11H29.3334C29.8857 11 30.3334 11.4477 30.3334 12C30.3334 12.5523 29.8857 13 29.3334 13H27.6667V15H29.3334C29.8857 15 30.3334 15.4477 30.3334 16C30.3334 16.5523 29.8857 17 29.3334 17H27.6667V18.6667C27.6667 18.8508 27.816 19 28.0001 19H29.3334C29.8857 19 30.3334 19.4477 30.3334 20C30.3334 20.5523 29.8857 21 29.3334 21H28.0001C26.7114 21 25.6667 19.9553 25.6667 18.6667V16V12V9.33333ZM28.2996 23.2862C28.6902 22.8957 29.3233 22.8957 29.7139 23.2862L29.7205 23.2929C30.111 23.6834 30.111 24.3166 29.7205 24.7071L29.7139 24.7138C29.3233 25.1043 28.6902 25.1043 28.2996 24.7138L28.293 24.7071C27.9025 24.3166 27.9025 23.6834 28.293 23.2929L28.2996 23.2862ZM9.71385 23.2862C9.32333 22.8957 8.69017 22.8957 8.29964 23.2862L8.29297 23.2929C7.90245 23.6834 7.90245 24.3166 8.29297 24.7071L8.29964 24.7138C8.69017 25.1043 9.32333 25.1043 9.71385 24.7138L9.72052 24.7071C10.111 24.3166 10.111 23.6834 9.72052 23.2929L9.71385 23.2862ZM15.0001 16C15.0001 15.4477 15.4478 15 16.0001 15H20.2525L19.293 14.0404C18.9025 13.6499 18.9025 13.0168 19.293 12.6262C19.6835 12.2357 20.3167 12.2357 20.7072 12.6262L23.3739 15.2929C23.7644 15.6834 23.7644 16.3166 23.3739 16.7071L20.7072 19.3738C20.3167 19.7643 19.6835 19.7643 19.293 19.3738C18.9025 18.9832 18.9025 18.3501 19.293 17.9596L20.2525 17H16.0001C15.4478 17 15.0001 16.5523 15.0001 16ZM25.3334 5C24.4129 5 23.6667 5.74619 23.6667 6.66667V9.33333C23.6667 9.88562 23.219 10.3333 22.6667 10.3333C22.1145 10.3333 21.6667 9.88562 21.6667 9.33333V6.66667C21.6667 4.64162 23.3084 3 25.3334 3H29.3334C29.8857 3 30.3334 3.44772 30.3334 4C30.3334 4.55228 29.8857 5 29.3334 5H25.3334ZM23.6667 22.6667C23.6667 22.1144 23.219 21.6667 22.6667 21.6667C22.1145 21.6667 21.6667 22.1144 21.6667 22.6667V25.3333C21.6667 27.3584 23.3084 29 25.3334 29H29.3334C29.8857 29 30.3334 28.5523 30.3334 28C30.3334 27.4477 29.8857 27 29.3334 27H25.3334C24.4129 27 23.6667 26.2538 23.6667 25.3333V22.6667Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 3.3 KiB

BIN
education_university_management/static/description/assets/icons/consultation.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

BIN
education_university_management/static/description/assets/icons/cybro-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

1
education_university_management/static/description/assets/icons/down.svg

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:svgjs="http://svgjs.com/svgjs" width="512" height="512" x="0" y="0" viewBox="0 0 24 24" style="enable-background:new 0 0 512 512" xml:space="preserve" class=""><g><g id="Layer_2" data-name="Layer 2"><path d="m12 1a11 11 0 1 0 11 11 11.013 11.013 0 0 0 -11-11zm5.707 9.707-5 5a1 1 0 0 1 -1.414 0l-5-5a1 1 0 0 1 1.414-1.414l4.293 4.293 4.293-4.293a1 1 0 0 1 1.414 1.414z" fill="#781d96" data-original="#000000" class=""></path></g></g></svg>

After

Width:  |  Height:  |  Size: 542 B

BIN
education_university_management/static/description/assets/icons/ecom-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 576 B

BIN
education_university_management/static/description/assets/icons/education-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

BIN
education_university_management/static/description/assets/icons/faq.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

10
education_university_management/static/description/assets/icons/feature-icon.svg

@ -0,0 +1,10 @@
<svg width="512" height="512" viewBox="0 0 512 512" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_63_485)">
<path d="M201.497 512C199.505 512 197.489 511.602 195.563 510.771C192.299 509.363 189.641 506.842 188.063 503.657C186.485 500.473 186.089 496.831 186.946 493.381L237.67 289.204H101.001C98.5637 289.204 96.1635 288.61 94.0076 287.474C91.8517 286.338 90.005 284.694 88.6274 282.684C87.2497 280.674 86.3825 278.358 86.1008 275.938C85.8191 273.517 86.1314 271.065 87.0106 268.792L187.272 9.58896C188.364 6.76572 190.285 4.33889 192.781 2.62746C195.278 0.916019 198.234 7.05455e-05 201.261 0L339.222 0C344.291 0 349.017 2.55999 351.787 6.80597C353.149 8.89601 353.969 11.2929 354.172 13.7797C354.375 16.2665 353.954 18.7646 352.949 21.0479L293.58 155.807H410.999C413.693 155.807 416.336 156.533 418.652 157.907C420.969 159.281 422.872 161.253 424.163 163.617C425.454 165.98 426.085 168.648 425.99 171.34C425.894 174.031 425.076 176.647 423.62 178.913L214.125 505.104C212.767 507.22 210.898 508.96 208.692 510.165C206.485 511.37 204.011 512.001 201.497 512Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_63_485">
<rect width="512" height="512" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
education_university_management/static/description/assets/icons/feature.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

10
education_university_management/static/description/assets/icons/gear.svg

@ -0,0 +1,10 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_48_635)">
<path d="M15.5549 16.005L18.4799 17.685L20.7299 13.785L17.8199 12.105C17.9399 11.58 17.9999 11.04 17.9999 10.485C17.9999 9.93 17.9249 9.39 17.8199 8.865L20.7299 7.185L18.4799 3.285L15.5549 4.965C14.7599 4.23 13.7999 3.69 12.7499 3.36V0H8.24991V3.39C7.19991 3.72 6.23991 4.275 5.44491 4.995L2.51991 3.315L0.284912 7.215L3.19491 8.895C3.07491 9.42 3.01491 9.96 3.01491 10.515C3.01491 11.07 3.08991 11.61 3.19491 12.135L0.284912 13.785L2.53491 17.685L5.45991 16.005C6.25491 16.74 7.21491 17.28 8.26491 17.61V21H12.7649V17.61C13.8149 17.28 14.7749 16.725 15.5699 16.005H15.5549ZM10.4999 7.5C12.1499 7.5 13.4999 8.85 13.4999 10.5C13.4999 12.15 12.1499 13.5 10.4999 13.5C8.84991 13.5 7.49991 12.15 7.49991 10.5C7.49991 8.85 8.84991 7.5 10.4999 7.5ZM32.9999 25.5C32.9999 24.945 32.9249 24.405 32.8199 23.88L35.7299 22.2L33.4799 18.3L30.5549 19.98C29.7599 19.245 28.7999 18.705 27.7499 18.375V14.985H23.2499V18.375C22.1999 18.705 21.2399 19.26 20.4449 19.98L17.5199 18.3L15.2699 22.2L18.1799 23.88C18.0599 24.405 17.9999 24.945 17.9999 25.5C17.9999 26.055 18.0749 26.595 18.1799 27.12L15.2699 28.8L17.5199 32.7L20.4449 31.02C21.2399 31.755 22.1999 32.295 23.2499 32.625V36.015H27.7499V32.625C28.7999 32.295 29.7599 31.74 30.5549 31.02L33.4799 32.7L35.7299 28.8L32.8199 27.12C32.9399 26.595 32.9999 26.055 32.9999 25.5ZM25.4999 28.5C23.8499 28.5 22.4999 27.15 22.4999 25.5C22.4999 23.85 23.8499 22.5 25.4999 22.5C27.1499 22.5 28.4999 23.85 28.4999 25.5C28.4999 27.15 27.1499 28.5 25.4999 28.5Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_48_635">
<rect width="36" height="36" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
education_university_management/static/description/assets/icons/hero.gif

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 KiB

12
education_university_management/static/description/assets/icons/hire-odoo.svg

@ -0,0 +1,12 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_63_514)">
<path d="M35.5528 30.1866L35.4888 30.1001C34.1698 28.5729 32.5491 27.4542 30.9818 26.3735C30.342 25.932 29.205 25.2204 28.4006 24.648C30.2674 22.0121 31.2673 18.8605 31.2616 15.6305C31.2616 6.9982 24.2634 0 15.6305 0C6.9975 0 0 6.9982 0 15.6305C0 24.2627 6.9982 31.2616 15.6305 31.2616C18.8564 31.2665 22.0042 30.2687 24.6382 28.4062C25.2113 29.2099 25.9221 30.3448 26.3644 30.9846C27.4479 32.5547 28.568 34.1719 30.0938 35.4895L30.1802 35.5528C30.6668 35.8503 31.2271 36.0052 31.7974 36C32.6595 35.9973 33.49 35.6752 34.1283 35.0958L35.0719 34.1543L35.0944 34.1311C36.0991 33.0314 36.2918 31.3727 35.5528 30.1866ZM15.6305 27.1835C12.9572 27.1838 10.3666 26.2572 8.29999 24.5615C6.23339 22.8658 4.81869 20.5059 4.29696 17.8841C3.77523 15.2623 4.17875 12.5406 5.43876 10.183C6.69877 7.82531 8.7373 5.97748 11.207 4.95436C13.6767 3.93123 16.4248 3.79611 18.9829 4.57203C21.5411 5.34794 23.7511 6.98687 25.2363 9.20956C26.7215 11.4323 27.3901 14.1012 27.128 16.7615C26.866 19.4219 25.6897 21.9091 23.7994 23.7994C22.7292 24.8756 21.4561 25.7288 20.0539 26.3097C18.6517 26.8906 17.1482 27.1876 15.6305 27.1835Z" fill="white"/>
<path d="M15.6304 17.0723C18.1642 17.0723 20.2183 15.0182 20.2183 12.4844C20.2183 9.95055 18.1642 7.89648 15.6304 7.89648C13.0965 7.89648 11.0425 9.95055 11.0425 12.4844C11.0425 15.0182 13.0965 17.0723 15.6304 17.0723Z" fill="white"/>
<path d="M23.1884 20.8558C23.1196 20.2123 22.8316 19.6121 22.3728 19.1557C21.9122 18.694 21.3081 18.4029 20.66 18.3302C19.7115 18.2296 17.3553 18.1748 15.8879 18.1748C14.4205 18.1748 11.5327 18.2296 10.5835 18.3302C9.93556 18.4029 9.33159 18.6938 8.87069 19.155C8.4121 19.6114 8.12438 20.2117 8.05577 20.8551V20.8748C8.03327 21.0928 8.01991 21.2819 8.01147 21.4436C8.27125 21.7834 8.55311 22.1056 8.85522 22.4083C10.6527 24.2055 13.0905 25.2152 15.6323 25.2152C18.1741 25.2152 20.6119 24.2055 22.4094 22.4083C22.7068 22.1104 22.9846 21.7935 23.2412 21.4598C23.2306 21.2946 23.2151 21.1005 23.1919 20.8755L23.1884 20.8558Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_63_514">
<rect width="36" height="36" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

BIN
education_university_management/static/description/assets/icons/hotel-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

BIN
education_university_management/static/description/assets/icons/img.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

BIN
education_university_management/static/description/assets/icons/license.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

13
education_university_management/static/description/assets/icons/life-ring-icon.svg

@ -0,0 +1,13 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_32_1689)">
<path d="M10.4999 17.9999C10.5002 16.5303 10.9349 15.0936 11.7494 13.8704L4.26741 6.38843C1.51255 9.63015 0 13.7458 0 17.9999C0 22.2541 1.51255 26.3697 4.26741 29.6114L11.7494 22.1294C10.9349 20.9062 10.5002 19.4695 10.4999 17.9999Z" fill="white"/>
<path d="M31.7325 6.38843L24.2505 13.8704C25.0652 15.0935 25.4999 16.5303 25.4999 17.9999C25.4999 19.4695 25.0652 20.9063 24.2505 22.1294L31.7325 29.6114C34.4873 26.3697 35.9999 22.2541 35.9999 17.9999C35.9999 13.7458 34.4873 9.63015 31.7325 6.38843Z" fill="white"/>
<path d="M17.9999 25.5C16.5303 25.4997 15.0936 25.065 13.8704 24.2505L6.38843 31.7325C9.63015 34.4873 13.7458 35.9999 17.9999 35.9999C22.2541 35.9999 26.3697 34.4873 29.6114 31.7325L22.1294 24.2505C20.9062 25.065 19.4695 25.4997 17.9999 25.5Z" fill="white"/>
<path d="M17.9999 10.4999C19.4695 10.5002 20.9062 10.9349 22.1294 11.7494L29.6114 4.26741C26.3697 1.51255 22.2541 0 17.9999 0C13.7458 0 9.63015 1.51255 6.38843 4.26741L13.8704 11.7494C15.0936 10.9349 16.5303 10.5002 17.9999 10.4999Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_32_1689">
<rect width="36" height="36" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
education_university_management/static/description/assets/icons/lifebuoy.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

3
education_university_management/static/description/assets/icons/mail.svg

@ -0,0 +1,3 @@
<svg width="20" height="18" viewBox="0 0 20 18" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M1 0.75H19C19.2652 0.75 19.5196 0.846577 19.7071 1.01849C19.8946 1.19039 20 1.42355 20 1.66667V16.3333C20 16.5764 19.8946 16.8096 19.7071 16.9815C19.5196 17.1534 19.2652 17.25 19 17.25H1C0.734784 17.25 0.48043 17.1534 0.292893 16.9815C0.105357 16.8096 0 16.5764 0 16.3333V1.66667C0 1.42355 0.105357 1.19039 0.292893 1.01849C0.48043 0.846577 0.734784 0.75 1 0.75ZM18 4.63483L10.072 11.1432L2 4.61467V15.4167H18V4.63483ZM2.511 2.58333L10.061 8.69017L17.502 2.58333H2.511Z" fill="#7F54B3"/>
</svg>

After

Width:  |  Height:  |  Size: 600 B

BIN
education_university_management/static/description/assets/icons/manufacturing-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 673 B

BIN
education_university_management/static/description/assets/icons/notes.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

10
education_university_management/static/description/assets/icons/notification icon.svg

@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_36_1829)">
<path d="M20 17H22V19H2V17H4V10C4 7.87827 4.84285 5.84344 6.34315 4.34315C7.84344 2.84285 9.87827 2 12 2C14.1217 2 16.1566 2.84285 17.6569 4.34315C19.1571 5.84344 20 7.87827 20 10V17ZM9 21H15V23H9V21Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_36_1829">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 462 B

4
education_university_management/static/description/assets/icons/odoo-consultancy.svg

@ -0,0 +1,4 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M30.3242 28.2889C29.5991 26.131 26.7094 24.7803 24.6491 23.8749C23.842 23.5214 21.6075 22.9216 21.3389 21.9053C21.2428 21.5392 21.2558 21.194 21.3346 20.8631C21.2104 20.8869 21.0844 20.9009 20.9541 20.9009H19.6117C18.5399 20.9009 17.6691 20.029 17.6691 18.958C17.6691 17.8877 18.5403 17.0176 19.6117 17.0176H20.9541C21.3976 17.0176 21.8181 17.1677 22.1572 17.4356C22.6544 17.3693 23.1339 17.2631 23.581 17.1238C24.1682 15.8937 24.6261 14.4227 24.7287 13.1566C25.1668 7.73933 21.8458 4.56989 17.0841 5.11781C13.622 5.51633 11.5538 8.09789 11.3302 11.4214C11.1041 14.809 12.3602 17.311 13.6943 19.1463C14.2786 19.9487 14.8924 20.4646 14.7981 21.4316C14.6887 22.5749 13.4661 22.8935 12.5917 23.2449C11.5556 23.6611 10.4396 24.2925 9.91254 24.5845C8.09706 25.5871 6.10446 26.7945 5.65662 28.4462C4.66482 32.1067 8.01426 33.2155 10.7794 33.7274C13.1525 34.1651 15.8284 34.1997 18.0295 34.1997C22.0107 34.1997 29.1697 34.0402 30.3242 31.0475C30.6525 30.1983 30.5117 28.8451 30.3242 28.2889Z" fill="white"/>
<path d="M21.8037 18.4113C21.6215 18.1337 21.3101 17.9494 20.9548 17.9494H19.6124C19.0522 17.9494 18.6004 18.4019 18.6004 18.9592C18.6004 19.5186 19.0522 19.9719 19.6124 19.9719H20.9548C21.3468 19.9719 21.6795 19.7483 21.8472 19.425C23.7189 19.2778 25.3468 18.7061 26.4894 17.8619C26.7519 18.0311 27.0622 18.1301 27.397 18.1301H27.4812C28.4144 18.1301 29.1689 17.3748 29.1689 16.4406V13.0682C29.1689 12.3964 28.7751 11.8168 28.207 11.5475C27.9593 6.13204 23.4762 1.7998 17.9999 1.7998C12.5236 1.7998 8.03981 6.13204 7.79321 11.5475C7.22405 11.8172 6.83057 12.3964 6.83057 13.0682V16.4406C6.83057 17.3748 7.58585 18.1301 8.51681 18.1301H8.60213C9.53381 18.1301 10.2894 17.3748 10.2894 16.4406V13.0682C10.2894 12.4061 9.90677 11.8352 9.35057 11.559C9.59141 6.99604 13.3779 3.35896 17.9999 3.35896C22.6202 3.35896 26.4084 6.99604 26.6482 11.559C26.0927 11.8355 25.7104 12.4061 25.7104 13.0682V16.4406C25.7104 16.6646 25.754 16.873 25.8306 17.0678C24.8471 17.7716 23.4154 18.273 21.8037 18.4113Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

3
education_university_management/static/description/assets/icons/odoo-licencing.svg

@ -0,0 +1,3 @@
<svg width="36" height="35" viewBox="0 0 36 35" fill="none" xmlns="http://www.w3.org/2000/svg">
<path fill-rule="evenodd" clip-rule="evenodd" d="M7.5 4.40625C5.84315 4.40625 4.5 5.67087 4.5 7.23081V27.0027C4.5 28.5627 5.84315 29.8273 7.5 29.8273H28.5C30.1569 29.8273 31.5 28.5627 31.5 27.0027V7.23081C31.5 5.67087 30.1569 4.40625 28.5 4.40625H7.5ZM12 18.5291C12 17.749 11.3284 17.1168 10.5 17.1168C9.67157 17.1168 9 17.749 9 18.5291V24.1782C9 24.9582 9.67157 25.5905 10.5 25.5905C11.3284 25.5905 12 24.9582 12 24.1782V18.5291ZM18 12.8799C18.8284 12.8799 19.5 13.5122 19.5 14.2922V24.1782C19.5 24.9582 18.8284 25.5905 18 25.5905C17.1716 25.5905 16.5 24.9582 16.5 24.1782V14.2922C16.5 13.5122 17.1716 12.8799 18 12.8799ZM27 10.0554C27 9.27536 26.3284 8.64309 25.5 8.64309C24.6716 8.64309 24 9.27536 24 10.0554V24.1782C24 24.9582 24.6716 25.5905 25.5 25.5905C26.3284 25.5905 27 24.9582 27 24.1782V10.0554Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 926 B

BIN
education_university_management/static/description/assets/icons/odoo-logo.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

9
education_university_management/static/description/assets/icons/patter.svg

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 23 KiB

BIN
education_university_management/static/description/assets/icons/pattern1.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

BIN
education_university_management/static/description/assets/icons/photo-capture.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
education_university_management/static/description/assets/icons/pos-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 878 B

10
education_university_management/static/description/assets/icons/puzzle-piece-icon.svg

@ -0,0 +1,10 @@
<svg width="36" height="36" viewBox="0 0 36 36" fill="none" xmlns="http://www.w3.org/2000/svg">
<g id="puzzle-piece 1" clip-path="url(#clip0_226_336)">
<path id="Vector" d="M30 15.75C28.9888 15.7847 27.9837 15.9214 27 16.158V13.5C27 12.3065 26.5259 11.1619 25.682 10.318C24.8381 9.47411 23.6935 9 22.5 9H19.092C19.3296 8.01646 19.4663 7.01126 19.5 6C19.5 4.4087 18.8679 2.88258 17.7426 1.75736C16.6174 0.632141 15.0913 0 13.5 0C11.9087 0 10.3826 0.632141 9.25736 1.75736C8.13214 2.88258 7.5 4.4087 7.5 6C7.53374 7.01126 7.67045 8.01646 7.908 9H4.5C3.30653 9 2.16193 9.47411 1.31802 10.318C0.474106 11.1619 0 12.3065 0 13.5L0 36H9.804L9.45 34.5C9.19694 33.5182 9.04614 32.5128 9 31.5C9 30.3065 9.47411 29.1619 10.318 28.318C11.1619 27.4741 12.3065 27 13.5 27C14.6935 27 15.8381 27.4741 16.682 28.318C17.5259 29.1619 18 30.3065 18 31.5C17.9539 32.5128 17.8031 33.5182 17.55 34.5L17.1945 36H27V27.342C27.9837 27.5786 28.9888 27.7153 30 27.75C31.5913 27.75 33.1174 27.1179 34.2426 25.9926C35.3679 24.8674 36 23.3413 36 21.75C36 20.1587 35.3679 18.6326 34.2426 17.5074C33.1174 16.3821 31.5913 15.75 30 15.75Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_226_336">
<rect width="36" height="36" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

BIN
education_university_management/static/description/assets/icons/puzzle.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 653 B

10
education_university_management/static/description/assets/icons/replace-icon.svg

@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_36_1852)">
<path d="M7.5 0H3.5C1.57 0 0 1.57 0 3.5V11H11V3.5C11 1.57 9.43 0 7.5 0ZM8 8H3V3.5C3 3.22 3.22 3 3.5 3H7.5C7.78 3 8 3.22 8 3.5V8ZM20.5 13H16.5C14.57 13 13 14.57 13 16.5V24H24V16.5C24 14.57 22.43 13 20.5 13ZM21 21H16V16.5C16 16.22 16.22 16 16.5 16H20.5C20.78 16 21 16.22 21 16.5V21ZM24 8V11H21V8C21 7.45 20.55 7 20 7H18V10.56L13.83 6.29C13.39 5.85 13.39 5.14 13.83 4.7L18 0.44V4H20C22.21 4 24 5.79 24 8ZM10.17 17.64C10.61 18.08 10.61 18.79 10.17 19.23L6 23.5V20H4C1.79 20 0 18.21 0 16V13H3V16C3 16.55 3.45 17 4 17H6V13.38L10.17 17.65V17.64Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_36_1852">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 800 B

BIN
education_university_management/static/description/assets/icons/restaurant-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 905 B

BIN
education_university_management/static/description/assets/icons/screenshot-main.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 189 KiB

BIN
education_university_management/static/description/assets/icons/screenshot.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

BIN
education_university_management/static/description/assets/icons/service-black.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 839 B

10
education_university_management/static/description/assets/icons/skype-fill.svg

@ -0,0 +1,10 @@
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_15_1650)">
<path d="M13.31 20.4002C11.9877 20.6067 10.6353 20.4981 9.36293 20.0832C8.09054 19.6683 6.9341 18.9588 5.98776 18.0124C5.04141 17.0661 4.3319 15.9096 3.91698 14.6372C3.50206 13.3648 3.39345 12.0125 3.6 10.6902C3.07874 9.69867 2.88826 8.56644 3.05641 7.45897C3.22457 6.3515 3.74254 5.32684 4.53461 4.53477C5.32669 3.74269 6.35135 3.22472 7.45882 3.05657C8.56629 2.88841 9.69851 3.07889 10.69 3.60016C12.0123 3.39361 13.3647 3.50221 14.6371 3.91713C15.9095 4.33205 17.0659 5.04156 18.0123 5.98791C18.9586 6.93425 19.6681 8.09069 20.083 9.36308C20.498 10.6355 20.6066 11.9879 20.4 13.3102C20.9213 14.3016 21.1117 15.4339 20.9436 16.5413C20.7754 17.6488 20.2575 18.6735 19.4654 19.4655C18.6733 20.2576 17.6487 20.7756 16.5412 20.9437C15.4337 21.1119 14.3015 20.9214 13.31 20.4002ZM12.052 17.1562H12.012C14.884 17.1562 16.315 15.7702 16.315 13.9132C16.315 12.7152 15.764 11.4422 13.589 10.9552L11.606 10.5152C10.851 10.3432 9.984 10.1152 9.984 9.40016C9.984 8.68516 10.604 8.18716 11.708 8.18716C13.938 8.18716 13.735 9.71516 14.839 9.71516C15.415 9.71516 15.932 9.37316 15.932 8.78516C15.932 7.41516 13.735 6.38516 11.876 6.38516C9.85501 6.38516 7.703 7.24416 7.703 9.52916C7.703 10.6272 8.097 11.7992 10.263 12.3422L12.952 13.0132C13.768 13.2152 13.97 13.6722 13.97 14.0852C13.97 14.7722 13.286 15.4432 12.052 15.4432C9.635 15.4432 9.97401 13.5862 8.67801 13.5862C8.09801 13.5862 7.675 13.9842 7.675 14.5572C7.675 15.6712 9.027 17.1552 12.052 17.1552V17.1562Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_15_1650">
<rect width="24" height="24" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

BIN
education_university_management/static/description/assets/icons/skype.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.9 KiB

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save