from Screen import Screen
-from Components.ConfigList import ConfigList, ConfigListScreen
+from Components.ConfigList import ConfigListScreen
from Components.ActionMap import NumberActionMap
from Components.config import config, getConfigListEntry, ConfigNothing, NoSave, ConfigPIN
-from Components.ServiceList import ServiceList
from Components.ParentalControlList import ParentalControlEntryComponent, ParentalControlList
-from Components.ParentalControl import parentalControl
+
+from Components.Sources.StaticText import StaticText
from Screens.ChoiceBox import ChoiceBox
from Screens.MessageBox import MessageBox
-from Screens.InputBox import InputBox, Input, PinInput
-from Tools.Directories import resolveFilename, SCOPE_CONFIG
+from Screens.InputBox import PinInput
+from Screens.ChannelSelection import service_types_tv
from Tools.BoundFunction import boundFunction
-from ServiceReference import ServiceReference
-from enigma import eServiceCenter, eServiceReference
-import os
-import operator
+from enigma import eServiceCenter, eTimer, eServiceReference
+from operator import itemgetter
class ProtectedScreen:
def __init__(self):
if self.isProtected():
- self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.protectedWithPin()], title = self.getPinText(), windowTitle = _("Change pin code")))
+ self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.protectedWithPin()], triesEntry = self.getTriesEntry(), title = self.getPinText(), windowTitle = _("Enter pin code")))
+
+ def getTriesEntry(self):
+ return config.ParentalControl.retries.setuppin
def getPinText(self):
return _("Please enter the correct pin code")
-
+
def isProtected(self):
return True
-
+
def protectedWithPin(self):
return config.ParentalControl.setuppin.value
-
+
def pinEntered(self, result):
- if result[0] is None:
+ if result is None:
self.close()
- if not result[0]:
- print result, "-", self.protectedWithPin()
+ elif not result:
self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
class ParentalControlSetup(Screen, ConfigListScreen, ProtectedScreen):
def __init__(self, session):
Screen.__init__(self, session)
-
ProtectedScreen.__init__(self)
+ # for the skin: first try ParentalControlSetup, then Setup, this allows individual skinning
+ self.skinName = ["ParentalControlSetup", "Setup" ]
+ self.setup_title = _("Parental control setup")
+ self.onChangedEntry = [ ]
+
+ self.list = []
+ ConfigListScreen.__init__(self, self.list, session = self.session, on_change = self.changedEntry)
+ self.createSetup()
self["actions"] = NumberActionMap(["SetupActions"],
{
- "cancel": self.keyCancel
+ "cancel": self.keyCancel,
+ "save": self.keyCancel
}, -2)
-
- self.list = []
- ConfigListScreen.__init__(self, self.list)
- self.createSetup()
-
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("OK"))
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ def layoutFinished(self):
+ self.setTitle(self.setup_title)
+
def isProtected(self):
- return config.ParentalControl.setuppinactive.value
+ return config.ParentalControl.setuppinactive.value and config.ParentalControl.configured.value
def createSetup(self):
self.editListEntry = None
self.list = []
self.list.append(getConfigListEntry(_("Enable parental control"), config.ParentalControl.configured))
print "config.ParentalControl.configured.value", config.ParentalControl.configured.value
+ self.editBouquetListEntry = -1
+ self.reloadLists = -1
if config.ParentalControl.configured.value:
#self.list.append(getConfigListEntry(_("Configuration mode"), config.ParentalControl.mode))
self.list.append(getConfigListEntry(_("Protect setup"), config.ParentalControl.setuppinactive))
if config.ParentalControl.setuppinactive.value:
- self.changeSetupPin = getConfigListEntry(_("Change setup pin"), NoSave(ConfigNothing()))
+ self.changeSetupPin = getConfigListEntry(_("Change setup PIN"), NoSave(ConfigNothing()))
self.list.append(self.changeSetupPin)
self.list.append(getConfigListEntry(_("Protect services"), config.ParentalControl.servicepinactive))
if config.ParentalControl.servicepinactive.value:
self.list.append(getConfigListEntry(_("Parental control type"), config.ParentalControl.type))
if config.ParentalControl.mode.value == "complex":
- self.changePin = getConfigListEntry(_("Change service pins"), NoSave(ConfigNothing()))
+ self.changePin = getConfigListEntry(_("Change service PINs"), NoSave(ConfigNothing()))
self.list.append(self.changePin)
elif config.ParentalControl.mode.value == "simple":
- self.changePin = getConfigListEntry(_("Change service pin"), NoSave(ConfigNothing()))
+ self.changePin = getConfigListEntry(_("Change service PIN"), NoSave(ConfigNothing()))
self.list.append(self.changePin)
- self.list.append(getConfigListEntry(_("Remember service pin"), config.ParentalControl.storeservicepin))
+ #Added Option to remember the service pin
+ self.list.append(getConfigListEntry(_("Remember service PIN"), config.ParentalControl.storeservicepin))
+ #Added Option to remember the cancellation of service pin entry
+ self.list.append(getConfigListEntry(_("Remember service PIN cancel"), config.ParentalControl.storeservicepincancel))
self.editListEntry = getConfigListEntry(_("Edit services list"), NoSave(ConfigNothing()))
self.list.append(self.editListEntry)
+ #New funtion: Possibility to add Bouquets to whitelist / blacklist
+ self.editBouquetListEntry = getConfigListEntry(_("Edit bouquets list"), NoSave(ConfigNothing()))
+ self.list.append(self.editBouquetListEntry)
+ #New option to reload service lists (for example if bouquets have changed)
+ self.reloadLists = getConfigListEntry(_("Reload Black-/Whitelists"), NoSave(ConfigNothing()))
+ self.list.append(self.reloadLists)
self["config"].list = self.list
self["config"].setList(self.list)
-
+
def keyOK(self):
print "self[\"config\"].l.getCurrentSelection()", self["config"].l.getCurrentSelection()
if self["config"].l.getCurrentSelection() == self.editListEntry:
self.session.open(ParentalControlEditor)
+ elif self["config"].l.getCurrentSelection() == self.editBouquetListEntry:
+ self.session.open(ParentalControlBouquetEditor)
elif self["config"].l.getCurrentSelection() == self.changePin:
if config.ParentalControl.mode.value == "complex":
pass
else:
- self.session.open(ParentalControlChangePin, config.ParentalControl.servicepin[0], _("service pin"))
+ self.session.open(ParentalControlChangePin, config.ParentalControl.servicepin[0], _("service PIN"))
elif self["config"].l.getCurrentSelection() == self.changeSetupPin:
- self.session.open(ParentalControlChangePin, config.ParentalControl.setuppin, _("setup pin"))
+ self.session.open(ParentalControlChangePin, config.ParentalControl.setuppin, _("setup PIN"))
+ elif self["config"].l.getCurrentSelection() == self.reloadLists:
+ from Components.ParentalControl import parentalControl
+ parentalControl.open()
else:
ConfigListScreen.keyRight(self)
print "current selection:", self["config"].l.getCurrentSelection()
self.createSetup()
-
+
def keyLeft(self):
ConfigListScreen.keyLeft(self)
print "current selection:", self["config"].l.getCurrentSelection()
- self.createSetup()
-
+ self.createSetup()
+
def keyRight(self):
ConfigListScreen.keyRight(self)
print "current selection:", self["config"].l.getCurrentSelection()
self.createSetup()
-
+
+ def SetupPinMessageCallback(self, value):
+ if value:
+ self.session.openWithCallback(self.cancelCB, ParentalControlChangePin, config.ParentalControl.setuppin, _("setup PIN"))
+ else:
+ config.ParentalControl.setuppinactive.value = False
+ self.keyCancel()
+
+ def ServicePinMessageCallback(self, value):
+ if value:
+ self.session.openWithCallback(self.cancelCB, ParentalControlChangePin, config.ParentalControl.servicepin[0], _("service PIN"))
+ else:
+ config.ParentalControl.servicepinactive.value = False
+ self.keyCancel()
+
+ def cancelCB(self,value):
+ self.keyCancel()
+
def keyCancel(self):
- for x in self["config"].list:
- x[1].save()
- self.close()
-
+ if config.ParentalControl.setuppinactive.value and config.ParentalControl.setuppin.value == 'aaaa':
+ self.session.openWithCallback(self.SetupPinMessageCallback, MessageBox, _("No valid setup PIN found!\nDo you like to change the setup PIN now?\nWhen you say 'No' here the setup protection stay disabled!"), MessageBox.TYPE_YESNO)
+ elif config.ParentalControl.servicepinactive.value and config.ParentalControl.servicepin[0].value == 'aaaa':
+ self.session.openWithCallback(self.ServicePinMessageCallback, MessageBox, _("No valid service PIN found!\nDo you like to change the service PIN now?\nWhen you say 'No' here the service protection stay disabled!"), MessageBox.TYPE_YESNO)
+ else:
+ for x in self["config"].list:
+ x[1].save()
+ self.close()
+
def keyNumberGlobal(self, number):
pass
+ # for summary:
+ def changedEntry(self):
+ for x in self.onChangedEntry:
+ x()
+
+ def getCurrentEntry(self):
+ return self["config"].getCurrent()[0]
+
+ def getCurrentValue(self):
+ return str(self["config"].getCurrent()[1].getText())
+
+ def createSummary(self):
+ from Screens.Setup import SetupSummary
+ return SetupSummary
+
+SPECIAL_CHAR = 96
class ParentalControlEditor(Screen):
def __init__(self, session):
Screen.__init__(self, session)
-
self.list = []
self.servicelist = ParentalControlList(self.list)
self["servicelist"] = self.servicelist;
-
#self.onShown.append(self.chooseLetter)
- self.currentLetter = ''
-
+ self.currentLetter = chr(SPECIAL_CHAR)
self.readServiceList()
-
+ self.chooseLetterTimer = eTimer()
+ self.chooseLetterTimer.callback.append(self.chooseLetter)
+ self.onLayoutFinish.append(self.LayoutFinished)
+
self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions", "NumberActions"],
{
"ok": self.select,
"cancel": self.cancel,
- "red": self.chooseLetter,
#"left": self.keyLeft,
#"right": self.keyRight,
"1": self.keyNumberGlobal,
"9": self.keyNumberGlobal,
"0": self.keyNumberGlobal
}, -1)
-
+
+ def LayoutFinished(self):
+ self.chooseLetterTimer.start(0, True)
+
def cancel(self):
- parentalControl.save()
- self.close()
-
+ self.chooseLetter()
+
def select(self):
self.servicelist.toggleSelectedLock()
-
+
def keyNumberGlobal(self, number):
pass
-
+
def readServiceList(self):
serviceHandler = eServiceCenter.getInstance()
- self.service_types_tv = '1:7:1:0:0:0:0:0:0:0:(type == 1) || (type == 17) || (type == 195) || (type == 25)'
- refstr = '%s ORDER BY name' % (self.service_types_tv)
+ refstr = '%s ORDER BY name' % (service_types_tv)
self.root = eServiceReference(refstr)
-
self.servicesList = {}
-
list = serviceHandler.list(self.root)
if list is not None:
- while 1:
- s = list.getNext()
- if s.valid():
- service = s.toString()
- name = ServiceReference(service).getServiceName()
- key = name.lower()[0]
- if key < 'a' or key > 'z':
- key = '&'
- #key = str(key)
- if not self.servicesList.has_key(key):
- self.servicesList[key] = []
- # (servicestring, eServiceRef, name)
- self.servicesList[key].append((service, s, name))
- else:
- break
- print self.servicesList
-
+ services = list.getContent("CN", True) #(servicecomparestring, name)
+ for s in services:
+ key = s[1].lower()[0]
+ if key < 'a' or key > 'z':
+ key = chr(SPECIAL_CHAR)
+ #key = str(key)
+ if not self.servicesList.has_key(key):
+ self.servicesList[key] = []
+ self.servicesList[key].append(s)
+
def chooseLetter(self):
print "choose letter"
- list = []
+ mylist = []
for x in self.servicesList.keys():
- if x == '&':
- x = ("special characters", x)
+ if x == chr(SPECIAL_CHAR):
+ x = (_("special characters"), x)
else:
x = (x, x)
- list.append(x)
- print "sorted list:", sorted(list, key=operator.itemgetter(1))
- print self.servicesList.keys()
- self.session.openWithCallback(self.letterChosen, ChoiceBox, title=_("Show services beginning with"), list=list)
-
+ mylist.append(x)
+ mylist.sort(key=itemgetter(1))
+ sel = ord(self.currentLetter) - SPECIAL_CHAR
+ self.session.openWithCallback(self.letterChosen, ChoiceBox, title=_("Show services beginning with"), list=mylist, keys = [], selection = sel)
+
def letterChosen(self, result):
+ from Components.ParentalControl import parentalControl
if result is not None:
print "result:", result
self.currentLetter = result[1]
- self.list = []
- for x in self.servicesList[result[1]]:
- self.list.append(ParentalControlEntryComponent(x[1], x[2], parentalControl.getProtectionLevel(x[1]) != -1))
- self.servicelist.setList(self.list)
+ #Replace getProtectionLevel by new getProtectionType
+ self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionType(x[0])) for x in self.servicesList[result[1]]]
+ self.servicelist.setList(self.list)
+ else:
+ parentalControl.save()
+ self.close()
+
+class ParentalControlBouquetEditor(Screen):
+ #This new class allows adding complete bouquets to black- and whitelists
+ #The servicereference that is stored for bouquets is their refstr as listed in bouquets.tv
+ def __init__(self, session):
+ Screen.__init__(self, session)
+ self.skinName = "ParentalControlEditor"
+ self.list = []
+ self.bouquetslist = ParentalControlList(self.list)
+ self["servicelist"] = self.bouquetslist;
+ self.readBouquetList()
+ self.onLayoutFinish.append(self.selectBouquet)
+
+ self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions"],
+ {
+ "ok": self.select,
+ "cancel": self.cancel
+ }, -1)
+
+ def cancel(self):
+ from Components.ParentalControl import parentalControl
+ parentalControl.save()
+ self.close()
+
+ def select(self):
+ self.bouquetslist.toggleSelectedLock()
+
+ def readBouquetList(self):
+ serviceHandler = eServiceCenter.getInstance()
+ refstr = '1:134:1:0:0:0:0:0:0:0:FROM BOUQUET \"bouquets.tv\" ORDER BY bouquet'
+ bouquetroot = eServiceReference(refstr)
+ self.bouquetlist = {}
+ list = serviceHandler.list(bouquetroot)
+ if list is not None:
+ self.bouquetlist = list.getContent("CN", True)
+
+ def selectBouquet(self):
+ from Components.ParentalControl import parentalControl
+ self.list = [ParentalControlEntryComponent(x[0], x[1], parentalControl.getProtectionType(x[0])) for x in self.bouquetlist]
+ self.bouquetslist.setList(self.list)
class ParentalControlChangePin(Screen, ConfigListScreen, ProtectedScreen):
def __init__(self, session, pin, pinname):
Screen.__init__(self, session)
+ # for the skin: first try ParentalControlChangePin, then Setup, this allows individual skinning
+ self.skinName = ["ParentalControlChangePin", "Setup" ]
+ self.setup_title = _("Change pin code")
+ self.onChangedEntry = [ ]
self.pin = pin
-
self.list = []
self.pin1 = ConfigPIN(default = 1111, censor = "*")
self.pin2 = ConfigPIN(default = 1112, censor = "*")
- self.list.append(getConfigListEntry(_("New pin"), NoSave(self.pin1)))
- self.list.append(getConfigListEntry(_("Reenter new pin"), NoSave(self.pin2)))
+ self.pin1.addEndNotifier(boundFunction(self.valueChanged, 1))
+ self.pin2.addEndNotifier(boundFunction(self.valueChanged, 2))
+ self.list.append(getConfigListEntry(_("New PIN"), NoSave(self.pin1)))
+ self.list.append(getConfigListEntry(_("Reenter new PIN"), NoSave(self.pin2)))
ConfigListScreen.__init__(self, self.list)
-
# print "old pin:", pin
#if pin.value != "aaaa":
#self.onFirstExecBegin.append(boundFunction(self.session.openWithCallback, self.pinEntered, PinInput, pinList = [self.pin.value], title = _("please enter the old pin"), windowTitle = _("Change pin code")))
self["actions"] = NumberActionMap(["DirectionActions", "ColorActions", "OkCancelActions"],
{
"cancel": self.cancel,
+ "red": self.cancel,
+ "save": self.keyOK,
}, -1)
-
+ self["key_red"] = StaticText(_("Cancel"))
+ self["key_green"] = StaticText(_("OK"))
+ self.onLayoutFinish.append(self.layoutFinished)
+
+ def layoutFinished(self):
+ self.setTitle(self.setup_title)
+
+ def valueChanged(self, pin, value):
+ if pin == 1:
+ self["config"].setCurrentIndex(1)
+ elif pin == 2:
+ self.keyOK()
+
def getPinText(self):
- return _("Please enter the old pin code")
+ return _("Please enter the old PIN code")
def isProtected(self):
return (self.pin.value != "aaaa")
def protectedWithPin(self):
return self.pin.value
-
+
# def pinEntered(self, result):
#if result[0] is None:
#self.close()
#if not result[0]:
#print result, "-", self.pin.value
#self.session.openWithCallback(self.close, MessageBox, _("The pin code you entered is wrong."), MessageBox.TYPE_ERROR)
-
+
def keyOK(self):
if self.pin1.value == self.pin2.value:
self.pin.value = self.pin1.value
self.pin.save()
- self.session.openWithCallback(self.close, MessageBox, _("The pin code has been changed successfully."), MessageBox.TYPE_INFO)
+ self.session.openWithCallback(self.close, MessageBox, _("The PIN code has been changed successfully."), MessageBox.TYPE_INFO)
else:
- self.session.open(MessageBox, _("The pin codes you entered are different."), MessageBox.TYPE_ERROR)
-
+ self.session.open(MessageBox, _("The PIN codes you entered are different."), MessageBox.TYPE_ERROR)
+
def cancel(self):
self.close(None)
-
+
def keyNumberGlobal(self, number):
ConfigListScreen.keyNumberGlobal(self, number)
-
+
+ # for summary:
+ def changedEntry(self):
+ for x in self.onChangedEntry:
+ x()
+
+ def getCurrentEntry(self):
+ return self["config"].getCurrent()[0]
+
+ def getCurrentValue(self):
+ return str(self["config"].getCurrent()[1].getText())
+
+ def createSummary(self):
+ from Screens.Setup import SetupSummary
+ return SetupSummary