From 1a8622fc80a8c49bcdb03aade3fcae0f82817d79 Mon Sep 17 00:00:00 2001 From: Cybrosys Technologies Date: Mon, 5 Aug 2024 14:57:33 +0530 Subject: [PATCH] Aug 05: [FIX] Bug Fixed 'hr_zk_attendance' --- hr_zk_attendance/__init__.py | 2 +- hr_zk_attendance/__manifest__.py | 4 +- hr_zk_attendance/doc/RELEASE_NOTES.md | 6 ++ hr_zk_attendance/models/__init__.py | 2 +- .../models/biometric_device_details.py | 38 ++++++- hr_zk_attendance/models/daily_attendance.py | 2 +- hr_zk_attendance/models/hr_employee.py | 2 +- .../models/zk_machine_attendance.py | 2 +- .../description/assets/screenshots/img7.png | Bin 0 -> 49450 bytes .../static/description/index.html | 94 +++++++++++++----- .../views/biometric_device_details_views.xml | 2 + 11 files changed, 120 insertions(+), 34 deletions(-) create mode 100644 hr_zk_attendance/static/description/assets/screenshots/img7.png diff --git a/hr_zk_attendance/__init__.py b/hr_zk_attendance/__init__.py index d9e93b8e8..d4013ea10 100644 --- a/hr_zk_attendance/__init__.py +++ b/hr_zk_attendance/__init__.py @@ -3,7 +3,7 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Copyright (C) 2024-TODAY Cybrosys Technologies(). # Author: Ammu Raj (odoo@cybrosys.com) # # You can modify it under the terms of the GNU AFFERO diff --git a/hr_zk_attendance/__manifest__.py b/hr_zk_attendance/__manifest__.py index 2bf81e5f0..2f8212d76 100644 --- a/hr_zk_attendance/__manifest__.py +++ b/hr_zk_attendance/__manifest__.py @@ -3,7 +3,7 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Copyright (C) 2024-TODAY Cybrosys Technologies(). # Author: Ammu Raj (odoo@cybrosys.com) # # You can modify it under the terms of the GNU AFFERO @@ -21,7 +21,7 @@ ################################################################################ { 'name': 'Biometric Device Integration', - 'version': '17.0.1.0.0', + 'version': '17.0.1.1.1', 'category': 'Human Resources', 'summary': "Integrating Biometric Device (Model: ZKteco uFace 202) With HR" "Attendance (Face + Thumb)", diff --git a/hr_zk_attendance/doc/RELEASE_NOTES.md b/hr_zk_attendance/doc/RELEASE_NOTES.md index 6da9a8e65..2b3f1672d 100755 --- a/hr_zk_attendance/doc/RELEASE_NOTES.md +++ b/hr_zk_attendance/doc/RELEASE_NOTES.md @@ -5,3 +5,9 @@ ##### ADD - Initial commit for Biometric Device Integration + +#### 31.07.2024 +#### Version 17.0.1.1.1 +##### UPDT + +- Added a new feature to Set the timezone for the device. diff --git a/hr_zk_attendance/models/__init__.py b/hr_zk_attendance/models/__init__.py index 6478dcf9f..b91b1a08c 100644 --- a/hr_zk_attendance/models/__init__.py +++ b/hr_zk_attendance/models/__init__.py @@ -3,7 +3,7 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Copyright (C) 2024-TODAY Cybrosys Technologies(). # Author: Ammu Raj (odoo@cybrosys.com) # # You can modify it under the terms of the GNU AFFERO diff --git a/hr_zk_attendance/models/biometric_device_details.py b/hr_zk_attendance/models/biometric_device_details.py index 0d07df37e..83b6b7b5a 100644 --- a/hr_zk_attendance/models/biometric_device_details.py +++ b/hr_zk_attendance/models/biometric_device_details.py @@ -3,7 +3,7 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Copyright (C) 2024-TODAY Cybrosys Technologies(). # Author: Ammu Raj (odoo@cybrosys.com) # # You can modify it under the terms of the GNU AFFERO @@ -74,6 +74,41 @@ class BiometricDeviceDetails(models.Model): } except Exception as error: raise ValidationError(f'{error}') + def action_set_timezone(self): + """Function to set user's timezone to device""" + for info in self: + machine_ip = info.device_ip + zk_port = info.port_number + try: + # Connecting with the device with the ip and port provided + zk = ZK(machine_ip, port=zk_port, timeout=15, + password=0, + force_udp=False, ommit_ping=False) + except NameError: + raise UserError( + _("Pyzk module not Found. Please install it" + "with 'pip3 install pyzk'.")) + conn = self.device_connect(zk) + if conn: + user_tz = self.env.context.get( + 'tz') or self.env.user.tz or 'UTC' + user_timezone_time = pytz.utc.localize(fields.Datetime.now()) + user_timezone_time = user_timezone_time.astimezone( + pytz.timezone(user_tz)) + conn.set_time(user_timezone_time) + return { + 'type': 'ir.actions.client', + 'tag': 'display_notification', + 'params': { + 'message': 'Successfully Set the Time', + 'type': 'success', + 'sticky': False + } + } + else: + raise UserError(_( + "Please Check the Connection")) + def action_clear_attendance(self): """Methode to clear record from the zk.machine.attendance model and @@ -129,6 +164,7 @@ class BiometricDeviceDetails(models.Model): _("Pyzk module not Found. Please install it" "with 'pip3 install pyzk'.")) conn = self.device_connect(zk) + self.action_set_timezone() if conn: conn.disable_device() # Device Cannot be used during this time. user = conn.get_users() diff --git a/hr_zk_attendance/models/daily_attendance.py b/hr_zk_attendance/models/daily_attendance.py index 1f114f931..550303310 100644 --- a/hr_zk_attendance/models/daily_attendance.py +++ b/hr_zk_attendance/models/daily_attendance.py @@ -3,7 +3,7 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Copyright (C) 2024-TODAY Cybrosys Technologies(). # Author: Ammu Raj (odoo@cybrosys.com) # # You can modify it under the terms of the GNU AFFERO diff --git a/hr_zk_attendance/models/hr_employee.py b/hr_zk_attendance/models/hr_employee.py index 08bd4a4d1..128a12b8e 100644 --- a/hr_zk_attendance/models/hr_employee.py +++ b/hr_zk_attendance/models/hr_employee.py @@ -3,7 +3,7 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Copyright (C) 2024-TODAY Cybrosys Technologies(). # Author: Ammu Raj (odoo@cybrosys.com) # # You can modify it under the terms of the GNU AFFERO diff --git a/hr_zk_attendance/models/zk_machine_attendance.py b/hr_zk_attendance/models/zk_machine_attendance.py index c9d4e0c8c..fbbc1abb2 100644 --- a/hr_zk_attendance/models/zk_machine_attendance.py +++ b/hr_zk_attendance/models/zk_machine_attendance.py @@ -3,7 +3,7 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Copyright (C) 2024-TODAY Cybrosys Technologies(). # Author: Ammu Raj (odoo@cybrosys.com) # # You can modify it under the terms of the GNU AFFERO diff --git a/hr_zk_attendance/static/description/assets/screenshots/img7.png b/hr_zk_attendance/static/description/assets/screenshots/img7.png new file mode 100644 index 0000000000000000000000000000000000000000..10d81882d51e1868102d53ce7de31b5892d2211c GIT binary patch literal 49450 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�asR&rKT`jJyy<;lFUTjLsJNC`cq%jAR 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