00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00028 
00029 
00030 
00031 
00032 
00033 
00034 
00035 
00036 
00037 
00038 from PyQt4.QtCore import *
00039 from PyQt4.QtGui import * 
00040 from PyQt4.uic import *
00041 import math
00042 import locale
00043 import Common
00044 import re
00045 
00046 
00047 def dateToText( date ):
00048         return str( date.toString( 'dd/MM/yyyy' ) )
00049 
00050 
00051 def timeToText( time ):
00052         return str( time.toString( 'hh:mm:ss' ) )
00053 
00054 
00055 def dateTimeToText( dateTime ):
00056         return str( dateTime.toString( 'dd/MM/yyyy hh:mm:ss' ) )
00057 
00058 
00059 def floatTimeToText( value ):
00060         
00061         value = float( value )
00062         t = '%02d:%02d' % (math.floor(abs(value)),round(abs(value)%1+0.01,2) * 60)
00063         if value<0:
00064                 t = '-'+t
00065         return t
00066 
00067 
00068 
00069 def dateToStorage( date ):
00070         if date.isValid():
00071                 return str( date.toString( 'yyyy-MM-dd' ) )
00072         else:
00073                 return False
00074 
00075 
00076 
00077 def timeToStorage( time ):
00078         if time.isValid():
00079                 return str( time.toString( 'hh:mm:ss' ) )
00080         else:
00081                 return False
00082         
00083 
00084 
00085 def dateTimeToStorage( dateTime ):
00086         if dateTime.isValid():
00087                 return str( dateTime.toString( 'yyyy-MM-dd hh:mm:ss' ) )
00088         else:
00089                 return False
00090 
00091 
00092 def textToDate( text ):
00093         text = unicode( text ).strip()
00094         if text == '=':
00095                 return QDate.currentDate()
00096 
00097         inputFormats = [ 
00098                 'dd/MM/yyyy', 'dd-MM-yyyy', ('dd-MM-yy', 'century'), ('dd/MM/yy', 'century'), 
00099                 ('dd-M-yy', 'century'), ('d-M-yy', 'add'), ('d-MM-yy','century'), 'dd.MM.yyyy', 
00100                 ('dd.MM.yy','century'), 'ddMMyyyy', ('ddMMyy','century'), ('dd/MM', 'year'), 
00101                 ('dd.MM', 'year'), ('ddMM', 'year'), ('dd', 'month')
00102         ]
00103         for x in inputFormats:
00104                 if isinstance(x, tuple):
00105                         format = x[0]
00106                         complete = x[1]
00107                 else:
00108                         format = x
00109                         complete = None
00110 
00111                 date = QDate.fromString( text, format )
00112                 if date.isValid():
00113                         if complete == 'century':
00114                                 date.setDate( date.year() + 100, date.month(), date.day() )
00115                         if complete == 'year':
00116                                 date.setDate( QDate.currentDate().year(), date.month(), date.day() )
00117                         elif complete == 'month':
00118                                 date.setDate( QDate.currentDate().year(), QDate.currentDate().month(), date.day() )
00119                         break
00120         return date
00121 
00122 
00123 def textToTime( text ):
00124         text = unicode( text ).strip()
00125         if text == '=':
00126                 return QTime.currentTime()
00127 
00128         inputFormats = ['h:m:s', 'h:m', 'hh:mm:ss', 'h.m.s', 'h.m', 'h']
00129         for x in inputFormats:
00130                 time = QTime.fromString( text, x )
00131                 if time.isValid():
00132                         break
00133 
00134         if not time.isValid():
00135                 if len(text) == 4:
00136                         
00137                         time = QTime.fromString( '%s:%s' % ( text[0:2], text[2:4] ), 'h:m' )
00138                 elif len(text) == 6:
00139                         
00140                         time = QTime.fromString( '%s:%s:%s' % ( text[0:2], text[2:4], text[4:6] ), 'h:m:s' )
00141         return time
00142 
00143 
00144 def textToDateTime( text ):
00145         text = unicode( text ).strip()
00146         if text == '=':
00147                 return QDateTime.currentDateTime()
00148 
00149         inputFormats = ['dd/MM/yyyy h:m:s', "dd/MM/yyyy", "dd-MM-yyyy", 'dd-MM-yy', 'dd/MM/yy', 'dd-M-yy', 'd-M-yy', 'd-MM-yy', 'ddMMyyyy', 'ddMMyy' ]
00150         for x in inputFormats:
00151                 datetime = QDateTime.fromString( text, x )
00152                 if datetime.isValid():
00153                         break
00154         return datetime
00155 
00156 def internalTextToFloatTime( text ):
00157         try:
00158                 text = text.replace('.',':')
00159                 if text and ':' in text:
00160                         return round(int(text.split(':')[0]) + int(text.split(':')[1]) / 60.0,2)
00161                 else:
00162                         return locale.atof(text)
00163         except:
00164                 return 0.0
00165 
00166 
00167 def textToFloatTime( text ):
00168         text = unicode( text ).strip()
00169         time = 0.0
00170         last_operation = None
00171         texts = re.split('(\+|-+)', text)
00172         for text in texts:
00173                 if text in ('+','-'):
00174                         last_operation = text
00175                         continue
00176                 value = internalTextToFloatTime( text )
00177                 if last_operation == '+':
00178                         time += value
00179                 elif last_operation == '-':
00180                         time -= value
00181                 else:
00182                         time = value
00183         return time
00184 
00185 
00186 def storageToDate( text ):
00187         if text:
00188                 date = QDate.fromString( text, 'yyyy-MM-dd' )
00189                 if date.isValid():
00190                         return date
00191                 
00192                 return QDateTime.fromString( text, 'yyyy-MM-dd hh:mm:ss' ).date()
00193         else:
00194                 return QDate()
00195 
00196 
00197 def storageToTime( text ):
00198         if text:
00199                 return QTime.fromString( text, 'h:m:s' )
00200         else:
00201                 return QTime()
00202 
00203 
00204 def storageToDateTime( text ):
00205         if text:
00206                 return QDateTime.fromString( text, 'yyyy-MM-dd h:m:s' )
00207         else:
00208                 return QDateTime
00209 
00210 
00211 (PopupCalendarUi, PopupCalendarBase) = loadUiType( Common.uiPath('datetime.ui') )
00212 
00213 
00214 
00215 
00216 
00217 
00218 
00219 
00220 
00221 
00222 
00223 
00224 
00225 
00226 class PopupCalendarWidget(QWidget, PopupCalendarUi):
00227         
00228         
00229         def __init__(self, parent, showTime = False):
00230                 QWidget.__init__(self, parent)
00231                 PopupCalendarUi.__init__(self)
00232                 self.setupUi( self )
00233 
00234                 self.showTime = showTime
00235                 if self.showTime:
00236                         self.uiTime.setText( textToDateTime( unicode(parent.text()) ).time().toString() )
00237                         self.connect( self.uiTime, SIGNAL('returnPressed()'), self.storeOnParent )
00238                 else:
00239                         self.uiTime.hide()
00240                         self.labelTime.hide()
00241 
00242                 self.setWindowFlags( Qt.Popup )
00243                 self.setWindowModality( Qt.ApplicationModal )
00244                 pos = parent.parent().mapToGlobal( parent.pos() )
00245                 self.move( pos.x(), pos.y() + parent.height() )
00246 
00247                 
00248                 newX = self.x()
00249                 newY = self.y()
00250                 if self.frameGeometry().right() > QApplication.desktop().availableGeometry().right():
00251                         newX = QApplication.desktop().availableGeometry().right() - self.width()
00252                 if self.frameGeometry().bottom() > QApplication.desktop().availableGeometry().bottom():
00253                         newY = QApplication.desktop().availableGeometry().bottom() - self.height()
00254                 self.move( newX, newY )
00255 
00256                 self.connect( self.uiCalendar, SIGNAL('activated(QDate)'), self.storeOnParent )
00257                 if self.showTime:
00258                         self.uiCalendar.setSelectedDate( textToDateTime( parent.text() ).date() )
00259                 else:
00260                         self.uiCalendar.setSelectedDate( textToDate( parent.text() ) )
00261                 self.uiCalendar.setFirstDayOfWeek( Qt.Monday )
00262                 self.show()
00263                 if self.showTime:
00264                         self.uiTime.setFocus()
00265                 else:
00266                         self.uiCalendar.setFocus()
00267 
00268         
00269         
00270         def storeOnParent(self):
00271                 date = self.uiCalendar.selectedDate()
00272                 text = dateToText( date )
00273                 if self.showTime: 
00274                         time = textToTime( self.uiTime.text() )
00275                         if time.isValid():
00276                                 text = text + ' ' + timeToText(time)
00277                         else:
00278                                 text = text + ' ' + '00:00:00'
00279                 self.parent().setText( text )
00280                 self.emit(SIGNAL('selected()'))
00281                 self.close()
00282