From 702431ce005ad0ec64c2b1e30b08511d29d9517b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Al=C3=ADcio=20Mussenga?= Date: Wed, 18 Mar 2026 23:15:57 +0100 Subject: [PATCH] =?UTF-8?q?Est=C3=A1=20=C3=A9=20a=20base=20do=20projeto=20?= =?UTF-8?q?que=20vamos=20nos=20basear?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- __manifest__.py | 31 +- __pycache__/__init__.cpython-313.pyc | Bin 205 -> 218 bytes models/__init__.py | 10 +- models/__pycache__/__init__.cpython-313.pyc | Bin 416 -> 313 bytes .../academic_applicant.cpython-313.pyc | Bin 0 -> 4149 bytes .../academic_course.cpython-313.pyc | Bin 0 -> 1446 bytes .../__pycache__/academic_exam.cpython-313.pyc | Bin 0 -> 1813 bytes .../__pycache__/academic_year.cpython-313.pyc | Bin 775 -> 0 bytes models/__pycache__/assessment.cpython-313.pyc | Bin 863 -> 0 bytes models/__pycache__/enrollment.cpython-313.pyc | Bin 1060 -> 0 bytes .../__pycache__/school_class.cpython-313.pyc | Bin 862 -> 0 bytes models/__pycache__/student.cpython-313.pyc | Bin 838 -> 0 bytes models/__pycache__/subject.cpython-313.pyc | Bin 745 -> 0 bytes models/__pycache__/teacher.cpython-313.pyc | Bin 744 -> 0 bytes models/academic_applicant.py | 79 +++++ models/academic_course.py | 28 ++ models/academic_exam.py | 35 ++ models/academic_year.py | 9 - models/assessment.py | 17 - models/enrollment.py | 26 -- models/school_class.py | 17 - models/student.py | 14 - models/subject.py | 12 - models/teacher.py | 9 - security/cefope_security_groups.xml | 31 ++ security/cefope_security_rules.xml | 34 ++ security/groups.xml | 15 - security/ir.model.access.csv | 19 +- security/rules.xml | 10 - views/academic_applicant_views.xml | 106 ++++++ views/academic_course_views.xml | 59 ++++ views/academic_exam_views.xml | 69 ++++ views/academic_views.xml | 0 views/assessment_views.xml | 0 views/class_views.xml | 0 views/enrollment_views.xml | 0 views/menus.xml | 35 ++ views/school_views.xml | 313 ------------------ views/student_views.xml | 0 views/subject_views.xml | 0 views/teacher_views.xml | 0 41 files changed, 514 insertions(+), 464 deletions(-) create mode 100644 models/__pycache__/academic_applicant.cpython-313.pyc create mode 100644 models/__pycache__/academic_course.cpython-313.pyc create mode 100644 models/__pycache__/academic_exam.cpython-313.pyc delete mode 100644 models/__pycache__/academic_year.cpython-313.pyc delete mode 100644 models/__pycache__/assessment.cpython-313.pyc delete mode 100644 models/__pycache__/enrollment.cpython-313.pyc delete mode 100644 models/__pycache__/school_class.cpython-313.pyc delete mode 100644 models/__pycache__/student.cpython-313.pyc delete mode 100644 models/__pycache__/subject.cpython-313.pyc delete mode 100644 models/__pycache__/teacher.cpython-313.pyc create mode 100644 models/academic_applicant.py create mode 100644 models/academic_course.py create mode 100644 models/academic_exam.py delete mode 100644 models/academic_year.py delete mode 100644 models/assessment.py delete mode 100644 models/enrollment.py delete mode 100644 models/school_class.py delete mode 100644 models/student.py delete mode 100644 models/subject.py delete mode 100644 models/teacher.py create mode 100644 security/cefope_security_groups.xml create mode 100644 security/cefope_security_rules.xml delete mode 100644 security/groups.xml delete mode 100644 security/rules.xml create mode 100644 views/academic_applicant_views.xml create mode 100644 views/academic_course_views.xml create mode 100644 views/academic_exam_views.xml delete mode 100644 views/academic_views.xml delete mode 100644 views/assessment_views.xml delete mode 100644 views/class_views.xml delete mode 100644 views/enrollment_views.xml create mode 100644 views/menus.xml delete mode 100644 views/school_views.xml delete mode 100644 views/student_views.xml delete mode 100644 views/subject_views.xml delete mode 100644 views/teacher_views.xml diff --git a/__manifest__.py b/__manifest__.py index 3bb458c..f7497d1 100644 --- a/__manifest__.py +++ b/__manifest__.py @@ -1,17 +1,32 @@ +# -*- coding: utf-8 -*- { - 'name': 'Gestao Escolar', - 'version': '1.0', - 'summary': 'Sistema de Gestão Escolar', - 'author': 'Sebastiao', + 'name': 'Gestão Escolar Avançada - CEFOPE Core', + 'version': '1.0.0', + 'summary': 'Sistema de Gestão Escolar para as Instituíções de Angola', + 'description': """ + Módulo central do projeto CEFOPE: + - Gestão de Candidatos e Exames + - Configuração de Cursos e Turmas + - Controlo de Matrículas e Notas + """, + 'author': 'Hilaritech', 'category': 'Education', - 'depends': ['base'], + 'license': 'LGPL-3', + + 'depends': [ + 'base', + ], 'data': [ - 'security/groups.xml', + 'security/cefope_security_groups.xml', 'security/ir.model.access.csv', - 'views/school_views.xml', + 'views/academic_applicant_views.xml', + 'views/academic_course_views.xml', + 'views/academic_exam_views.xml', + 'views/menus.xml', ], 'installable': True, 'application': True, -} + 'auto_install': False, +} \ No newline at end of file diff --git a/__pycache__/__init__.cpython-313.pyc b/__pycache__/__init__.cpython-313.pyc index 58bcd692fcb0a7ed9d08a304acde7dac5c5783f2..181bb6089e72021f14e178376c718bb6060aa73c 100644 GIT binary patch delta 99 zcmX@hc#DzyGcPX}0}zN+?wrUSo delta 86 zcmcb`c$Sg-GcPX}0}#x6w`n4GkiD0FMt*LpetK$7aekg|O1^G!erZX*zDs^`X>Mv> oNwI!@N`Ah6a%pi%er|kXN=klSv3_o9X?#IZepYHp{=}7r03l}}9RL6T diff --git a/models/__init__.py b/models/__init__.py index a2369d6..f5a8fbe 100644 --- a/models/__init__.py +++ b/models/__init__.py @@ -1,7 +1,3 @@ -from . import student -from . import teacher -from . import academic_year -from . import school_class -from . import subject -from . import enrollment -from . import assessment +from . import academic_applicant +from . import academic_exam +from . import academic_course \ No newline at end of file diff --git a/models/__pycache__/__init__.cpython-313.pyc b/models/__pycache__/__init__.cpython-313.pyc index 31f2ca57bb75a77704486f2a601ba9942a671fc2..db4a6edc6daffe576961fd73a6c85fee7f8af070 100644 GIT binary patch delta 236 zcmZ3$ypxIdGcPX}0}yzu-IWq|zUuqNXzp~U3Gl+@hJ52L-`N^fZsd**EI{Nu3`T6>W7GPS}&_d5ZKe@EHBtJJk zF(oBGuUJ1hH7&m&H9k4ND0OleqnrZB43IPC8 CMn%T} literal 416 zcmXxfy-ve05C?EO->q6Uq^c}kI~2bFVqyXb33Xw!f^9Xal3aC;hdu}of!KJQNM(VA ztx{j0X9Je?&(C)5ET5*+F{AN){HWjQ`{ft^Bl^SXnefWiY|S6oJx9Lqj>r*4!7(|; zI5;6Em;|Tf6w~00oM9H6lXJ`$Y*Q>pKb+bx`HsZCoexi_WX zm{?T-G*UICwV}+tY>o0|W78otP5awqOy|a0zj|C21H+i^!Nf=EBlD5_D13}4-q?wf z4Nszi)`*R1EOaXkD+{g%aRR|hr^n0>MtPU!dyfIDom diff --git a/models/__pycache__/academic_applicant.cpython-313.pyc b/models/__pycache__/academic_applicant.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..083a8be61b5a735da3312a5dc1b91463a37c55d0 GIT binary patch literal 4149 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

