Commit 7130e6f8 by aagusti

add manual member for examp

1 parent 8b48a444
......@@ -15,6 +15,7 @@
'views/etq_exam.xml',
'views/etq_results.xml',
'views/exam_templates.xml',
'views/etq_schedule.xml',
# 'views/etq_exam_share.xml',
],
'demo': [],
......
import logging
from odoo import http
from odoo import http, _
import random
import uuid
from odoo.http import request
from werkzeug.utils import redirect
from werkzeug.exceptions import NotFound
from datetime import datetime
_logger = logging.getLogger(__name__)
......@@ -11,13 +13,22 @@ _logger = logging.getLogger(__name__)
class MyController(http.Controller):
@http.route('/exam/title', type="http", auth="public", website=True)
def title_exam(self, **kwargs):
_logger.error(request.env.user)
_logger.debug(request.env.user)
if request.env.user.name == 'Public user':
return redirect("/web/login")
exams = \
http.request.env['etq.exam'].sudo().search(
[('active', '=', True)])
schedule = \
http.request.env['etq.schedule'].sudo().search(
['&',
('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})
@http.route('/exam/<exam_slug>', type="http", auth="public", website=True)
......
from . import etq_exam
from . import etq_results
from . import etq_exam_share
from . import etq_schedule
\ No newline at end of file
......@@ -16,7 +16,7 @@ _logger = logging.getLogger(__name__)
class EtqExam(models.Model):
_name = "etq.exam"
_description = "etq.exam"
_description = "Exam"
name = fields.Char(string="Name", translate=True)
active = fields.Boolean(string="Active", default=True, required=True)
slug = fields.Char(string="Slug", compute="slug_me", store="True")
......@@ -59,7 +59,7 @@ class EtqExam(models.Model):
class EtqQuestion(models.Model):
_name = "etq.question"
_description = "etq.question"
_description = "Exam Question"
_rec_name = "question"
exam_id = fields.Many2one('etq.exam', string="Exam ID")
......
......@@ -15,7 +15,7 @@ _logger = logging.getLogger(__name__)
class EtqExamShare(models.Model):
_name = "etq.exam.share"
_description = "etq.exam.share"
_description = "Exam Share"
exam_id = fields.Many2one('etq.exam', string="Exam")
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"?>
<odoo>
<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">
<field name="name">Examp Administrator</field>
<field name="users" eval="[(4, ref('base.user_root')), (4, ref('base.user_admin'))]"/>
</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>
</odoo>
"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_question","access etq.question","model_etq_question","base.group_portal",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_blank","access etq.question.optionblank","model_etq_question_optionblank","base.group_portal",1,0,0,0
"access_etq_result","access etq.result","model_etq_result","base.group_portal",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_option","access etq.result.question.option","model_etq_result_question_option","base.group_portal",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","access etq.exam","model_etq_exam","base.group_public",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_public",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_public",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_public",1,1,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_etq_question_group_examp_admin","access_group_examp_admin etq.question","model_etq_question","group_examp_admin",1,1,1,1
"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_result_group_examp_admin","access_group_examp_admin etq.result","model_etq_result","group_examp_admin",1,0,0,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_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_exam_share_group_examp_admin","access_group_examp_admin etq.exam.share","model_etq_exam_share","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_committe_etq_schedule","access etq.schedule","model_etq_schedule","group_exam_committee",1,1,1,0
"access_etq_exam_group_exam_admin","access_group_exam_admin etq.exam","model_etq_exam","group_exam_admin",1,1,1,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_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_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_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 @@
attrs="{'invisible':[('fill_mode','!=','random')]}"/>
<field name="active" invisible="1"/>
<field name="questions">
<tree>
<field name="question"/>
<tree style="width:100% !important;">
<field name="question" style="width:100px !important;"/>
<field name="question_type"/>
<field name="num_options"/>
<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
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!