[Sugar-devel] [PATCH 1/3] Add models for detecting and parsing the providers DB.
Tomeu Vizoso
tomeu at sugarlabs.org
Tue Jul 6 07:01:44 EDT 2010
On Mon, Jun 14, 2010 at 06:14, Andrés Ambrois <andresambrois at gmail.com> wrote:
> has_providers_db() checks for the files needed and is used by the view
> to decide whether to show the combo boxes.
> The models are gtk.ListStore subclasses that parse the XML element they
> receive as a parameter in their constructors.
>
> Signed-off-by: Andrés Ambrois <andresambrois at gmail.com>
>
> mode change 100755 => 100644 extensions/cpsection/modemconfiguration/model.py
>
> diff --git a/extensions/cpsection/modemconfiguration/model.py b/extensions/cpsection/modemconfiguration/model.py
> old mode 100755
> new mode 100644
> index 2545ce1..42f7563
> --- a/extensions/cpsection/modemconfiguration/model.py
> +++ b/extensions/cpsection/modemconfiguration/model.py
> @@ -15,11 +15,20 @@
> # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 US
>
> import gconf
> +import gtk
> +import os
> +import locale
> +from xml.etree.cElementTree import ElementTree
> +from gettext import gettext as _
See here about how imports should be grouped:
http://www.python.org/dev/peps/pep-0008/
In the shell we keep sugar.* and jarabe.* imports in separate groups.
> from jarabe.model.network import GSM_USERNAME_PATH, GSM_PASSWORD_PATH, \
> GSM_NUMBER_PATH, GSM_APN_PATH, GSM_PIN_PATH, \
> GSM_PUK_PATH
>
> +from cpsection.modemconfiguration.config import PROVIDERS_PATH, \
> + PROVIDERS_FORMAT_SUPPORTED, \
> + COUNTRY_CODES_PATH
> +
> def get_username():
> client = gconf.client_get_default()
> return client.get_string(GSM_USERNAME_PATH) or ''
> @@ -68,3 +77,103 @@ def set_puk(puk):
> client = gconf.client_get_default()
> client.set_string(GSM_PUK_PATH, puk)
>
> +def has_providers_db():
> + if not os.path.isfile(COUNTRY_CODES_PATH):
> + return False
> + try:
> + tree = ElementTree(file=PROVIDERS_PATH)
> + elem = tree.getroot()
> + if elem is None or elem.get('format') != PROVIDERS_FORMAT_SUPPORTED:
> + return False
> + return True
> + except IOError:
> + return False
I'm concerned about that IOError catch hiding a genuine error
condition. Consider checking for file existence and readability with
os.access(). If that IOError also cacthes malformed files, then we
should treat that separately and log the exception.
> +class CountryListStore(gtk.ListStore):
> + COUNTRY_CODE = locale.getdefaultlocale()[0][3:5].lower()
> +
> + def __init__(self):
> + gtk.ListStore.__init__(self, str, object)
> + codes = {}
> + with open(COUNTRY_CODES_PATH) as codes_file:
Using 'with' like that makes us depend on Python 2.6. I have nothing
against bumping our dependency from 2.5 to 2.6 but this should be
discussed separately so people can give their opinions.
No more comments, great code!
Regards,
Tomeu
> + for line in codes_file:
> + if line.startswith('#'):
> + continue
> + code, name = line.split('\t')[:2]
> + codes[code.lower()] = name.strip()
> + etree = ElementTree(file=PROVIDERS_PATH).getroot()
> + self._country_idx = None
> + i = 0
> + for elem in etree.findall('.//country'):
> + code = elem.attrib['code']
> + if code == self.COUNTRY_CODE:
> + self._country_idx = i
> + else:
> + i += 1
> + if code in codes:
> + self.append((codes[code], elem))
> + else:
> + self.append((code, elem))
> +
> + def get_row_providers(self, row):
> + return self[row][1]
> +
> + def guess_country_row(self):
> + if self._country_idx is not None:
> + return self._country_idx
> + else:
> + return -1
> +
> +class ProviderListStore(gtk.ListStore):
> + def __init__(self, elem):
> + gtk.ListStore.__init__(self, str, object)
> + for provider_elem in elem.findall('.//provider'):
> + apns = provider_elem.findall('.//apn')
> + if not apns:
> + # Skip carriers with CDMA entries only
> + continue
> + self.append((provider_elem.find('.//name').text, apns))
> +
> + def get_row_plans(self, row):
> + return self[row][1]
> +
> +class PlanListStore(gtk.ListStore):
> + LANG_NS_ATTR = '{http://www.w3.org/XML/1998/namespace}lang'
> + LANG = locale.getdefaultlocale()[0][:2]
> + DEFAULT_NUMBER = '*99#'
> +
> + def __init__(self, elems):
> + gtk.ListStore.__init__(self, str, object)
> + for apn_elem in elems:
> + plan = {}
> + names = apn_elem.findall('.//name')
> + if names:
> + for name in names:
> + if name.get(self.LANG_NS_ATTR) is None:
> + # serviceproviders.xml default value
> + plan['name'] = name.text
> + elif name.get(self.LANG_NS_ATTR) == self.LANG:
> + # Great! We found a name value for our locale!
> + plan['name'] = name.text
> + break
> + else:
> + plan['name'] = _('Default')
> + plan['apn'] = apn_elem.get('value')
> + user = apn_elem.find('.//username')
> + if user is not None:
> + plan['username'] = user.text
> + else:
> + plan['username'] = ''
> + passwd = apn_elem.find('.//password')
> + if passwd is not None:
> + plan['password'] = passwd.text
> + else:
> + plan['password'] = ''
> +
> + plan['number'] = self.DEFAULT_NUMBER
> +
> + self.append((plan['name'], plan))
> +
> + def get_row_plan(self, row):
> + return self[row][1]
> +
> --
> 1.6.3.3
>
> _______________________________________________
> Sugar-devel mailing list
> Sugar-devel at lists.sugarlabs.org
> http://lists.sugarlabs.org/listinfo/sugar-devel
>
More information about the Sugar-devel
mailing list