sugar-toolkit-gtk3/shell/controlpanel/control.py
2007-12-20 19:25:20 +01:00

479 lines
15 KiB
Python

# Copyright (C) 2007, One Laptop Per Child
#
# This library is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2 of the License, or (at your option) any later version.
#
# This library is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with this library; if not, write to the
# Free Software Foundation, Inc., 59 Temple Place - Suite 330,
# Boston, MA 02111-1307, USA.
#
#
# The language config is based on the system-config-language
# (http://fedoraproject.org/wiki/SystemConfig/language) tool
# and the timezone config on the system-config-date
# (http://fedoraproject.org/wiki/SystemConfig/date) tool.
# Parts of the code were reused.
#
import os
import string
import shutil
from gettext import gettext as _
import dbus
from sugar import profile
from sugar.graphics.xocolor import XoColor
NM_SERVICE_NAME = 'org.freedesktop.NetworkManager'
NM_SERVICE_PATH = '/org/freedesktop/NetworkManager'
NM_SERVICE_IFACE = 'org.freedesktop.NetworkManager'
NM_ASLEEP = 1
_COLORS = {'red': {'dark':'#b20008', 'medium':'#e6000a', 'light':'#ffadce'},
'orange': {'dark':'#9a5200', 'medium':'#c97e00', 'light':'#ffc169'},
'yellow': {'dark':'#807500', 'medium':'#be9e00', 'light':'#fffa00'},
'green': {'dark':'#008009', 'medium':'#00b20d', 'light':'#8bff7a'},
'blue': {'dark':'#00588c', 'medium':'#005fe4', 'light':'#bccdff'},
'purple': {'dark':'#5e008c', 'medium':'#7f00bf', 'light':'#d1a3ff'}
}
_MODIFIERS = ('dark', 'medium', 'light')
_TIMEZONE_CONFIG = '/etc/sysconfig/clock'
_LANGUAGES = {
'Afrikaans/South_Africa': 'af_ZA',
'Albanian': 'sq_AL.UTF-8',
'Arabic/Algeria': 'ar_DZ.UTF-8',
'Arabic/Bahrain': 'ar_BH.UTF-8',
'Arabic/Egypt': 'ar_EG.UTF-8',
'Arabic/India': 'ar_IN.UTF-8',
'Arabic/Iraq': 'ar_IQ.UTF-8',
'Arabic/Jordan': 'ar_JO.UTF-8',
'Arabic/Kuwait': 'ar_KW.UTF-8',
'Arabic/Lebanon': 'ar_LB.UTF-8',
'Arabic/Libyan_Arab_Jamahiriya': 'ar_LY.UTF-8',
'Arabic/Morocco': 'ar_MA.UTF-8',
'Arabic/Oman': 'ar_OM.UTF-8',
'Arabic/Qatar': 'ar_QA.UTF-8',
'Arabic/Saudi_Arabia': 'ar_SA.UTF-8',
'Arabic/Sudan': 'ar_SD.UTF-8',
'Arabic/Syrian_Arab_Republic': 'ar_SY.UTF-8',
'Arabic/Tunisia': 'ar_TN.UTF-8',
'Arabic/United_Arab_Emirates': 'ar_AE.UTF-8',
'Arabic/Yemen': 'ar_YE.UTF-8',
'Basque/Spain': 'eu_ES.UTF-8',
'Belarusian': 'be_BY.UTF-8',
'Bengali/BD': 'bn_BD.UTF-8',
'Bengali/India': 'bn_IN.UTF-8',
'Bosnian/Bosnia_and_Herzegowina': 'bs_BA',
'Breton/France': 'br_FR',
'Bulgarian': 'bg_BG.UTF-8',
'Catalan/Spain': 'ca_ES.UTF-8',
'Chinese/Hong_Kong': 'zh_HK.UTF-8',
'Chinese/P.R._of_China': 'zh_CN.UTF-8',
'Chinese/Taiwan': 'zh_TW.UTF-8',
'Cornish/Britain': 'kw_GB.UTF-8',
'Croatian': 'hr_HR.UTF-8',
'Czech': 'cs_CZ.UTF-8',
'Danish': 'da_DK.UTF-8',
'Dutch/Belgium': 'nl_BE.UTF-8',
'Dutch/Netherlands': 'nl_NL.UTF-8',
'English/Australia': 'en_AU.UTF-8',
'English/Botswana': 'en_BW.UTF-8',
'English/Canada': 'en_CA.UTF-8',
'English/Denmark': 'en_DK.UTF-8',
'English/Great_Britain': 'en_GB.UTF-8',
'English/Hong_Kong': 'en_HK.UTF-8',
'English/India': 'en_IN.UTF-8',
'English/Ireland': 'en_IE.UTF-8',
'English/New_Zealand': 'en_NZ.UTF-8',
'English/Philippines': 'en_PH.UTF-8',
'English/Singapore': 'en_SG.UTF-8',
'English/South_Africa': 'en_ZA.UTF-8',
'English/USA': 'en_US.UTF-8',
'English/Zimbabwe': 'en_ZW.UTF-8',
'Estonian': 'et_EE.UTF-8',
'Faroese/Faroe_Islands': 'fo_FO.UTF-8',
'Finnish': 'fi_FI.UTF-8',
'French/Belgium': 'fr_BE.UTF-8',
'French/Canada': 'fr_CA.UTF-8',
'French/France': 'fr_FR.UTF-8',
'French/Luxemburg': 'fr_LU.UTF-8',
'French/Switzerland': 'fr_CH.UTF-8',
'Galician/Spain': 'gl_ES.UTF-8',
'German/Austria': 'de_AT.UTF-8',
'German/Belgium': 'de_BE.UTF-8',
'German/Germany': 'de_DE.UTF-8',
'German/Luxemburg': 'de_LU.UTF-8',
'German/Switzerland': 'de_CH.UTF-8',
'Greek': 'el_GR.UTF-8',
'Greenlandic/Greenland': 'kl_GL.UTF-8',
'Gujarati/India': 'gu_IN.UTF-8',
'Hebrew/Israel': 'he_IL.UTF-8',
'Hindi/India': 'hi_IN.UTF-8',
'Hungarian': 'hu_HU.UTF-8',
'Icelandic': 'is_IS.UTF-8',
'Indonesian': 'id_ID.UTF-8',
'Irish': 'ga_IE.UTF-8',
'Italian/Italy': 'it_IT.UTF-8',
'Italian/Switzerland': 'it_CH.UTF-8',
'Japanese': 'ja_JP.UTF-8',
'Korean/Republic_of_Korea': 'ko_KR.UTF-8',
'Lao/Laos': 'lo_LA.UTF-8',
'Latvian/Latvia': 'lv_LV.UTF-8',
'Lithuanian': 'lt_LT.UTF-8',
'Macedonian': 'mk_MK.UTF-8',
'Malay/Malaysia': 'ms_MY.UTF-8',
'Maltese/malta': 'mt_MT.UTF-8',
'Manx/Britain': 'gv_GB.UTF-8',
'Marathi/India': 'mr_IN.UTF-8',
'Northern/Norway': 'se_NO',
'Norwegian': 'nb_NO.UTF-8',
'Norwegian,/Norway': 'nn_NO.UTF-8',
'Occitan/France': 'oc_FR',
'Oriya/India': 'or_IN.UTF-8',
'Persian/Iran': 'fa_IR.UTF-8',
'Polish': 'pl_PL.UTF-8',
'Portuguese/Brasil': 'pt_BR.UTF-8',
'Portuguese/Portugal': 'pt_PT.UTF-8',
'Punjabi/India': 'pa_IN.UTF-8',
'Romanian': 'ro_RO.UTF-8',
'Russian': 'ru_RU.UTF-8',
'Russian/Ukraine': 'ru_UA.UTF-8',
'Serbian': 'sr_CS.UTF-8',
'Serbian/Latin': 'sr_CS.UTF-8@Latn',
'Slovak': 'sk_SK.UTF-8',
'Slovenian/Slovenia': 'sl_SI.UTF-8',
'Spanish/Argentina': 'es_AR.UTF-8',
'Spanish/Bolivia': 'es_BO.UTF-8',
'Spanish/Chile': 'es_CL.UTF-8',
'Spanish/Colombia': 'es_CO.UTF-8',
'Spanish/Costa_Rica': 'es_CR.UTF-8',
'Spanish/Dominican_Republic': 'es_DO.UTF-8',
'Spanish/El_Salvador': 'es_SV.UTF-8',
'Spanish/Equador': 'es_EC.UTF-8',
'Spanish/Guatemala': 'es_GT.UTF-8',
'Spanish/Honduras': 'es_HN.UTF-8',
'Spanish/Mexico': 'es_MX.UTF-8',
'Spanish/Nicaragua': 'es_NI.UTF-8',
'Spanish/Panama': 'es_PA.UTF-8',
'Spanish/Paraguay': 'es_PY.UTF-8',
'Spanish/Peru': 'es_PE.UTF-8',
'Spanish/Puerto_Rico': 'es_PR.UTF-8',
'Spanish/Spain': 'es_ES.UTF-8',
'Spanish/USA': 'es_US.UTF-8',
'Spanish/Uruguay': 'es_UY.UTF-8',
'Spanish/Venezuela': 'es_VE.UTF-8',
'Swedish/Finland': 'sv_FI.UTF-8',
'Swedish/Sweden': 'sv_SE.UTF-8',
'Tagalog/Philippines': 'tl_PH',
'Tamil/India': 'ta_IN.UTF-8',
'Telugu/India': 'te_IN.UTF-8',
'Thai': 'th_TH.UTF-8',
'Turkish': 'tr_TR.UTF-8',
'Ukrainian': 'uk_UA.UTF-8',
'Urdu/Pakistan': 'ur_PK',
'Uzbek/Uzbekistan': 'uz_UZ',
'Walloon/Belgium': 'wa_BE@euro',
'Welsh/Great_Britain': 'cy_GB.UTF-8',
'Xhosa/South_Africa': 'xh_ZA.UTF-8',
'Zulu/South_Africa': 'zu_ZA.UTF-8'
}
def _initialize():
timezones = _read_zonetab()
j=0
for timezone in timezones:
set_timezone.__doc__ += timezone+', '
j+=1
if j%3 == 0:
set_timezone.__doc__ += '\n'
keys = _LANGUAGES.keys()
keys.sort()
i = 0
for key in keys:
set_language.__doc__ += key+', '
i+=1
if i%3 == 0:
set_language.__doc__ += '\n'
def _note_restart():
print _('To apply your changes you have to restart sugar.\n' +
'Hit at the same time ctrl+alt+erase on the keyboard to do this.')
def get_jabber():
pro = profile.get_profile()
return pro.jabber_server
def print_jabber():
print get_jabber()
def set_jabber(server):
"""Set the jabber server
server : e.g. 'olpc.collabora.co.uk'
"""
pro = profile.get_profile()
pro.jabber_server = server
pro.jabber_registered = False
pro.save()
_note_restart()
def get_color():
return profile.get_color()
def print_color():
color = get_color().to_string()
str = color.split(',')
stroke = None
fill = None
for color in _COLORS:
for hue in _COLORS[color]:
if _COLORS[color][hue] == str[0]:
stroke = (color, hue)
if _COLORS[color][hue] == str[1]:
fill = (color, hue)
if stroke is not None:
print 'stroke: color=%s hue=%s'%(stroke[0], stroke[1])
else:
print 'stroke: %s'%(str[0])
if fill is not None:
print 'fill: color=%s hue=%s'%(fill[0], fill[1])
else:
print 'fill: %s'%(str[1])
def set_color(stroke, fill, modstroke='medium', modfill='medium'):
"""Set the system color by setting a fill and stroke color.
fill : [red, orange, yellow, blue, purple]
stroke : [red, orange, yellow, blue, purple]
hue stroke : [dark, medium, light] (optional)
hue fill : [dark, medium, light] (optional)
"""
if modstroke not in _MODIFIERS or modfill not in _MODIFIERS:
print (_("Error in specified color modifiers."))
return
if stroke not in _COLORS or fill not in _COLORS:
print (_("Error in specified colors."))
return
if modstroke == modfill:
if modfill == 'medium':
modfill = 'light'
else:
modfill = 'medium'
color = _COLORS[stroke][modstroke] + ',' + _COLORS[fill][modfill]
pro = profile.get_profile()
pro.color = XoColor(color)
pro.save()
_note_restart()
def get_nick():
return profile.get_nick_name()
def print_nick():
print get_nick()
def set_nick(nick):
"""Set the nickname.
nick : e.g. 'walter'
"""
pro = profile.get_profile()
pro.nick_name = nick
pro.save()
_note_restart()
def get_radio():
bus = dbus.SystemBus()
proxy = bus.get_object(NM_SERVICE_NAME, NM_SERVICE_PATH)
nm = dbus.Interface(proxy, NM_SERVICE_IFACE)
state = nm.state()
if state:
if state == NM_ASLEEP:
return _('off')
else:
return _('on')
return _('State is unknown.')
def print_radio():
print get_radio()
def set_radio(state):
"""Turn Radio 'on' or 'off'
state : 'on/off'
"""
# TODO: NM 0.6.x does not return a reply yet
# so we ignore it for the moment
if state == 'on':
dbus.SystemBus().call_async(NM_SERVICE_NAME, NM_SERVICE_PATH,
NM_SERVICE_IFACE, 'wake', '', (),
None, None)
elif state == 'off':
dbus.SystemBus().call_async(NM_SERVICE_NAME, NM_SERVICE_PATH,
NM_SERVICE_IFACE, 'sleep', '', (),
None, None)
else:
print (_("Error in specified radio argument use on/off."))
def _check_for_superuser():
if os.getuid():
print _("Permission denied. You need to be root to run this method.")
return False
return True
def get_timezone():
if not os.access(_TIMEZONE_CONFIG, os.R_OK):
# this is what the default is for the /etc/localtime
return "America/New_York"
fd = open(_TIMEZONE_CONFIG, "r")
lines = fd.readlines()
fd.close()
try:
for line in lines:
line = string.strip(line)
if len (line) and line[0] == '#':
continue
try:
tokens = string.split(line, "=")
if tokens[0] == "ZONE":
timezone = string.replace(tokens[1], '"', '')
return timezone
except Exception, e:
print "get_timezone: %s" % e
except Exception, e:
print "get_timezone: %s" % e
return None
def print_timezone():
timezone = get_timezone()
if timezone is None:
print (_("Error in reading timezone"))
else:
print timezone
def _read_zonetab(fn='/usr/share/zoneinfo/zone.tab'):
fd = open (fn, 'r')
lines = fd.readlines()
fd.close()
timezones = []
for line in lines:
if line.startswith('#'):
continue
line = line.split()
if len(line) > 1:
timezones.append(line[2])
timezones.sort()
return timezones
def set_timezone(timezone):
"""Set the system timezone
timezone :
"""
if not _check_for_superuser():
return
timezones = _read_zonetab()
if timezone in timezones:
fromfile = os.path.join("/usr/share/zoneinfo/", timezone)
try:
shutil.copyfile(fromfile, "/etc/localtime")
except OSError, (errno, msg):
print (_("Error copying timezone (from %s): %s") % (fromfile, msg))
return
try:
os.chmod("/etc/localtime", 0644)
except OSError, (errno, msg):
print (_("Changing permission of timezone: %s") % (msg))
return
# Write info to the /etc/sysconfig/clock file
fd = open(_TIMEZONE_CONFIG, "w")
fd.write('# The ZONE parameter is only evaluated by sugarcontrol.\n')
fd.write('# The timezone of the system ' +
'is defined by the contents of /etc/localtime.\n')
fd.write('ZONE="%s"\n' % timezone)
fd.close()
else:
print (_("Error timezone does not exist."))
def _writeI18N(lang):
path = os.path.join(os.environ.get("HOME"), '.i18n')
if os.access(path, os.W_OK) == 0:
print(_("Could not access %s. Create standard settings.") % path)
fd = open(path, 'w')
fd.write('LANG="en_US.UTF-8"\n')
fd.close()
else:
fd = open(path, 'r')
lines = fd.readlines()
fd.close()
for i in range(len(lines)):
if lines[i][:5] == "LANG=":
lines[i] = 'LANG="' + lang + '"\n'
fd = open(path, 'w')
fd.writelines(lines)
fd.close()
def get_language():
originalFile = None
path = os.path.join(os.environ.get("HOME"), '.i18n')
if os.access(path, os.R_OK) == 0:
print(_("Could not access %s. Create standard settings.") % path)
fd = open(path, 'w')
default = 'en_US.UTF-8'
fd.write('LANG="%s"\n'%default)
fd.close()
return default
fd = open(path, "r")
lines = fd.readlines()
fd.close()
lang = None
for line in lines:
if line[:5] == "LANG=":
lang = line[5:].replace('"', '')
lang = lang.strip()
return lang
def print_language():
code = get_language()
for lang in _LANGUAGES:
if _LANGUAGES[lang] == code:
print lang
return
print (_("Language for code=%s could not be determined.") % code)
def set_language(language):
"""Set the system language.
languages :
"""
if language in _LANGUAGES:
_writeI18N(_LANGUAGES[language])
_note_restart()
else:
print (_("Sorry I do not speak \'%s\'.") % language)
# inilialize the docstrings for the timezone and language
_initialize()