From d038e301d696a788c7b15d77e4a3b09124dcd484 Mon Sep 17 00:00:00 2001 From: odex Date: Sun, 7 Jul 2024 16:56:04 +0300 Subject: [PATCH 1/2] fix api hr mobile --- .../controllers/rest_api_v2/attendance.py | 4 +- .../odex_mobile/models/access_token.py | 5 ++- .../models/attendence_zone_config.py | 2 + .../odex_mobile/models/hr_employee.py | 2 +- odex25_mobile/odex_mobile/models/res_users.py | 19 +++++++++ odex25_mobile/odex_mobile/validator.py | 42 +++++++++++++++---- .../views/attendance_zone_config_view.xml | 17 ++++---- .../odex_web_app/models/access_token.py | 5 ++- 8 files changed, 73 insertions(+), 23 deletions(-) diff --git a/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py b/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py index 70375b037..e10a673c1 100644 --- a/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py +++ b/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py @@ -335,7 +335,9 @@ class AttendanceController(http.Controller): if now > last: diff = now - last diff = diff.seconds / 60 - auto = request.env.user.company_id.auto_checkout if request.env.user.company_id.auto_checkout > 0 else 5 + zone = http.request.env['attendance.zone'].search([('employee_ids', 'in', employee.id)]) + zone_general = http.request.env['attendance.zone'].search([('general', '=', True)]) + auto = zone.auto_checkout or zone_general.auto_checkout or request.env.user.company_id.auto_checkout or 20 if diff >= auto: attendance = http.request.env['attendance.attendance'].create({ 'employee_id': employee.id, diff --git a/odex25_mobile/odex_mobile/models/access_token.py b/odex25_mobile/odex_mobile/models/access_token.py index dfff1df61..8ed97b058 100644 --- a/odex25_mobile/odex_mobile/models/access_token.py +++ b/odex25_mobile/odex_mobile/models/access_token.py @@ -25,7 +25,10 @@ class JwtAccessToken(models.Model): token.is_expired = datetime.now() > token.expires def access_token_cron(self): - self.search([("is_expired", "=", True)]).unlink() + # self.search([("is_expired", "=", True)]).unlink() + current_time = datetime.now() + expired_tokens = self.search([('expires', '<', current_time)]) + expired_tokens.unlink() return True def set_env(self,env): diff --git a/odex25_mobile/odex_mobile/models/attendence_zone_config.py b/odex25_mobile/odex_mobile/models/attendence_zone_config.py index 4feae0abd..eeddb14ec 100644 --- a/odex25_mobile/odex_mobile/models/attendence_zone_config.py +++ b/odex25_mobile/odex_mobile/models/attendence_zone_config.py @@ -26,6 +26,8 @@ class AttendanceZone(models.Model): loc_ch_dist = fields.Integer('Location Change Distance - Meter', default=100) srv_ch_tmout = fields.Integer('Services Change Timeout - Minutes', default=5) + auto_checkout = fields.Integer(string="Auto Checkout After" ,default=10) + @api.constrains('start','end') def start_end(self): for rec in self: diff --git a/odex25_mobile/odex_mobile/models/hr_employee.py b/odex25_mobile/odex_mobile/models/hr_employee.py index 03bc31389..bfb7ec31e 100644 --- a/odex25_mobile/odex_mobile/models/hr_employee.py +++ b/odex25_mobile/odex_mobile/models/hr_employee.py @@ -13,7 +13,7 @@ class HrEmployee(models.Model): device_id = fields.Char(string="Employee Device ") fcm_token = fields.Char(string='FCM Token') attendance_log_ids = fields.One2many('attendance.log','employee_id',string="Attendance Log") - + message_sent = fields.Boolean(string="Message Sent", default=False) def user_push_notification(self, notification): url = "https://fcm.googleapis.com/fcm/send" header = { diff --git a/odex25_mobile/odex_mobile/models/res_users.py b/odex25_mobile/odex_mobile/models/res_users.py index 7b514f227..fde67073e 100644 --- a/odex25_mobile/odex_mobile/models/res_users.py +++ b/odex25_mobile/odex_mobile/models/res_users.py @@ -97,3 +97,22 @@ class Users(models.Model): groups.append("group_department_manager") return groups + + + @api.model + def create(self, vals): + res = super(Users, self).create(vals) + if 'password' in vals or vals.get('active') is False: + self._invalidate_tokens(res) + return res + + def write(self, vals): + result = super(Users, self).write(vals) + if 'password' in vals or 'active' in vals and not vals['active']: + self._invalidate_tokens(self) + return result + + def _invalidate_tokens(self, users): + token_model = self.env['jwt_provider.access_token'] + for user in users: + token_model.search([('user_id', '=', user.id)]).unlink() diff --git a/odex25_mobile/odex_mobile/validator.py b/odex25_mobile/odex_mobile/validator.py index 5afba63db..179427f5a 100644 --- a/odex25_mobile/odex_mobile/validator.py +++ b/odex25_mobile/odex_mobile/validator.py @@ -192,9 +192,17 @@ class Validator: _logger.error(traceback.format_exc()) except (jwt.InvalidTokenError, Exception) as e: - result['code'] = 497 - result['message'] = 'Token invalid or expired' - _logger.error(traceback.format_exc()) + record = request.env['jwt_provider.access_token'].sudo().search([ + ('token', '=', token) + ]) + if not record: + result['message'] = 'Token not found' + result['code'] = 497 + return result + else: + result['code'] = 498 + result['message'] = 'Token invalid' + _logger.error(traceback.format_exc()) return result def refresh_token(self, token): @@ -237,9 +245,17 @@ class Validator: _logger.error(traceback.format_exc()) except (jwt.InvalidTokenError, Exception) as e: - result['code'] = 497 - result['message'] = 'Token invalid' - _logger.error(traceback.format_exc()) + record = request.env['jwt_provider.access_token'].sudo().search([ + ('token', '=', token) + ]) + if not record: + result['message'] = 'Token not found' + result['code'] = 497 + return result + else: + result['code'] = 498 + result['message'] = 'Token invalid' + _logger.error(traceback.format_exc()) return result @@ -284,9 +300,17 @@ class Validator: return result except (jwt.InvalidTokenError, Exception) as e: - result['code'] = 497 - result['message'] = 'Token invalid' - _logger.error(traceback.format_exc()) + record = request.env['jwt_provider.access_token'].sudo().search([ + ('token', '=', token) + ]) + if not record: + result['message'] = 'Token not found' + result['code'] = 497 + return result + else: + result['code'] = 498 + result['message'] = 'Token invalid' + _logger.error(traceback.format_exc()) return result diff --git a/odex25_mobile/odex_mobile/views/attendance_zone_config_view.xml b/odex25_mobile/odex_mobile/views/attendance_zone_config_view.xml index 5ce8b9065..4b41912a7 100644 --- a/odex25_mobile/odex_mobile/views/attendance_zone_config_view.xml +++ b/odex25_mobile/odex_mobile/views/attendance_zone_config_view.xml @@ -15,10 +15,10 @@ - + - - + + @@ -29,8 +29,9 @@ - - + + + @@ -70,11 +71,7 @@ tree,form - + diff --git a/odex25_mobile/odex_web_app/models/access_token.py b/odex25_mobile/odex_web_app/models/access_token.py index dfff1df61..8ed97b058 100644 --- a/odex25_mobile/odex_web_app/models/access_token.py +++ b/odex25_mobile/odex_web_app/models/access_token.py @@ -25,7 +25,10 @@ class JwtAccessToken(models.Model): token.is_expired = datetime.now() > token.expires def access_token_cron(self): - self.search([("is_expired", "=", True)]).unlink() + # self.search([("is_expired", "=", True)]).unlink() + current_time = datetime.now() + expired_tokens = self.search([('expires', '<', current_time)]) + expired_tokens.unlink() return True def set_env(self,env): From b1ee49368137d34d469897e42b12b85d42f028c9 Mon Sep 17 00:00:00 2001 From: odex Date: Sun, 7 Jul 2024 17:11:11 +0300 Subject: [PATCH 2/2] fix api hr mobile --- .../controllers/rest_api_v2/attendance.py | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py b/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py index e10a673c1..9ad2f66f0 100644 --- a/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py +++ b/odex25_mobile/odex_mobile/controllers/rest_api_v2/attendance.py @@ -314,10 +314,12 @@ class AttendanceController(http.Controller): "You are not allowed to perform this operation. please check with one of your team admins"), success=False) try: + print("******************employee.message_sent:",employee.message_sent) if json.loads(body['in_zone']): records = employee.attendance_log_ids.sudo().filtered(lambda r: str(r.date) == str(datetime.today().date()) and r.old == False) for r in records: r.old = True + employee.message_sent = False return http_helper.response(message="Old Record Done", data={'status': True}) else: @@ -326,7 +328,6 @@ class AttendanceController(http.Controller): limit=1) if attendance.action == 'sign_in': records = employee.attendance_log_ids.sudo().filtered(lambda r: r.old == False and str(r.date) == str(datetime.today().date())) - # records = employee.attendance_log_ids.sudo().filtered(lambda r: r.old == False and r.date == str(datetime.today().date())) if records: n = len(records) last = records[n - 1] @@ -335,39 +336,43 @@ class AttendanceController(http.Controller): if now > last: diff = now - last diff = diff.seconds / 60 - zone = http.request.env['attendance.zone'].search([('employee_ids', 'in', employee.id)]) - zone_general = http.request.env['attendance.zone'].search([('general', '=', True)]) + zone = http.request.env['attendance.zone'].search([('employee_ids', 'in', employee.id)],limit=1) + zone_general = http.request.env['attendance.zone'].search([('general', '=', True)],limit=1) auto = zone.auto_checkout or zone_general.auto_checkout or request.env.user.company_id.auto_checkout or 20 if diff >= auto: attendance = http.request.env['attendance.attendance'].create({ 'employee_id': employee.id, - 'action':'sign_out', + 'action': 'sign_out', 'action_type': 'auto', 'name': fields.datetime.now(), - # 'device_id': body.get('device_id'), 'zone': "%s,%s" % (body.get('longitude'), body.get('latitude')), 'longitude': body.get('longitude'), 'latitude': body.get('latitude'), }) - msg = (_("Auto Checkout successfully")) - subject = (_("Auto Checkout")) + msg = _("Auto Checkout successfully") + subject = _("Auto Checkout") self.send_msg(employee, msg, subject) records = employee.attendance_log_ids.sudo().filtered( lambda r: str(r.date) == str(datetime.today().date()) and r.old == False) for r in records: r.old = True - return http_helper.response(message="Auto Checkout successfully", data={'status': True}) + employee.message_sent = False + return http_helper.response(message="Auto Checkout successfully", data={'status': True}) else: - msg = (_("You are out of attendance zone you will be auto sin out ")) - subject = (_("Auto Sign out")) - self.send_msg(employee, msg, subject) - return http_helper.response(message="Auto Checkout Fail and Send", data={'status': False}) + if not employee.message_sent: + msg = _("You are out of attendance zone you will be auto sign out") + subject = _("Auto Sign out") + self.send_msg(employee, msg, subject) + employee.message_sent = True + return http_helper.response(message="Auto Checkout Fail and Send", data={'status': False}) else: self.create_log(employee, body.get('longitude'), body.get('latitude')) - msg = (_("You are out of attendance zone you will be auto sin out ")) - subject = (_("Auto Sign out")) - self.send_msg(employee, msg, subject) - return http_helper.response(message="Auto Checkout Fail and Send", data={'status': False}) + if not employee.message_sent: + msg = _("You are out of attendance zone you will be auto sign out") + subject = _("Auto Sign out") + self.send_msg(employee, msg, subject) + employee.message_sent = True + return http_helper.response(message="Auto Checkout Fail and Send", data={'status': False}) else: return http_helper.response(message="You are not Checked in yet", data={'status': True}) except Exception as e: @@ -377,6 +382,7 @@ class AttendanceController(http.Controller): return http_helper.errcode(code=403, message=message) def send_msg(self, emp, msg, subject): + print("*****************************send") if emp.user_id.partner_id: partner_id = emp.user_id.partner_id partner_id.send_notification(subject, msg, data=None, all_device=True)