0y pJ{mO0ZT>ENs_+EU@H$DWs`^5CN)ZF9pmv@^4*BlV|_{ literal 0 HcmV?d00001 diff --git a/models/__pycache__/academic_exam.cpython-313.pyc b/models/__pycache__/academic_exam.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..552fc969ce91ad5fc13ff669583faa411c500ae8 GIT binary patch literal 1813 zcmZ`)OH3O_7@qaoYlCf;Hx%;NQjqFM;F6Xq4-%B}5YPY;3n!3P)7>$wwBB)McBSA$ zWcAQSxgYo7d6q(3WK1GWPQx;<^wx}}IK>cV4nXv(6s++OZ)Un~| zcS4P5me`8t5{Ht>sX{Bb#B;dNiqs(<7b-5f_Nfs;n5i(;jIp?> zvV<9D+GcXK{cW>|hKLfTW+u(lb(OUMru$4x3t(EW$5{GYFX<*C1Bih$ePqn6*#D|yU!2GB%A zBGzjTu)eLq+y#-jV`GODU3>OEE*{F>mb17i8Y3Vp>rz7uhZuKk!Z|IsI5?0zx5IwG zFF3>x+=6T4{qOd_rG`U|hQ(U=9%yIp--uZ0V8Jg?R@{FU0N5BcOzdG}{6pD#9x&J6 z5-CRRg)SqGh;I|GR8G&}02{=Zrwr#}tOXo0Iho~FX`8=GZR~}eAehD_Y`YGmVl3@H zyYCk9p{#tMVx$^{yOC=8?_5+cW z6|r2W+&ztb2i^-Phpf2GT%gMO8V#^_DiHmaO^c;4Al8Wwkc57agBgVQM6#(D2_8^J zMD`TtI^1sd4v+}J9wNCn^+mXzqIJ}T<}V`TD;p=Mb!9aM%Kx3?30POW6YbJvgwn`B zTPUY2LjzQg_)Hd3=%*1xk;X)v6R#jNMr_I)E`1n=u=CrrNb(peS$$T{)1aDIl` zVG#y`=cz+!e*9YFJ34-C?1Q`=LXt%bI}Y`E-X;ZFB2W%S^3lfUk1KA;GLMyZm@Xq4 zx%1YDj-6Lg1E3tTLKXD7ci`dN?<4Pj-}_tcRyB9))yVCKbH8SW{!&rjU>zXn2eh2) z7b(l~VYDqvv|1K~5PFi%Sk}D|drggQSp}Ezz;k`#Q&1-wHh_`~z}!**QzJABDnl5P z{Soo$ZOlYmIuI!sU=p}M#pTwBIHR;Ek_&!7wg?j`yD_)Hjz}$Gf9ERoiD-!?6Q)e0 zR(x``2#Q8)SPyt-az*7lmx%B1s6aiI#RCjWW#It!=rfo%Zdq(l!sRa%lWWS7$CvcL zpTqS9s$~W%v$d|_%H3MFzcTkny5sT9M>h{HU3>A-!7{I=gUU<|WK)l(z8U>#xSF1d zc))z^{kT?5-vD0kdHmqfgM*RlFRoVgxyt;JhC2H8^j-bH7(ckNRBd0bEP$+MaBpRI zrIxx-OLf%rkvGYBk5*YaYD0Y&_xxSIrW>{PE48*xQ1oe)m7@&OTE5))eB;UGSBZDu z#A1o5x{9=+x}>74WJ1e1O~mD-HA>IqjzkqoEXhBSDCz$eLZl|6Uf*Wp0GG?dCE`d` c6y;AeTt&lwYnPO%Cm-)kel__I0{1Vc19|hk`M&ou^UaKFwK7s;IQks_Q1f@4 z%!V}u<1Gcwk&k@*7_~9rwgJW(T0(W?8_UQqb?~k|E4rLFN(Bb9Yr57*C$1swltnb* z(%y?{67ld-kB~V{#sdY;Q3nC`5g0y(l5c?Nm%!@SyVw3MDX`jz>09?PIEugiFMeaX z2<87OD!vWX?iJUO)dyh^(KHTU&;UmII7c^m*kded1XHGQsHmgbOt_|%&s;1Wpa*#j zH2Q>g+?sR<$%2#;BFls*2l7PYDj^4XkW865LiS?dB8fAaF-2RG8l{RT4P3a5(=7bmf@PIr_3Rm>-f)VBd9wg>m8!2*$$3Sk5ks6|P|XGV|kE zq>Axz#CRG<2}!678`B)g3JDKbG)yC!FkNaFR@YC?9?*mcXQ>ZIp|EEv6gKu^>Zii! zD;Z)7W1jkH6ktD-$za z4|1!KR~tW#(v~^u-q>KhHf~-vbE}qDYtp-Jj@r`eY`p8d?R+eMsoa0vV)c39eb*4W zlEzevVmwAy-Oi%9I$*(WNF=Ps#q@XC9cjw90(ebsHzf$+SJ3>WuR-_ytMSE$i{C)P GY33h;k>%(B diff --git a/models/__pycache__/enrollment.cpython-313.pyc b/models/__pycache__/enrollment.cpython-313.pyc deleted file mode 100644 index 25ff4bc8592995132873b36f1b5cb88a59fda656..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1060 zcmZ`&O>5LZ7@q7VX?ESO+Pd8e?bd>aJ#+(t2SEy@wn){2os&=)VlumpB$;(4DRe1x zLGa*3EtLKRz4}YUi_2UTJk?Wc_3k^#ZtKAYGV{F8Ja68w$$7b4MDVQt{N%6Z5c;8v z@nej@`7(ebgb~&rp$&~|8#$g^Kn=8raPB6;`E6~>96Md^ck>zMdRK25C(3B$q!}`g z211%0p9Y?AFZBpr1pEN(5!yyv!-(gw#`8GGb)4tMwz*aL*CoS{h>i_x-pg_8O2q`W zQbplPMFAI6MG+MB|3$G8zV=kZC0vF`C0ya{UTXRkmv&f>wndzH;3Fq+23ndlMa=!E+b@m2;0BHm(pXhne|khZuH(_rciVf^ z;r;T;$Xs{^W-G5+?YObOOQpGz?!XjW7WM)fQ%@FF$1vrc$fZG$@?*$LPy{41;n9wh z1o20-*{Vp3kjM!sA+ksa%rXfSE)nuFae~oFm5`3lMI87MjTjsosSl_;DqQaOVxL7^ zhtEsvi4*PJVG)(ZQ6Gr!Nh>W_q1w1gqN-F(0n>m&K`c^ja^ghD8-yt2yTpm1anF;O z3PSi41UQEmNo?=1klJ0icr04-*pgsL%lp zW%kuNzcr4%*)pWAvgay`tf$5k^^0ZssUBqNML^QJpN(vp-v(2IS2SQb&1;(W4K;u3 SGurIC-Q)fD`+pF?)blU4=N|U} diff --git a/models/__pycache__/school_class.cpython-313.pyc b/models/__pycache__/school_class.cpython-313.pyc deleted file mode 100644 index a1e05ecfc2855202f3096825b8bdb39c9a143cfa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 862 zcmZ`&&ui2`6rRZ@Y1|*J){5&we;_COmSluAL`URK*fryhjD5R>U{B*|>wB!}*$ z3xWqPYN71at5^RLy)ARG;Hej>RPW9tyVirwVe-BAzBlvDmzm32t&G(8e*P&8F+$&T zFd5buT&^o{iU=b332I}&Z3B!YR7ZCaF&c=J_VKPgX}bD8EEO2cj@h)%b5P zXVrl6e;Lutf@C(&<_QCv8xi{E6yFEWVJ~UeX%4oJeTs&DE zIrY&@U8QI3S8cd6S$C&tNmFYBy+dJ;wXH8_v9~^9!EPudokxZL>oBiE^;D3ktLdVI YG5(4cf11}NJ7@#lMV@vGdHNwfD6En$=SO;uxiK&t^Fld}CJQkOXe4Bz zAJQlgy~}un{uKNKt0(9XaqJJH%YSh5wcEy1#sxh>YqVo*W2EMUy-Wg=xU@q>UR z!i{N0Mx4E(5SZV)yVR#SI^ychEQ}IRw86YXvr1#UJ6mgvpP!enO}8i8r~R|?y>V++ zxjyYoI;U^WD)%AaAMd<&W6CCMX06TY>px7rZohrTZ?87*I;J#KZ(Nnhl`;3!Bg`96 sC(NT8fTZ;#7k-Ctf(u^)i48E{b&T;>wE5F0WBYx78hwa z!6Hqx2)4Gi{wH?FGzP3LI`cfk7~s!~lz!VE3Heg?~dztQxV1y^6tA{u}@GJ7kWys|M7_ zJkCj68YbO`)_DPs9-ezlm+@Cfvi zPcOYW(NWhMG;Xvbr?C{(|oOwC1t%_UZfX LyY4Tf;570N_ejD* diff --git a/models/__pycache__/teacher.cpython-313.pyc b/models/__pycache__/teacher.cpython-313.pyc deleted file mode 100644 index 6ef9f41963b6e7118d7a56ba36d8ec6c3ca66102..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 744 zcmah{zi-qq6t?rL;eHeW0;*Fb5E4U%HY^=bQ5RZ<-nBw?$CIp(xR;8FFBP3Vad*1E-4@d0^XyahRj)scvm9;% z<~tf(Ac6?)qkRl`-va9{T0{2`v3iKuLww{dNtf%EU1M-YPTfe+a>xVeReTc#TSA44>!Il4Jw1@}o z(MsT}E{Rjl^J5mpDTA5O^Kw-z_BLg`saBfkae$Q%?6k^&B_GjY&{006WmGUqRf|$B zyUGpjP{%t5pcG7J=SH`B8m7Ep;Yb&rmm3M+5WJE++~sjquu_VUC!B|I zB_uCslq9?qVZkao2L7Ds#JXo;qj_`u0!+Ub#uP<7(B?IocGf3*(;MrP!T0vH^X;?k z56+kN{mJgMbN#%3)_-%Lqf7W|4{j}wI1F6nm=}OKtQPAYm~T>FV|3Knw>47!qq>$m i(9= 10: + record.state = 'approved' + elif 0 < record.exam_score < 10: + record.state = 'rejected' \ No newline at end of file diff --git a/models/academic_course.py b/models/academic_course.py new file mode 100644 index 0000000..4c584ec --- /dev/null +++ b/models/academic_course.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +from odoo import fields, models + + +class AcademicCourse(models.Model): + _name = 'academic.course' + _description = 'Curso Académico' + _order = 'name' + + name = fields.Char(string="Nome do Curso", required=True) + code = fields.Char(string="Código do Curso", help="Ex: TI-01, MEC-02") + duration = fields.Integer(string="Duração (Anos)", default=4) + description = fields.Text(string="Descrição/Perfil de Saída") + + # Campo para definir se o curso está ativo para novas inscrições + active = fields.Boolean(string="Ativo", default=True) + + # Relacionamento: Um curso tem muitos candidatos + applicant_ids = fields.One2many( + 'academic.applicant', + 'course_id', + string="Candidatos Inscritos" + ) + + _sql_constraints = [ + ('name_unique', 'unique(name)', 'O nome do curso deve ser único!'), + ('code_unique', 'unique(code)', 'O código do curso deve ser único!') + ] \ No newline at end of file diff --git a/models/academic_exam.py b/models/academic_exam.py new file mode 100644 index 0000000..60f3e05 --- /dev/null +++ b/models/academic_exam.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from odoo import fields, models, api + + +class AcademicExam(models.Model): + _name = 'academic.exam' + _description = 'Exame de Acesso' + _order = 'date desc' + + name = fields.Char(string="Identificação do Exame", required=True, help="Ex: Exame de Informática - Sala 13") + date = fields.Datetime(string="Data e Hora", required=True) + room = fields.Char(string="Sala/Local", required=True) + capacity = fields.Integer(string="Capacidade Máxima", default=30) + + # Relacionamento com o curso (opcional, se o exame for por curso) + course_id = fields.Many2one('academic.course', string="Curso Relacionado") + + # Lista de candidatos inscritos neste exame específico + applicant_ids = fields.One2many( + 'academic.applicant', + 'exam_id', + string="Candidatos Inscritos" + ) + + # Campo calculado para saber quantos já estão inscritos + applicant_count = fields.Integer( + string="Total Inscritos", + compute='_compute_applicant_count', + store=True + ) + + @api.depends('applicant_ids') + def _compute_applicant_count(self): + for record in self: + record.applicant_count = len(record.applicant_ids) \ No newline at end of file diff --git a/models/academic_year.py b/models/academic_year.py deleted file mode 100644 index d0729c8..0000000 --- a/models/academic_year.py +++ /dev/null @@ -1,9 +0,0 @@ -from odoo import models, fields - -class AcademicYear(models.Model): - _name = 'school.academic.year' - _description = 'Academic Year' - - name = fields.Char(required=True) - start_date = fields.Date() - end_date = fields.Date() diff --git a/models/assessment.py b/models/assessment.py deleted file mode 100644 index 4447f29..0000000 --- a/models/assessment.py +++ /dev/null @@ -1,17 +0,0 @@ -from odoo import models, fields - -class SchoolAssessment(models.Model): - _name = 'school.assessment' - _description = 'Assessment' - - enrollment_id = fields.Many2one( - 'school.enrollment', - string="Enrollment" - ) - - subject_id = fields.Many2one( - 'school.subject', - string="Subject" - ) - - grade = fields.Float(string="Grade") diff --git a/models/enrollment.py b/models/enrollment.py deleted file mode 100644 index d961bd8..0000000 --- a/models/enrollment.py +++ /dev/null @@ -1,26 +0,0 @@ -from odoo import models, fields - -class SchoolEnrollment(models.Model): - _name = 'school.enrollment' - _description = 'Enrollment' - - student_id = fields.Many2one( - 'cefope.student', - string="Student" - ) - - class_id = fields.Many2one( - 'school.class', - string="Class" - ) - - academic_year_id = fields.Many2one( - 'school.academic.year', - string="Academic Year" - ) - - status = fields.Selection([ - ('active','Active'), - ('completed','Completed'), - ('cancelled','Cancelled') - ], default='active') diff --git a/models/school_class.py b/models/school_class.py deleted file mode 100644 index cbc1b7f..0000000 --- a/models/school_class.py +++ /dev/null @@ -1,17 +0,0 @@ -from odoo import models, fields - -class SchoolClass(models.Model): - _name = 'school.class' - _description = 'Class' - - name = fields.Char(required=True) - - academic_year_id = fields.Many2one( - 'school.academic.year', - string="Academic Year" - ) - - teacher_id = fields.Many2one( - 'school.teacher', - string="Teacher" - ) diff --git a/models/student.py b/models/student.py deleted file mode 100644 index 131679c..0000000 --- a/models/student.py +++ /dev/null @@ -1,14 +0,0 @@ -from odoo import models, fields - -class Student(models.Model): - _name = 'cefope.student' - _description = 'Student' - - name = fields.Char(string="Name") - email = fields.Char(string="Email") - phone = fields.Char(string="Phone") - - user_id = fields.Many2one( - 'res.users', - string="User" - ) diff --git a/models/subject.py b/models/subject.py deleted file mode 100644 index 7409f35..0000000 --- a/models/subject.py +++ /dev/null @@ -1,12 +0,0 @@ -from odoo import models, fields - -class SchoolSubject(models.Model): - _name = 'school.subject' - _description = 'Subject' - - name = fields.Char(required=True) - - class_id = fields.Many2one( - 'school.class', - string="Class" - ) diff --git a/models/teacher.py b/models/teacher.py deleted file mode 100644 index 95da0bd..0000000 --- a/models/teacher.py +++ /dev/null @@ -1,9 +0,0 @@ -from odoo import models, fields - -class SchoolTeacher(models.Model): - _name = 'school.teacher' - _description = 'Teacher' - - name = fields.Char(required=True) - email = fields.Char() - phone = fields.Char() diff --git a/security/cefope_security_groups.xml b/security/cefope_security_groups.xml new file mode 100644 index 0000000..9e3126a --- /dev/null +++ b/security/cefope_security_groups.xml @@ -0,0 +1,31 @@ + + + Gestão Escolar CEFOPE + Níveis de acesso para o sistema escolar + 10 + + + + Administrador Escolar + + + + + + + Responsável Financeiro + + + + + + Professor + + + + + + Estudante + + + \ No newline at end of file diff --git a/security/cefope_security_rules.xml b/security/cefope_security_rules.xml new file mode 100644 index 0000000..0fcb9fb --- /dev/null +++ b/security/cefope_security_rules.xml @@ -0,0 +1,34 @@ + + + + + + Candidato: Ver apenas a sua própria ficha + + + [('user_id', '=', user.id)] + + + + Professor: Gerir apenas os seus exames + + + [('create_uid', '=', user.id)] + + + + Financeiro: Ver todos os candidatos + + + [(1, '=', 1)] + + + + Admin: Acesso Total + + + [(1, '=', 1)] + + + + \ No newline at end of file diff --git a/security/groups.xml b/security/groups.xml deleted file mode 100644 index f9a11c0..0000000 --- a/security/groups.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - Student - - - - Teacher - - - - School Manager - - - diff --git a/security/ir.model.access.csv b/security/ir.model.access.csv index b433f95..86feb0e 100644 --- a/security/ir.model.access.csv +++ b/security/ir.model.access.csv @@ -1,8 +1,13 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_student,access_student,model_cefope_student,,1,1,1,1 -access_teacher,access_teacher,model_school_teacher,,1,1,1,1 -access_academic_year,access_academic_year,model_school_academic_year,,1,1,1,1 -access_class,access_class,model_school_class,,1,1,1,1 -access_subject,access_subject,model_school_subject,,1,1,1,1 -access_enrollment,access_enrollment,model_school_enrollment,,1,1,1,1 -access_assessment,access_assessment,model_school_assessment,,1,1,1,1 +access_academic_applicant_admin,academic.applicant,model_academic_applicant,cefope_core.group_cefope_administrator,1,1,1,1 +access_academic_applicant_finance,academic.applicant,model_academic_applicant,cefope_core.group_cefope_finance,1,1,1,0 +access_academic_applicant_teacher,academic.applicant,model_academic_applicant,cefope_core.group_cefope_teacher,1,1,0,0 +access_academic_applicant_student,academic.applicant,model_academic_applicant,cefope_core.group_cefope_student,1,1,0,0 +access_academic_course_admin,academic.course,model_academic_course,cefope_core.group_cefope_administrator,1,1,1,1 +access_academic_course_finance,academic.course,model_academic_course,cefope_core.group_cefope_finance,1,0,0,0 +access_academic_course_teacher,academic.course,model_academic_course,cefope_core.group_cefope_teacher,1,0,0,0 +access_academic_course_student,academic.course,model_academic_course,cefope_core.group_cefope_student,1,0,0,0 +access_academic_exam_admin,academic.exam,model_academic_exam,cefope_core.group_cefope_administrator,1,1,1,1 +access_academic_exam_finance,academic.exam,model_academic_exam,cefope_core.group_cefope_finance,1,0,0,0 +access_academic_exam_teacher,academic.exam,model_academic_exam,cefope_core.group_cefope_teacher,1,1,1,1 +access_academic_exam_student,academic.exam,model_academic_exam,cefope_core.group_cefope_student,1,0,0,0 \ No newline at end of file diff --git a/security/rules.xml b/security/rules.xml deleted file mode 100644 index 07456ec..0000000 --- a/security/rules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - Student sees only his record - - - [('user_id','=',user.id)] - - - diff --git a/views/academic_applicant_views.xml b/views/academic_applicant_views.xml new file mode 100644 index 0000000..0b76ce8 --- /dev/null +++ b/views/academic_applicant_views.xml @@ -0,0 +1,106 @@ + + + + academic.applicant.list + academic.applicant + + + + + + + + + + + + + academic.applicant.form + academic.applicant + +

