Source code for stoqlib.lib.defaults
# -*- coding: utf-8 -*-
# vi:si:et:sw=4:sts=4:ts=4
##
## Copyright (C) 2005-2012 Async Open Source
##
## This program 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 program 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 program; if not, write to the Free Software
## Foundation, Inc., or visit: http://www.gnu.org/.
##
##
## Author(s): Stoq Team <stoq-devel@async.com.br>
##
"""Default values for applications"""
import ctypes
from ctypes.util import find_library
import os
import platform
import re
from decimal import Decimal
from dateutil import relativedelta
from stoqlib.lib.translation import stoqlib_gettext
_ = stoqlib_gettext
#: The max int for 32bits. Should be used instead of sys.maxint since
#: it will be different depending on the cpu's architecture
#: http://en.wikipedia.org/wiki/2147483647
MAX_INT = (1 << 31) - 1
MINIMUM_PASSWORD_CHAR_LEN = 6
#
# Unicode related
#
# "Used to replace an incoming character whose value is unknown or
# undefined in Unicode"
UNKNOWN_CHARACTER = u"\N{REPLACEMENT CHARACTER}"
# weekday constants
NL_TIME_WEEK_1STDAY = 131174
NL_TIME_FIRST_WEEKDAY = 131176
# C library
_libc = None
[docs]def get_libc():
"""Returns an accessor to C library.
:returns: a ctypes.CDLL instance
"""
global _libc
if _libc is None:
_libc = ctypes.CDLL(find_library("c"))
return _libc
[docs]def get_weekday_start():
"""Returns the dateutil.relativedelta.weekday based on the current locale.
:returns: a dateutil.realtivedelta.weekday instance
"""
_system = platform.system()
week_start = 0
if _system == 'Darwin':
# FIXME: Port this to use py objc
# http://stackoverflow.com/questions/3519207/how-to-calculate-first-nsdate-of-current-week
pass
elif _system == 'Windows':
# FIXME: GetLocaleInfo(LOCALE_IFIRSTDAYOFWEEK)
pass
elif _system == 'Linux':
# Libc + ctypes is not working on natty and previous
# libc = get_libc()
# week_origin = libc.nl_langinfo(NL_TIME_WEEK_1STDAY)
# v = libc.nl_langinfo(NL_TIME_FIRST_WEEKDAY)
# first_weekday = ord(ctypes.cast(v, ctypes.c_char_p).value[0])
process = os.popen("locale first_weekday week-1stday")
first_weekday, week_origin = process.read().split('\n')[:2]
process.close()
# we will set week_1sday based on the dateutil.relativedelta.weekday mapping
if week_origin == '19971130': # Sunday
week_1stday = 6
elif week_origin == '19971201': # Monday
week_1stday = 0
else:
raise TypeError('Unknown NL_TIME_WEEK_1STDAY constant')
week_start = (week_1stday + int(first_weekday) - 1) % 7
return relativedelta.weekday(week_start)
#
# Payments
#
[docs]def payment_value_colorize(column_data):
"""A helper method for payment value columns used to set different
colors for negative values
"""
return column_data < 0
#
# Kiwi combobox
#
ALL_ITEMS_INDEX = -1
ALL_BRANCHES = _('All branches'), ALL_ITEMS_INDEX
#
# Common methods
#
def _split_parts(a):
parts = re.findall(r'(\d+|\D+)', a)
for i in range(len(parts)):
try:
parts[i] = int(parts[i])
except Exception:
pass
return parts
[docs]def sort_sellable_code(a, b):
return cmp(_split_parts(a), _split_parts(b))
#
# Decimal precision
#
DECIMAL_PRECISION = 2
QUANTITY_PRECISION = 3
[docs]def quantize(dec, precision=DECIMAL_PRECISION):
"""Quantities a decimal according to the current settings.
if DECIMAL_PRECISION is set to two then everything but
the last two decimals will be removed
>>> quantize(Decimal("10.123"))
Decimal('10.12')
>>> quantize(Decimal("10.678"))
Decimal('10.68')
"""
_format = Decimal('10e-%d' % precision)
return dec.quantize(_format)