Package Camelot :: Package camelot :: Package view :: Module utils
[frames] | no frames]

Source Code for Module Camelot.camelot.view.utils

  1  #  ============================================================================
 
  2  #
 
  3  #  Copyright (C) 2007-2008 Conceptive Engineering bvba. All rights reserved.
 
  4  #  www.conceptive.be / project-camelot@conceptive.be
 
  5  #
 
  6  #  This file is part of the Camelot Library.
 
  7  #
 
  8  #  This file may be used under the terms of the GNU General Public
 
  9  #  License version 2.0 as published by the Free Software Foundation
 
 10  #  and appearing in the file LICENSE.GPL included in the packaging of
 
 11  #  this file.  Please review the following information to ensure GNU
 
 12  #  General Public Licensing requirements will be met:
 
 13  #  http://www.trolltech.com/products/qt/opensource.html
 
 14  #
 
 15  #  If you are unsure which license is appropriate for your use, please
 
 16  #  review the following information:
 
 17  #  http://www.trolltech.com/products/qt/licensing.html or contact
 
 18  #  project-camelot@conceptive.be.
 
 19  #
 
 20  #  This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
 
 21  #  WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
 
 22  #
 
 23  #  For use of this library in commercial applications, please contact
 
 24  #  project-camelot@conceptive.be
 
 25  #
 
 26  #  ============================================================================
 
 27  
 
 28  """Helper functions for the view subpackage""" 
 29  
 
 30  from PyQt4 import QtCore 
 31  
 
 32  from datetime import datetime, time, date 
 33  import re 
 34  import logging 
 35  import operator 
 36  
 
 37  from camelot.core import constants 
 38  from camelot.core.sql import like_op 
 39  from sqlalchemy.sql.operators import between_op 
 40  from camelot.core.utils import ugettext 
 41  
 
 42  logger = logging.getLogger('camelot.view.utils') 
 43  
 
 44  _local_date_format = None 
 45   
 
46 -def local_date_format():
47 """Get the local data format and cache it for reuse""" 48 global _local_date_format 49 if not _local_date_format: 50 locale = QtCore.QLocale() 51 format_sequence = re.split('y*', unicode(locale.dateFormat(locale.ShortFormat))) 52 # make sure a year always has 4 numbers 53 format_sequence.insert(-1, 'yyyy') 54 _local_date_format = unicode(u''.join(format_sequence)) 55 return _local_date_format
56
57 -class ParsingError(Exception): pass
58
59 -def string_from_string(s):
60 if not s: 61 return None 62 return unicode(s)
63
64 -def bool_from_string(s):
65 if s is None: raise ParsingError() 66 if s.lower() not in ['false', 'true']: raise ParsingError() 67 return eval(s.lower().capitalize())
68
69 -def date_from_string(s):
70 if not s: 71 return None 72 from PyQt4.QtCore import QDate 73 import string 74 s = s.strip() 75 f = local_date_format() 76 if not s: 77 return None 78 dt = QDate.fromString(s, f) 79 if not dt.isValid(): 80 # try parsing without separators 81 # attention : using non ascii letters will fail on windows 82 # string.letters then contains non ascii letters of which we don't know the 83 # encoding, so we cannot convert them to unicode to compare them 84 only_letters_format = u''.join([c for c in f if c in string.ascii_letters]) 85 only_letters_string = u''.join([c for c in s if c in (string.ascii_letters+string.digits)]) 86 dt = QDate.fromString(only_letters_string, only_letters_format) 87 if not dt.isValid(): 88 # try parsing without the year, and take the current year by default 89 only_letters_format = u''.join([c for c in only_letters_format if c not in ['y']]) 90 dt = QDate.fromString(only_letters_string, only_letters_format) 91 if not dt.isValid(): 92 raise ParsingError() 93 # # try parsing without year and month, and take the current year and month by default 94 # only_letters_format = u''.join([c for c in only_letters_format if c not in ['M']]) 95 # dt = QDate.fromString(only_letters_string, only_letters_format) 96 # if not dt.isValid(): 97 # raise ParsingError() 98 # else: 99 # today = date.today() 100 # return date(today.year, today.month, dt.day()) 101 else: 102 return date(date.today().year, dt.month(), dt.day()) 103 return date(dt.year(), dt.month(), dt.day())
104
105 -def time_from_string(s, format=constants.strftime_time_format):
106 if s is None: raise ParsingError() 107 s = s.strip() 108 try: 109 dt = datetime.strptime(s, format) 110 except ValueError: 111 raise ParsingError() 112 return dt.time()
113 114
115 -def datetime_from_string(s, format=constants.strftime_datetime_format):
116 if s is None: raise ParsingError() 117 s = s.strip() 118 119 try: 120 dt = datetime.strptime(s, format) 121 except ValueError: 122 raise ParsingError() 123 return dt
124 125
126 -def int_from_string(s):
127 if s is None: raise ParsingError() 128 if s.isspace(): return int() 129 130 s = s.strip() 131 if len(s) == 0: return int() 132 133 try: 134 i = int(s) 135 except ValueError: 136 raise ParsingError() 137 return i
138 139
140 -def float_from_string(s):
141 if not s: 142 return None 143 locale = QtCore.QLocale() 144 f, ok = locale.toFloat(s) 145 if not ok: 146 raise ParsingError() 147 return f
148 149
150 -def pyvalue_from_string(pytype, s):
151 if pytype is str: 152 return str(s) 153 elif pytype is unicode: 154 return unicode(s) 155 elif pytype is bool: 156 return bool_from_string(s) 157 elif pytype is date: 158 return date_from_string(s) 159 elif pytype is time: 160 return date_from_string(s) 161 elif pytype is datetime: 162 return datetime_from_string(s) 163 elif pytype is float: 164 return float_from_string(s) 165 elif pytype is int: 166 return int_from_string(s)
167
168 -def enumeration_to_string(value):
169 return ugettext(unicode(value).replace('_', ' ').capitalize())
170 171 operator_names = { 172 operator.eq : u'=', 173 operator.ne : u'!=', 174 operator.lt : u'<', 175 operator.le : u'<=', 176 operator.gt : u'>', 177 operator.ge : u'>=', 178 like_op : u'like', 179 between_op: u'between', 180 } 181