Skip to content

Commit 88bf1b9

Browse files
authored
Merge pull request #157 from INRIM/t_1332
[UPD] updated controllo_accessi_portale portal
2 parents c7195cc + b6ab941 commit 88bf1b9

22 files changed

Lines changed: 1783 additions & 1162 deletions

controllo_accessi_portale/__manifest__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
'data': [
1414
'security/security.xml',
1515
'views/partner_portals_views.xml',
16+
'views/badge_return_views.xml',
17+
'views/badge_release_views.xml',
1618
],
1719
'assets': {
1820
'web.assets_frontend': [
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1-
from . import portal
2-
from . import main
1+
from . import home
2+
from . import anagrafiche
3+
from . import badge_docs
4+
from . import badge_return
5+
from . import badge_release
Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import datetime
2+
from typing import Dict
3+
from pytz import UTC
4+
5+
from odoo import http
6+
from odoo.http import request
7+
from odoo.osv import expression
8+
from odoo.tools.misc import format_datetime
9+
from werkzeug.exceptions import Forbidden, NotFound
10+
11+
from .common import check_access_permission
12+
13+
14+
class PortalAnagrafiche(http.Controller):
15+
16+
@http.route('/anagrafiche', type='http', auth='user', website=True)
17+
def anagrafiche(self, **kwargs):
18+
user = request.env.user
19+
if not user.has_group('controllo_accessi_portale.inrim_access_portal'):
20+
raise NotFound()
21+
return request.render('controllo_accessi_portale.portal_partner_view', {})
22+
23+
@http.route('/get/anagrafiche', type='json', auth='user', website=True, csrf=False)
24+
def get_anagrafiche(self, limit: int, offset: int, query: str, filter: Dict, **kwargs):
25+
user = request.env.user
26+
today_at_00 = datetime.datetime.combine(datetime.date.today(), datetime.time.min).astimezone(UTC).replace(tzinfo=None)
27+
if not user.has_group('controllo_accessi_portale.inrim_access_portal'):
28+
raise Forbidden()
29+
search_domain = [("ca_tag_ids", "!=", False), ("last_access", ">=", today_at_00)]
30+
if query:
31+
search_domain = expression.AND([[("display_name", "ilike", query)], search_domain])
32+
if filter:
33+
if filter.get("internal"):
34+
search_domain = expression.AND([[("is_internal", "=", True)], search_domain])
35+
elif filter.get("external"):
36+
search_domain = expression.AND([[("is_external", "=", True)], search_domain])
37+
if filter.get("is_present"):
38+
search_domain = expression.AND([[("present", "=", "yes")], search_domain])
39+
if filter.get("pa_category_id"):
40+
search_domain = expression.AND([[("person_access_ids.ca_punto_accesso_category_id", "=", filter["pa_category_id"])], search_domain])
41+
records = request.env['ca.persona'].search(search_domain, limit=limit, offset=offset)
42+
count = request.env['ca.persona'].search_count(search_domain)
43+
access_map = {}
44+
if records:
45+
person_ids = records.ids
46+
access_domain = [
47+
('ca_persona_id', 'in', person_ids),
48+
('ca_punto_accesso_category_id', '!=', False),
49+
('typology', '=', 'stamping')
50+
]
51+
if filter and filter.get("pa_category_id"):
52+
access_domain = expression.AND([[("ca_punto_accesso_category_id", "=", filter["pa_category_id"])], access_domain])
53+
all_accesses = request.env['ca.anag_registro_accesso'].search_read(
54+
access_domain,
55+
fields=['ca_persona_id', 'datetime_event', 'direction', 'ca_punto_accesso_category_id'],
56+
order='datetime_event desc, id desc'
57+
)
58+
for acc in all_accesses:
59+
p_id = acc['ca_persona_id'][0]
60+
if p_id not in access_map:
61+
access_map[p_id] = acc
62+
data = {"items": [], "total": count}
63+
AccessModel = request.env['ca.anag_registro_accesso']
64+
direction_selection = dict(AccessModel.fields_get(['direction'])['direction']['selection'])
65+
cat_ids = set()
66+
for acc in access_map.values():
67+
if acc['ca_punto_accesso_category_id']:
68+
cat_ids.add(acc['ca_punto_accesso_category_id'][0])
69+
cat_names = {}
70+
if cat_ids:
71+
cats = request.env['ca.punto_accesso_category'].browse(cat_ids)
72+
for c in cats:
73+
cat_names[c.id] = c.display_name
74+
present_labels = dict(request.env['ca.persona'].fields_get(['present'])['present']['selection'])
75+
for record in records:
76+
row = {
77+
'id': record.id,
78+
'display_name': record.display_name,
79+
'fiscalcode': record.fiscalcode,
80+
'is_external': record.is_external,
81+
'is_internal': record.is_internal,
82+
'present': (record.present, present_labels.get(record.present)),
83+
'datetime_event': '',
84+
'last_reading_event': '',
85+
'event_direction': '',
86+
'event_punto_accesso': ''
87+
}
88+
last_access = access_map.get(record.id)
89+
if last_access:
90+
if last_access['datetime_event']:
91+
row['datetime_event'] = format_datetime(request.env, last_access['datetime_event'], tz=user.tz, lang_code=user.lang)
92+
raw_dir = last_access['direction']
93+
row['event_direction'] = direction_selection.get(raw_dir, raw_dir)
94+
cat_tuple = last_access['ca_punto_accesso_category_id']
95+
if cat_tuple:
96+
row['event_punto_accesso'] = cat_names.get(cat_tuple[0], cat_tuple[1])
97+
data["items"].append(row)
98+
return data
99+
100+
@http.route('/get/anagrafiche/ca_punto_accesso_category', type='json', auth='user', website=True, csrf=False)
101+
def anagrafiche_pa_category(self, **kwargs):
102+
user = request.env.user
103+
if not check_access_permission(user):
104+
raise NotFound()
105+
return request.env['ca.punto_accesso_category'].search([("ca_access_point_ids", "!=", False)]).read()
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
from odoo import http, _
2+
from odoo.http import request
3+
from werkzeug.exceptions import Forbidden, NotFound
4+
from .common import check_access_permission
5+
6+
7+
class PortalBadgeDocs(http.Controller):
8+
9+
@http.route('/badge_release_docs/<int:persona_id>', auth='user', type='http', website=True)
10+
def badge_release_docs_form(self, persona_id, **post):
11+
user = request.env.user
12+
if not check_access_permission(user):
13+
raise NotFound()
14+
15+
persona_obj = request.env['ca.persona'].browse(persona_id)
16+
if not persona_obj.exists():
17+
raise NotFound()
18+
19+
if post and request.httprequest.method == 'POST':
20+
return self._handle_docs_post(persona_obj, post)
21+
22+
return request.render('controllo_accessi_portale.badge_release_docs_view', {
23+
"persona_id": persona_obj.id, "errors": {}, "error_message": "", "values": {}
24+
})
25+
26+
@http.route('/get/badge_release_docs/tipo_documento', auth='user', type='json', website=True, csrf=False)
27+
def badge_release_tipo_documento(self, **kwargs):
28+
if not check_access_permission(request.env.user): raise Forbidden()
29+
return request.env['ca.tipo_doc_ident'].search([]).read()
30+
31+
def _handle_docs_post(self, persona_obj, post):
32+
req_fields = ["tipo_documento_id", "validity_start_date", "validity_end_date", "document_code", "issued_by"]
33+
errors = {f: 'missing' for f in req_fields if not post.get(f)}
34+
35+
values = {f: post.get(f) for f in req_fields}
36+
values['persona_id'] = persona_obj.id
37+
if values.get('tipo_documento_id'): values['tipo_documento_id'] = int(values['tipo_documento_id'])
38+
39+
if errors:
40+
return request.render('controllo_accessi_portale.badge_release_docs_view', {
41+
"persona_id": persona_obj.id, "errors": errors, "error_message": _('Some required fields are empty.'), "values": values
42+
})
43+
44+
request.env['ca.registra_doc_persona'].create(values).action_confirm()
45+
return request.redirect('/anagrafiche')
Lines changed: 130 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,130 @@
1+
import datetime
2+
from pytz import UTC
3+
from odoo import http, _
4+
from odoo.http import request
5+
from werkzeug.exceptions import Forbidden, NotFound
6+
from .common import check_access_permission
7+
8+
9+
class PortalBadgeRelease(http.Controller):
10+
11+
@http.route('/badge_release', auth='user', type='http', website=True)
12+
def badge_release_form(self, **post):
13+
user = request.env.user
14+
if not check_access_permission(user):
15+
raise NotFound()
16+
17+
if post and request.httprequest.method == 'POST':
18+
return self._handle_badge_release_post(post)
19+
20+
vals = {k: v for k, v in post.items()} if post else {}
21+
22+
return request.render('controllo_accessi_portale.badge_release_view', {
23+
"errors": {}, "error_message": "", "values": vals
24+
})
25+
26+
@http.route('/badge_release/submit', auth='user', type='http', website=True, methods=['POST'], csrf=False)
27+
def badge_release_submit(self, **kwargs):
28+
return self._handle_badge_release_post(kwargs)
29+
30+
def _handle_badge_release_post(self, post):
31+
vals = {
32+
'vat': post['vat'], 'ca_ente_name': post['ca_ente_name'], 'fiscalcode': post['fiscalcode'],
33+
'lastname': post['lastname'], 'name': post['name'], 'freshman': post['freshman'],
34+
'email': post['email'], 'mobile': post['mobile'], 'ref_domain': post.get('ref_domain'),
35+
}
36+
37+
if post.get('date_start'):
38+
vals['date_start'] = datetime.datetime.fromisoformat(post['date_start']).astimezone(UTC).replace(tzinfo=None)
39+
if post.get('date_end'):
40+
vals['date_end'] = datetime.datetime.fromisoformat(post['date_end']).astimezone(UTC).replace(tzinfo=None)
41+
42+
for key in ['persona_id', 'tipo_ente_azienda_id', 'azienda', 'ca_work_info_type_id', 'ca_title_id', 'ca_tag_id', 'parent_id']:
43+
if post.get(key) and post[key] != "":
44+
clean_key = 'ente_azienda' if key == 'azienda' else key
45+
vals[clean_key] = int(post[key])
46+
47+
REQ_FIELDS = ["lastname", "name", "fiscalcode", "tipo_ente_azienda_id", "ca_ente_name",
48+
"ca_work_info_type_id", "ca_title_id", "date_start", "date_end", "ca_tag_id"]
49+
50+
is_internal = False
51+
if vals.get('persona_id'):
52+
p = request.env['ca.persona'].browse(vals['persona_id'])
53+
if p.exists() and p.is_internal: is_internal = True
54+
55+
if not is_internal:
56+
REQ_FIELDS.extend(["ref_domain", "parent_id"])
57+
58+
errors = {f: 'missing' for f in REQ_FIELDS if not post.get(f)}
59+
if errors:
60+
return request.render('controllo_accessi_portale.badge_release_view', {
61+
"errors": errors, "error_message": _('Some required fields are empty.'), "values": post
62+
})
63+
64+
add_doc = not vals.get("persona_id")
65+
wiz = request.env['ca.registra_persona'].with_context(no_compute_tag_id_number=True).create(vals)
66+
wiz.action_confirm()
67+
if add_doc:
68+
return request.redirect(f"/badge_release_docs/{wiz.persona_id.id}")
69+
return request.redirect('/anagrafiche')
70+
71+
@http.route('/get/badge_release/init_data', auth='user', type='json', website=True)
72+
def get_badge_release_init_data(self, **kwargs):
73+
user = request.env.user
74+
if not check_access_permission(user):
75+
raise Forbidden()
76+
77+
Env = request.env
78+
79+
tags = Env['ca.tag'].search_read(
80+
[('in_use', '=', False), ('revoked', '=', False)],
81+
fields=['id', 'name', 'display_name', 'tag_code', 'temp', 'ca_proprieta_tag_ids']
82+
)
83+
84+
tag_domains = {
85+
'visitor': [Env.ref('inrim_anagrafiche.proprieta_tag_visitatore').id, Env.ref('inrim_anagrafiche.proprieta_tag_servizio').id],
86+
'internal': [Env.ref('inrim_anagrafiche.proprieta_tag_jolly').id, Env.ref('inrim_anagrafiche.proprieta_tag_definitivo').id],
87+
'temp': [Env.ref('inrim_anagrafiche.proprieta_tag_jolly').id]
88+
}
89+
90+
work_infos = Env['ca.work_info'].search_read(
91+
[('state', '=', 'active')],
92+
fields=['ca_persona_id', 'date_start', 'date_end', 'ca_work_info_type_id', 'ca_title_id']
93+
)
94+
95+
ids_hidden = [
96+
Env.ref('inrim_anagrafiche.tipo_ente_azienda_sede').id,
97+
Env.ref('inrim_anagrafiche.tipo_ente_azienda_sede_distaccata').id
98+
]
99+
100+
tipo_enti_hidden = Env['ca.tipo_ente_azienda'].search_read([('id', 'in', ids_hidden)], ['id', 'display_name'])
101+
102+
tipo_enti = Env['ca.tipo_ente_azienda'].search_read(
103+
[('id', 'not in', ids_hidden)],
104+
['id', 'name', 'display_name']
105+
)
106+
107+
return {
108+
'tags': tags,
109+
'tag_domains': tag_domains,
110+
'work_infos': work_infos,
111+
'titoli': Env['ca.titolo_persona'].search_read([], ['id', 'name', 'display_name', 'structured']),
112+
'work_info_types': Env['ca.work_info_type'].search_read([], ['id', 'name', 'display_name']),
113+
'enti_aziende': Env['ca.ente_azienda'].search_read([], ['id', 'name', 'display_name', 'vat', 'tipo_ente_azienda_id']),
114+
'tipo_enti_hidden_ids': [t['id'] for t in tipo_enti_hidden],
115+
'tipo_enti': tipo_enti,
116+
'persona_parent': Env['ca.persona'].search_read([('is_internal', '=', True)], ['id', 'display_name', 'present'])
117+
}
118+
119+
@http.route('/get/badge_release/ca_persona', auth='user', type='json', website=True)
120+
def badge_release_ca_persona(self, **kwargs):
121+
user = request.env.user
122+
if not check_access_permission(user):
123+
raise Forbidden()
124+
125+
fields = [
126+
'id', 'display_name', 'name', 'lastname', 'fiscalcode', 'email', 'mobile',
127+
'is_internal', 'freshman', 'ca_ente_azienda_ids', 'current_tag',
128+
'present'
129+
]
130+
return request.env['ca.persona'].search_read([], fields=fields)
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from odoo import http
2+
from odoo.http import request
3+
from werkzeug.exceptions import Forbidden, NotFound
4+
from .common import check_access_permission
5+
6+
7+
class PortalBadgeReturn(http.Controller):
8+
9+
@http.route('/badge_return', type='http', auth='user', website=True)
10+
def portal_badge_return(self, **kwargs):
11+
user = request.env.user
12+
if not check_access_permission(user):
13+
raise NotFound()
14+
return request.render('controllo_accessi_portale.badge_return_view', {})
15+
16+
@http.route('/badge_return/submit', auth='user', type='http', website=True, methods=['POST'], csrf=False)
17+
def badge_return_submit(self, **kwargs):
18+
tag_persona_id = int(kwargs['tag_id'])
19+
tag_persona = request.env['ca.tag_persona'].browse(tag_persona_id)
20+
if not tag_persona.exists():
21+
return request.redirect('/badge_return')
22+
23+
vals = {'ca_tag_id': tag_persona.id}
24+
wiz = request.env['ca.restituisci_badge'].create(vals)
25+
wiz.action_confirm()
26+
return request.redirect('/badge_return')
27+
28+
@http.route('/get/badge_return/tags', auth='user', type='json', website=True)
29+
def badge_return_tags(self, **kwargs):
30+
user = request.env.user
31+
if not check_access_permission(user):
32+
raise Forbidden()
33+
34+
records = request.env['ca.tag_persona'].search([
35+
('state', '=', "to_give_back"),
36+
('ca_tag_id.in_use', '=', True)
37+
])
38+
39+
ret = []
40+
for r in records:
41+
d = r.read(['ca_persona_id', 'ca_tag_id', 'temp', 'display_name'])[0]
42+
d['tag_code'] = r.ca_tag_id.tag_code
43+
ret.append(d)
44+
return ret
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
def check_access_permission(user):
2+
return (user.has_group('controllo_accessi.ca_portineria') or
3+
(user.has_group('controllo_accessi.ca_ru') or
4+
user.has_group('controllo_accessi_portale.inrim_access_portal')))
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
from odoo import http
2+
from odoo.addons.web.controllers.home import Home
3+
from odoo.http import request
4+
5+
6+
class CustomHome(Home):
7+
8+
def _get_redirect_url(self, user):
9+
""" Metodo unico per determinare la pagina di destinazione """
10+
if user.has_group('base.group_system'):
11+
return "/web"
12+
elif user.has_group('controllo_accessi_portale.inrim_access_portal'):
13+
return "/anagrafiche"
14+
return "/web"
15+
16+
def _login_redirect(self, uid, redirect=None):
17+
user = request.env['res.users'].sudo().browse(uid)
18+
return self._get_redirect_url(user)
19+
20+
@http.route('/web/login', type='http', auth="public", website=True)
21+
def web_login(self, redirect=None, **kw):
22+
response = super().web_login(redirect, **kw)
23+
if request.params.get('login_success'):
24+
user = request.env.user
25+
return request.redirect(self._get_redirect_url(user))
26+
return response
27+
28+
@http.route('/', type='http', auth="user", website=True)
29+
def home_redirect(self, **kwargs):
30+
return request.redirect(self._get_redirect_url(request.env.user))

0 commit comments

Comments
 (0)