File indexing completed on 2024-05-19 05:35:37

0001 # SPDX-License-Identifier: GPL-3.0-or-later
0002 # SPDX-FileCopyrightText: 2021 Anupam Basak <anupam.basak27@gmail.com>
0003 
0004 import os
0005 
0006 from PySide2.QtCore import QUrl, Slot, Property, Signal, QObject, QSortFilterProxyModel, Qt, QProcess
0007 from PySide2.QtQml import qmlRegisterType
0008 
0009 from PicoWizard.module import Module
0010 from PicoWizard.modules.timezone.timezonemodel import TimezoneModel
0011 from PicoWizard.utils.logger import Logger
0012 
0013 
0014 class Timezone(Module):
0015     log = Logger.getLogger(__name__)
0016     _filterText = ''
0017 
0018     def __init__(self, parent=None):
0019         super().__init__(__file__, parent)
0020 
0021         self._timezoneModel = TimezoneModel(parent)
0022         self._timezoneProxyModel = QSortFilterProxyModel(parent)
0023 
0024         self._timezoneProxyModel.setSourceModel(self._timezoneModel)
0025         self._timezoneProxyModel.setFilterRole(TimezoneModel.TzRole)
0026         self._timezoneProxyModel.setFilterCaseSensitivity(Qt.CaseInsensitive)
0027 
0028         self._timezoneProxyModel.setSortRole(TimezoneModel.TzRole)
0029         self._timezoneProxyModel.setSortCaseSensitivity(Qt.CaseInsensitive)
0030         self._timezoneProxyModel.sort(0, Qt.AscendingOrder)
0031 
0032     @staticmethod
0033     def registerTypes() -> None:
0034         qmlRegisterType(Timezone, 'PicoWizard', 1, 0, 'TimezoneModule')
0035 
0036     @staticmethod
0037     def qmlPath() -> QUrl:
0038         return QUrl(os.path.join(os.path.dirname(os.path.realpath(__file__)), "Timezone.qml"))
0039 
0040     @Slot(None, result=str)
0041     def moduleName(self) -> str:
0042         return self.tr("Timezone")
0043 
0044     @Signal
0045     def modelChanged(self):
0046         pass
0047 
0048     @Signal
0049     def filterTextChanged(self):
0050         pass
0051 
0052     def _getFilterText(self):
0053         return self._filterText
0054 
0055     def _setFilterText(self, text):
0056         self._filterText = text
0057         self._timezoneProxyModel.setFilterRegExp(text)
0058 
0059     @Property(QObject, notify=modelChanged)
0060     def model(self):
0061         return self._timezoneProxyModel
0062 
0063     @Slot(int, result=None)
0064     def setTimezone(self, tzIndex):
0065         timezone = self._timezoneProxyModel.data(self._timezoneProxyModel.index(tzIndex, 0), TimezoneModel.TzRole)
0066         self.log.debug(f'Selected Timezone : {timezone}')
0067         Module.__ENV__.insert('PICOWIZARD_TZ', timezone)
0068 
0069         process = QProcess(self)
0070         args = [
0071             '/usr/bin/ln',
0072             '-sf',
0073             os.path.join(
0074                 '/usr',
0075                 'share',
0076                 'zoneinfo',
0077                 timezone
0078             ),
0079             '/etc/localtime'
0080         ]
0081 
0082         process.start('/usr/bin/pkexec', args)
0083 
0084         process.finished.connect(lambda exitCode, exitStatus: self.tzCmdSuccess(exitCode, exitStatus))
0085         process.error.connect(lambda err: self.tzCmdFailed(err))
0086 
0087     def tzCmdSuccess(self, exitCode, exitStatus):
0088         self.log.info('Setting Timezone')
0089 
0090         if exitCode != 0:
0091             self.log.error('Failed to set timezone')
0092             self.setTimezoneFailed.emit()
0093             self.errorOccurred.emit("Failed to set Timezone")
0094         else:
0095             self.setTimezoneSuccess.emit()
0096 
0097     def tzCmdFailed(self, err):
0098         self.log.error('Failed to set timezone')
0099         self.log.error(err)
0100         self.setTimezoneFailed.emit()
0101         self.errorOccurred.emit("Failed to set Timezone")
0102 
0103     @Signal
0104     def setTimezoneSuccess(self):
0105         pass
0106 
0107     @Signal
0108     def setTimezoneFailed(self):
0109         pass
0110 
0111     filterText = Property(str, _getFilterText, _setFilterText, notify=filterTextChanged)