Commit 7130e6f8 by aagusti

add manual member for examp

1 parent 8b48a444
...@@ -15,6 +15,7 @@ ...@@ -15,6 +15,7 @@
'views/etq_exam.xml', 'views/etq_exam.xml',
'views/etq_results.xml', 'views/etq_results.xml',
'views/exam_templates.xml', 'views/exam_templates.xml',
'views/etq_schedule.xml',
# 'views/etq_exam_share.xml', # 'views/etq_exam_share.xml',
], ],
'demo': [], 'demo': [],
......
import logging import logging
from odoo import http from odoo import http, _
import random import random
import uuid import uuid
from odoo.http import request from odoo.http import request
from werkzeug.utils import redirect from werkzeug.utils import redirect
from werkzeug.exceptions import NotFound
from datetime import datetime
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
...@@ -11,13 +13,22 @@ _logger = logging.getLogger(__name__) ...@@ -11,13 +13,22 @@ _logger = logging.getLogger(__name__)
class MyController(http.Controller): class MyController(http.Controller):
@http.route('/exam/title', type="http", auth="public", website=True) @http.route('/exam/title', type="http", auth="public", website=True)
def title_exam(self, **kwargs): def title_exam(self, **kwargs):
_logger.error(request.env.user) _logger.debug(request.env.user)
if request.env.user.name == 'Public user': if request.env.user.name == 'Public user':
return redirect("/web/login") return redirect("/web/login")
exams = \ schedule = \
http.request.env['etq.exam'].sudo().search( http.request.env['etq.schedule'].sudo().search(
[('active', '=', True)]) ['&',
('members', '=', request.env.user.partner_id.id),
('start_time', '<=', datetime.now()),
])
if not schedule:
raise NotFound(description=(_("Schedule Not Found")))
_logger.debug([tuple(schedule.exam_id.ids)])
exams = http.request.env['etq.exam'].sudo().search(
[('id', 'in', tuple(schedule.exam_id.ids))])
return request.render('exam_test_quiz.exam_title', {'exams': exams}) return request.render('exam_test_quiz.exam_title', {'exams': exams})
@http.route('/exam/<exam_slug>', type="http", auth="public", website=True) @http.route('/exam/<exam_slug>', type="http", auth="public", website=True)
......
from . import etq_exam from . import etq_exam
from . import etq_results from . import etq_results
from . import etq_exam_share from . import etq_exam_share
from . import etq_schedule
\ No newline at end of file \ No newline at end of file
...@@ -16,7 +16,7 @@ _logger = logging.getLogger(__name__) ...@@ -16,7 +16,7 @@ _logger = logging.getLogger(__name__)
class EtqExam(models.Model): class EtqExam(models.Model):
_name = "etq.exam" _name = "etq.exam"
_description = "etq.exam" _description = "Exam"
name = fields.Char(string="Name", translate=True) name = fields.Char(string="Name", translate=True)
active = fields.Boolean(string="Active", default=True, required=True) active = fields.Boolean(string="Active", default=True, required=True)
slug = fields.Char(string="Slug", compute="slug_me", store="True") slug = fields.Char(string="Slug", compute="slug_me", store="True")
...@@ -59,7 +59,7 @@ class EtqExam(models.Model): ...@@ -59,7 +59,7 @@ class EtqExam(models.Model):
class EtqQuestion(models.Model): class EtqQuestion(models.Model):
_name = "etq.question" _name = "etq.question"
_description = "etq.question" _description = "Exam Question"
_rec_name = "question" _rec_name = "question"
exam_id = fields.Many2one('etq.exam', string="Exam ID") exam_id = fields.Many2one('etq.exam', string="Exam ID")
......
...@@ -15,7 +15,7 @@ _logger = logging.getLogger(__name__) ...@@ -15,7 +15,7 @@ _logger = logging.getLogger(__name__)
class EtqExamShare(models.Model): class EtqExamShare(models.Model):
_name = "etq.exam.share" _name = "etq.exam.share"
_description = "etq.exam.share" _description = "Exam Share"
exam_id = fields.Many2one('etq.exam', string="Exam") exam_id = fields.Many2one('etq.exam', string="Exam")
share_type = fields.Selection([('existing_contacts', 'Existing Contacts'), share_type = fields.Selection([('existing_contacts', 'Existing Contacts'),
......
from odoo import models, fields, api, _
from odoo.exceptions import ValidationError
import logging
# import requests
# from odoo.http import request
#
# # from datetime import datetime
# # from openerp.tools import html_escape as escape, ustr, image_resize_and_sharpen, image_save_for_web
# # import unicodedata
# # import re
_logger = logging.getLogger(__name__)
#
#
class EtqSchedule(models.Model):
_name = "etq.schedule"
_description = "Exam Schedule"
exam_id = fields.Many2one('etq.exam', string="Exam", required=True)
name = fields.Char(related='exam_id.name', store=True)
start_time = fields.Datetime()
end_time = fields.Datetime()
members = fields.Many2many('res.partner', 'etq_schedule_partner_rel',
'schedule_id', 'partner_id', string="Members")
active = fields.Boolean(default=True)
duration = fields.Char(compute="_compute_duration", string="Duration")
@api.depends('start_time', 'end_time')
def _compute_duration(self):
for row in self:
if not row.end_time or not row.start_time:
row.duration = ""
continue
duration = row.end_time - row.start_time
res = duration.days and f'{duration.days} day(s)' or ""
seconds = duration.seconds
_logger.debug(f"Second: {seconds}")
hour_flag = 60 * 60
hours = int(seconds / hour_flag)
seconds = seconds - hours * hour_flag
minutes = int(seconds / 60)
seconds = seconds - minutes * 60
_logger.debug(f"Second: {seconds}")
res += hours and f'{hours} hour(s) ' or ""
res += minutes and f'{minutes} minute(s) ' or ""
res += seconds and f'{seconds} second(s)' or ""
row.duration = res
@api.onchange('start_time', 'end_time')
def time_change(self):
if not self.end_time or not self.start_time:
return
if self.end_time < self.start_time:
raise ValidationError(_("End time must be greater then start time"))
self._compute_duration()
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<odoo> <odoo>
<data noupdate="0"> <data noupdate="0">
<!-- <record id="group_examp_admin" model="res.groups">-->
<!-- <field name="name">Examp Administrator</field>-->
<!-- <field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>-->
<!-- </record>-->
<!-- <record id="group_examp_user" model="res.groups">-->
<!-- <field name="name">Examp User</field>-->
<!-- <field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>-->
<!-- </record>-->
<record id="group_examp_admin" model="res.groups"> <record id="group_examp_admin" model="res.groups">
<field name="name">Examp Administrator</field> <field name="name">Examp Administrator</field>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/> <field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record> </record>
<record id="group_exam_admin" model="res.groups">
<field name="name">Exam Administrator</field>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record>
<record id="group_exam_committee" model="res.groups">
<field name="name">Exam Committee</field>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</record>
</data> </data>
</odoo> </odoo>
"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink" "id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
"access_etq_exam","access etq.exam","model_etq_exam","base.group_portal",1,0,0,0 "access_etq_exam","access etq.exam","model_etq_exam","base.group_public",1,0,0,0
"access_etq_question","access etq.question","model_etq_question","base.group_portal",1,0,0,0 "access_etq_question","access etq.question","model_etq_question","base.group_public",1,0,0,0
"access_etq_question_option","access etq.question.option","model_etq_question_option","base.group_portal",1,0,0,0 "access_etq_question_option","access etq.question.option","model_etq_question_option","base.group_public",1,0,0,0
"access_etq_question_option_blank","access etq.question.optionblank","model_etq_question_optionblank","base.group_portal",1,0,0,0 "access_etq_question_option_blank","access etq.question.optionblank","model_etq_question_optionblank","base.group_public",1,0,0,0
"access_etq_result","access etq.result","model_etq_result","base.group_portal",1,1,0,0 "access_etq_result","access etq.result","model_etq_result","base.group_public",1,1,0,0
"access_etq_result_question","access etq.result.question","model_etq_result_question","base.group_portal",1,1,0,0 "access_etq_result_question","access etq.result.question","model_etq_result_question","base.group_public",1,1,0,0
"access_etq_result_question_option","access etq.result.question.option","model_etq_result_question_option","base.group_portal",1,1,0,0 "access_etq_result_question_option","access etq.result.question.option","model_etq_result_question_option","base.group_public",1,1,0,0
"access_etq_exam_share","access etq.exam.share","model_etq_exam_share","base.group_portal",1,0,0,0 "access_etq_exam_share","access etq.exam.share","model_etq_exam_share","base.group_public",1,0,0,0
"access_etq_exam_group_examp_admin","access_group_examp_admin etq.exam","model_etq_exam","group_examp_admin",1,1,1,1 "access_committe_etq_exam","access etq.exam","model_etq_exam","group_exam_committee",1,0,0,0
"access_etq_question_group_examp_admin","access_group_examp_admin etq.question","model_etq_question","group_examp_admin",1,1,1,1 "access_committe_etq_schedule","access etq.schedule","model_etq_schedule","group_exam_committee",1,1,1,0
"access_etq_question_option_group_examp_admin","access_group_examp_admin etq.question.option","model_etq_question_option","group_examp_admin",1,1,1,1
"access_etq_question_option_blank_group_examp_admin","access_group_examp_admin etq.question.optionblank","model_etq_question_optionblank","group_examp_admin",1,1,1,1 "access_etq_exam_group_exam_admin","access_group_exam_admin etq.exam","model_etq_exam","group_exam_admin",1,1,1,1
"access_etq_result_group_examp_admin","access_group_examp_admin etq.result","model_etq_result","group_examp_admin",1,0,0,1 "access_etq_question_group_exam_admin","access_group_exam_admin etq.question","model_etq_question","group_exam_admin",1,1,1,1
"access_etq_result_question_group_examp_admin","access_group_examp_admin etq.result.question","model_etq_result_question","group_examp_admin",1,0,0,1 "access_etq_question_option_group_exam_admin","access_group_exam_admin etq.question.option","model_etq_question_option","group_exam_admin",1,1,1,1
"access_etq_result_question_option_group_examp_admin","access_group_examp_admin etq.result.question.option","model_etq_result_question_option","group_examp_admin",1,0,0,1 "access_etq_question_option_blank_group_exam_admin","access_group_exam_admin etq.question.optionblank","model_etq_question_optionblank","group_exam_admin",1,1,1,1
"access_etq_exam_share_group_examp_admin","access_group_examp_admin etq.exam.share","model_etq_exam_share","group_examp_admin",1,1,1,1 "access_etq_result_group_exam_admin","access_group_exam_admin etq.result","model_etq_result","group_exam_admin",1,0,0,1
"access_etq_result_question_group_exam_admin","access_group_exam_admin etq.result.question","model_etq_result_question","group_exam_admin",1,0,0,1
"access_etq_result_question_option_group_exam_admin","access_group_exam_admin etq.result.question.option","model_etq_result_question_option","group_exam_admin",1,0,0,1
"access_etq_exam_share_group_exam_admin","access_group_exam_admin etq.exam.share","model_etq_exam_share","group_exam_admin",1,1,1,1
"access_etq_schedule_group_exam_admin","access_group_exam_admin etq.schedule","model_etq_schedule","group_exam_admin",1,1,1,1
...@@ -48,8 +48,8 @@ ...@@ -48,8 +48,8 @@
attrs="{'invisible':[('fill_mode','!=','random')]}"/> attrs="{'invisible':[('fill_mode','!=','random')]}"/>
<field name="active" invisible="1"/> <field name="active" invisible="1"/>
<field name="questions"> <field name="questions">
<tree> <tree style="width:100% !important;">
<field name="question"/> <field name="question" style="width:100px !important;"/>
<field name="question_type"/> <field name="question_type"/>
<field name="num_options"/> <field name="num_options"/>
<field name="num_correct"/> <field name="num_correct"/>
......
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<record model="ir.ui.view" id="etq_schedule_filter">
<field name="name">etq.schedule.filter</field>
<field name="model">etq.schedule</field>
<field name="arch" type="xml">
<search string="Search Exam">
<field name="name"/>
<separator/>
<filter string="Archived" name="inactive" domain="[('active', '=', False)]"/>
</search>
</field>
</record>
<record model="ir.ui.view" id="etq_schedule_form_view">
<field name="name">Exam Scheule Form View</field>
<field name="model">etq.schedule</field>
<field name="arch" type="xml">
<form>
<sheet>
<div class="oe_button_box" name="button_box"/>
<widget name="web_ribbon" title="Archived" bg_color="bg-danger"
attrs="{'invisible': [('active', '=', True)]}"/>
<div class="oe_title col_12">
<group>
<h1>
<field name="exam_id"/>
</h1>
</group>
</div>
<group>
<field name="start_time"/>
<field name="end_time"/>
<field name="duration"/>
<field name="active" invisible="1"/>
<field name="members">
<tree style="width:100% !important;" string="Members">
<field name="name"/>
</tree>
</field>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.ui.view" id="etq_schedule_tree_view">
<field name="name">Exam Schedule Tree View</field>
<field name="model">etq.schedule</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="start_time"/>
<field name="end_time"/>
</tree>
</field>
</record>
<record model="ir.actions.act_window" id="etq_schedule_action">
<field name="name">Exams</field>
<field name="res_model">etq.schedule</field>
<field name="search_view_id" ref="etq_schedule_filter"/>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Create an exam schedule</p>
</field>
</record>
<record model="ir.actions.act_window" id="etq_schedule_action">
<field name="name">Schedule</field>
<field name="res_model">etq.schedule</field>
<field name="view_mode">tree,form</field>
<field name="help" type="html">
<p class="oe_view_nocontent_create">Scheduled Exam</p>
</field>
</record>
<menuitem id="etq_schedule_menu" name="Schedule" parent="etq_exam" action="etq_schedule_action"
sequence="23"/>
</data>
</odoo>
\ No newline at end of file \ No newline at end of file
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!