+
+
+ + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + + + Candidatos + academic.applicant + list,form + + \ No newline at end of file diff --git a/views/academic_course_views.xml b/views/academic_course_views.xml new file mode 100644 index 0000000..b031601 --- /dev/null +++ b/views/academic_course_views.xml @@ -0,0 +1,59 @@ + + + + academic.course.list + academic.course + + + + + + + + + + + + academic.course.form + academic.course + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + Cursos + academic.course + list,form + +
\ No newline at end of file diff --git a/views/academic_exam_views.xml b/views/academic_exam_views.xml new file mode 100644 index 0000000..9e55c07 --- /dev/null +++ b/views/academic_exam_views.xml @@ -0,0 +1,69 @@ + + + + academic.exam.list + academic.exam + + + + + + + + + + + + + academic.exam.calendar + academic.exam + + + + + + + + + + academic.academic.exam.form + academic.exam + +
+ +
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+
+ + + Exames de Acesso + academic.exam + list,calendar,form + +
\ No newline at end of file diff --git a/views/academic_views.xml b/views/academic_views.xml deleted file mode 100644 index e69de29..0000000 diff --git a/views/assessment_views.xml b/views/assessment_views.xml deleted file mode 100644 index e69de29..0000000 diff --git a/views/class_views.xml b/views/class_views.xml deleted file mode 100644 index e69de29..0000000 diff --git a/views/enrollment_views.xml b/views/enrollment_views.xml deleted file mode 100644 index e69de29..0000000 diff --git a/views/menus.xml b/views/menus.xml new file mode 100644 index 0000000..414dde2 --- /dev/null +++ b/views/menus.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/views/school_views.xml b/views/school_views.xml deleted file mode 100644 index 1fce6aa..0000000 --- a/views/school_views.xml +++ /dev/null @@ -1,313 +0,0 @@ - - - - - - - - - - - - - - student.list - cefope.student - - - - - - - - - - - - student.form - cefope.student - -
- - - - - - - - -
-
-
- - - Students - cefope.student - list,form - - - - - - - - - - teacher.list - school.teacher - - - - - - - - - - - teacher.form - school.teacher - -
- - - - - - - -
-
-
- - - Teachers - school.teacher - list,form - - - - - - - - - - academic.year.list - school.academic.year - - - - - - - - - - - academic.year.form - school.academic.year - -
- - - - - - - -
-
-
- - - Academic Years - school.academic.year - list,form - - - - - - - - - - class.list - school.class - - - - - - - - - - - class.form - school.class - -
- - - - - - - -
-
-
- - - Classes - school.class - list,form - - - - - - - - - - subject.list - school.subject - - - - - - - - - - subject.form - school.subject - -
- - - - - - -
-
-
- - - Subjects - school.subject - list,form - - - - - - - - - - enrollment.list - school.enrollment - - - - - - - - - - - - enrollment.form - school.enrollment - -
- - - - - - - - -
-
-
- - - Enrollments - school.enrollment - list,form - - - - - - - - - - assessment.list - school.assessment - - - - - - - - - - - assessment.form - school.assessment - -
- - - - - - - -
-
-
- - - Assessments - school.assessment - list,form - - - - -
diff --git a/views/student_views.xml b/views/student_views.xml deleted file mode 100644 index e69de29..0000000 diff --git a/views/subject_views.xml b/views/subject_views.xml deleted file mode 100644 index e69de29..0000000 diff --git a/views/teacher_views.xml b/views/teacher_views.xml deleted file mode 100644 index e69de29..0000000