Changeset 2713

Show
Ignore:
Timestamp:
01/17/07 22:23:49 (2 years ago)
Author:
carl
Message:

merge with trunk (head?)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • branches/carl2/AUTHORS

    r2412 r2713  
    1111    Stefano Masini 
    1212    Adi J. Sieker 
     13    Carl Karsten 
     14    Nate Lowrie 
     15    Uwe Grauer 
    1316 
    1417 
  • branches/carl2/dabo/biz/dBizobj.py

    r2666 r2713  
    187187            errMsg = self.beforePointerMove() 
    188188        if errMsg: 
    189             raise dException.dException, errMsg 
     189            raise dException.BusinessRuleViolation, errMsg 
    190190 
    191191        self._CurrentCursor.first() 
     
    206206            errMsg = self.beforePointerMove() 
    207207        if errMsg: 
    208             raise dException.dException, errMsg 
     208            raise dException.BusinessRuleViolation, errMsg 
    209209 
    210210        self._CurrentCursor.prior() 
     
    225225            errMsg = self.beforePointerMove() 
    226226        if errMsg: 
    227             raise dException.dException, errMsg 
     227            raise dException.BusinessRuleViolation, errMsg 
    228228 
    229229        self._CurrentCursor.next() 
     
    244244            errMsg = self.beforePointerMove() 
    245245        if errMsg: 
    246             raise dException.dException, errMsg 
     246            raise dException.BusinessRuleViolation, errMsg 
    247247 
    248248        self._CurrentCursor.last() 
     
    257257 
    258258        useTransact = startTransaction or topLevel 
    259         old_pk = getattr(self.Record, self.KeyField, None) 
    260259        cursor = self._CurrentCursor 
     260        old_pk = cursor.getPK() 
    261261 
    262262        if useTransact: 
     
    301301        errMsg = self.beforeSave() 
    302302        if errMsg: 
    303             raise dException.dException, errMsg 
     303            raise dException.BusinessRuleViolation, errMsg 
    304304 
    305305        if self.KeyField is None: 
    306             raise dException.dException, _("No key field defined for table: ") + self.DataSource 
     306            raise dException.MissingPKException, _("No key field defined for table: ") + self.DataSource 
    307307 
    308308        # Validate any changes to the data. If there is data that fails 
     
    328328                # No need to start another transaction. And since this is a child bizobj, 
    329329                # we need to save all rows that have changed. 
    330                 child.saveAll(startTransaction=False, topLevel=False) 
     330                if child.RowCount > 0: 
     331                    child.saveAll(startTransaction=False, topLevel=False) 
    331332 
    332333            # Finish the transaction, and requery the children if needed. 
     
    337338 
    338339        except dException.ConnectionLostException, e: 
    339             raise dException.ConnectionLostException, e 
     340            raise  
    340341 
    341342        except dException.NoRecordsException, e: 
    342             # Nothing to roll back; just throw it back for the form to display 
    343             raise dException.NoRecordsException, e 
     343            raise 
    344344 
    345345        except dException.DBQueryException, e: 
     
    381381        errMsg = self.beforeCancel() 
    382382        if errMsg: 
    383             raise dException.dException, errMsg 
     383            raise dException.BusinessRuleViolation, errMsg 
    384384 
    385385        # Tell the cursor and all children to cancel themselves: 
     
    398398            errMsg = self.beforePointerMove() 
    399399        if errMsg: 
    400             raise dException.dException, errMsg 
     400            raise dException.BusinessRuleViolation, errMsg 
    401401 
    402402        if self.KeyField is None: 
     
    563563        old_currentCursorKey = self.__currentCursorKey 
    564564        try: 
    565             old_pk = getattr(self.Record, self.KeyField, None
     565            old_pk = self._CurrentCursor.getPK(
    566566        except dException.NoRecordsException: 
    567567            # no rows to scan 
     
    618618            errMsg = self.beforePointerMove() 
    619619        if errMsg: 
    620             raise dException.dException, errMsg 
     620            raise dException.BusinessRuleViolation, errMsg 
    621621 
    622622        self._CurrentCursor.new() 
     
    663663        errMsg = self.beforeRequery() 
    664664        if errMsg: 
    665             raise dException.dException, errMsg 
     665            raise dException.BusinessRuleViolation, errMsg 
    666666        if self.KeyField is None: 
    667667            errMsg = _("No Primary Key defined in the Bizobj for %s") % self.DataSource 
     
    10921092        errMsg = self.beforeChildRequery() 
    10931093        if errMsg: 
    1094             raise dException.dException, errMsg 
     1094            raise dException.BusinessRuleViolation, errMsg 
    10951095 
    10961096        pk = self.getPK() 
     
    15791579            errMsg = self.beforePointerMove() 
    15801580        if errMsg: 
    1581             raise dException.dException, errMsg 
     1581            raise dException.BusinessRuleViolation, errMsg 
    15821582        self._moveToRowNum(rownum) 
    15831583        self.requeryAllChildren() 
  • branches/carl2/dabo/biz/test/test_dBizobj.py

    r2653 r2713  
    293293        self.assertEqual(bizChild.RowCount, 1) 
    294294        self.assertEqual(bizChild.Record.cInvNum, "IN99991") 
    295          
     295 
     296        # Test the case where you add a new parent record but no new children: 
     297        bizMain.new() 
     298        self.assertEqual(bizMain.RowCount, 4) 
     299        bizMain.saveAll() 
     300        self.assertEqual(bizMain.RowCount, 4) 
     301        bizMain.requery()        
     302        self.assertEqual(bizMain.RowCount, 4) 
     303 
    296304 
    297305if __name__ == "__main__": 
  • branches/carl2/dabo/db/dCursorMixin.py

    r2712 r2713  
    146146    def getSortCase(self): 
    147147        return self.sortCase 
    148  
     148     
     149     
     150    def pkExpression(self): 
     151        """Returns the current PK expression.""" 
     152        rec = self._records[self.RowNumber] 
     153        if isinstance(self.KeyField, tuple): 
     154            pk = tuple([rec[kk] for kk in self.KeyField]) 
     155        else: 
     156            pk = rec[self.KeyField] 
     157        return pk 
     158         
    149159 
    150160    def correctFieldType(self, field_val, field_name, _fromRequery=False): 
     
    628638                # self.RowNumber doesn't exist (init phase?) Nothing's changed: 
    629639                return False 
    630              
    631             memento = self._mementos.get(rec[self.KeyField], None) 
    632             new_rec = self._newRecords.has_key(rec[self.KeyField]
     640            recKey = self.pkExpression() 
     641            memento = self._mementos.get(recKey, None) 
     642            new_rec = self._newRecords.has_key(recKey
    633643 
    634644            return not (memento is None and not new_rec) 
     
    687697            raise dException.NoRecordsException, _("No records in the data set.") 
    688698        rec = self._records[self.RowNumber] 
    689         if self._newRecords.has_key(rec[self.KeyField]) and self.AutoPopulatePK: 
     699        recKey = self.pkExpression() 
     700        if self._newRecords.has_key(recKey) and self.AutoPopulatePK: 
    690701            # New, unsaved record 
    691702            ret = rec[kons.CURSOR_TMPKEY_FIELD] 
     
    736747        if typ: 
    737748            try: 
    738                 ret = {"C" : str, "D" : datetime.date, "B" : bool,  
    739                     "N" : float, "M" : str, "I" : int, "T" : datetime.datetime}[typ] 
     749                ret = {"C": unicode, "D": datetime.date, "B": bool, "G": long, 
     750                    "N": float, "M": unicode, "I": int, "T": datetime.datetime}[typ] 
    740751            except KeyError: 
    741752                ret = None 
     
    874885 
    875886        rec = self._records[row] 
    876         mem = self._mementos.get(rec[self.KeyField], {}) 
     887        recKey = self.pkExpression() 
     888        mem = self._mementos.get(recKey, {}) 
    877889         
    878890        for k, v in mem.items(): 
     
    10241036                saverow(row) 
    10251037        else: 
    1026             pk = self._records[self.RowNumber][self.KeyField] 
     1038            pk = self.pkExpression() 
    10271039            if pk in self._mementos.keys() or pk in self._newRecords.keys(): 
    10281040                saverow(self.RowNumber) 
     
    10331045    def __saverow(self, row): 
    10341046        rec = self._records[row] 
    1035         newrec = self._newRecords.has_key(rec[self.KeyField]) 
     1047        recKey = self.pkExpression() 
     1048        newrec = self._newRecords.has_key(recKey) 
    10361049        diff = self.getRecordStatus(row) 
    10371050        if diff or newrec: 
     
    10881101                # sql = "update %s set %s where %s" % (self.BackendObject.encloseSpaces(self.Table),  
    10891102                #       updClause, pkWhere) 
    1090             oldPKVal = rec[self.KeyField] 
     1103            oldPKVal = self.pkExpression() 
    10911104            newPKVal = None 
    10921105            if newrec and self.AutoPopulatePK: 
     
    10991112                if newPKVal and not self._compoundKey: 
    11001113                    self.setFieldVal(self.KeyField, newPKVal, row) 
    1101                 
     1114             
    11021115            #run the update 
    11031116            aux = self.AuxCursor 
     
    12091222            row = self.RowNumber 
    12101223            rec = self._records[row] 
    1211             if self._newRecords.has_key(rec[self.KeyField]): 
     1224            recKey = self.pkExpression() 
     1225            if self._newRecords.has_key(recKey): 
    12121226                # We simply need to remove the row, and clear the memento and newrec flag. 
    12131227                self._clearMemento(row) 
     
    12191233             
    12201234            # Not a new record: need to manually replace the old values: 
    1221             mem = self._mementos.get(rec[self.KeyField], {}) 
     1235            mem = self._mementos.get(recKey, {}) 
    12221236            for fld, val in mem.items(): 
    12231237                self._records[row][fld] = val 
     
    12351249 
    12361250        rec = self._records[delRowNum] 
    1237         if self._newRecords.has_key(rec[self.KeyField]): 
     1251        if self._newRecords.has_key(self.pkExpression()): 
    12381252            res = True 
    12391253        else: 
     
    15151529            row = self.RowNumber 
    15161530        rec = self._records[row] 
     1531        recKey = self.pkExpression() 
    15171532         
    15181533        if self._compoundKey: 
     
    15201535        else: 
    15211536            keyFields = [self.KeyField] 
    1522         mem = self._mementos.get(rec[self.KeyField], {}) 
     1537        recKey = self.pkExpression() 
     1538        mem = self._mementos.get(recKey, {}) 
    15231539 
    15241540        def getPkVal(fld): 
     
    19922008        if self.RowCount <= 0: 
    19932009            return False 
    1994         return self._newRecords.has_key(self._records[self.RowNumber][self.KeyField]) 
     2010        recKey = self.pkExpression() 
     2011        return self._newRecords.has_key(recKey) 
    19952012     
    19962013 
  • branches/carl2/dabo/db/dbFirebird.py

    r2712 r2713  
    1212        self.fieldPat = re.compile("([A-Za-z_][A-Za-z0-9-_]+)\.([A-Za-z_][A-Za-z0-9-_]+)") 
    1313        import kinterbasdb 
    14         if not kinterbasdb.initialized: 
    15             kinterbasdb.init(type_conv=200) 
     14        initialized = getattr(kinterbasdb, "initialized", None) 
     15        if not initialized: 
     16            if initialized is None: 
     17                # type_conv=200 KeyError with the older versions. User will need  
     18                # mxDateTime installed as well: 
     19                kinterbasdb.init() 
     20            else: 
     21                # Use Python's Decimal and datetime types: 
     22                kinterbasdb.init(type_conv=200) 
     23            if initialized is None: 
     24                # Older versions of kinterbasedb didn't have this attribute, so we write 
     25                # it ourselves: 
     26                kinterbasdb.initialized = True 
     27         
    1628        self.dbapi = kinterbasdb 
    1729 
  • branches/carl2/dabo/db/test/test_dCursorMixin.py

    r2667 r2713  
    290290    ##       actually occur. 
    291291    def setUp(self): 
    292         con = dabo.db.dConnection(DbType="Firebird", User="dabo_unittest",  
    293                 password="T30T35DB4K30Z45I67N60", Database="dabo_unittest", 
    294                 Host="paulmcnett.com") 
     292        con = dabo.db.dConnection(DbType="Firebird", User="dabotester",  
     293                password="Y57W8EN6CB06KBCCDCX01D6B", Database="dabo_unittest", 
     294                Host="dabodev.com") 
    295295        self.cur = con.getDaboCursor() 
    296296        self.temp_table_name = "dabo_unittest_tbl" 
  • branches/carl2/dabo/lib/datanav/Form.py

    r2657 r2713  
    194194                help=_("Browse the records in the current recordset.")) 
    195195 
    196         # Add one edit menu item for every edit page (every page past the second) 
     196        def onActivatePage(evt): 
     197            self.pageFrame.SelectedPage = evt.EventObject.Tag 
     198 
     199        # Add an edit menu item, and an activation menu for every subsequent page 
    197200        if self.FormType != "PickList": 
    198201            for index in range(2, self.pageFrame.PageCount): 
    199  
    200202                if index == 2: 
    201  
    202203                    title = "&%s\tAlt+3" % (_(self.pageFrame.Pages[index].Caption)) 
    203  
     204                    onHit = self.onEditCurrentRecord 
     205                    tag = self.pageFrame.Pages[index].DataSource 
     206                    help = _("Edit the fields of the currently selected record.") 
    204207                else: 
    205  
    206                     title = "%s\tAlt+%d" % (_(self.pageFrame.Pages[index].Caption), 
    207  
    208                             index+1) 
    209  
    210                 menu.append(title, OnHit=self.onEditCurrentRecord, bmp="edit", 
    211                         help=_("Edit the fields of the currently selected record."), 
    212                         Tag=self.pageFrame.Pages[index].DataSource) 
    213                 menu.appendSeparator() 
     208                    title = "%s\tAlt+%d" % (_(self.pageFrame.Pages[index].Caption), index + 1) 
     209                    onHit = onActivatePage 
     210                    tag = self.pageFrame.Pages[index] 
     211                    help = "" 
     212                     
     213                menu.append(title, OnHit=onHit, bmp="edit", help=help, Tag=tag) 
     214            menu.appendSeparator() 
    214215 
    215216        if self.FormType != "Edit": 
  • branches/carl2/dabo/lib/datanav/Page.py

    r2633 r2713  
    206206        pass 
    207207     
     208    def setGroupBy(self, biz): 
     209        """Subclass hook.""" 
     210        pass 
     211 
    208212 
    209213    def setOrderBy(self, biz): 
     
    351355                self.setWhere(bizobj) 
    352356                self.setOrderBy(bizobj) 
     357                self.setGroupBy(bizobj) 
    353358                self.setLimit(bizobj) 
    354359             
  • branches/carl2/dabo/ui/dDataControlMixinBase.py

    r2531 r2713  
    160160            # can store the oldval, so always flush 'em. 
    161161            oldVal = None 
    162         if curVal is None or curVal != oldVal: 
     162        if curVal is None: 
     163            isChanged = True 
     164        else: 
     165            if isinstance(curVal, float) and isinstance(oldVal, float): 
     166                # If it is a float, make sure that it has changed by more than the  
     167                # rounding error. 
     168                isChanged = (abs(curVal - oldVal) > 0.0000001) 
     169            else: 
     170                isChanged = (curVal != oldVal) 
     171        if isChanged: 
    163172            if not self._DesignerMode: 
    164173                if self.DataSource and self.DataField: 
  • branches/carl2/dabo/ui/uiwx/dFormMixin.py

    r2639 r2713  
    138138                self._skipActivate = False 
    139139            else: 
     140                # Restore the saved size and position, which can't happen  
     141                # in __init__ because we may not have our name yet. 
     142                try: 
     143                    restoredSP = self.restoredSP 
     144                except: 
     145                    restoredSP = False 
     146                if not restoredSP: 
     147                    if self.SaveRestorePosition: 
     148                        self.restoreSizeAndPosition() 
     149                 
    140150                self.raiseEvent(dEvents.Activate, evt) 
    141151                self._skipActivate = (self.Application.Platform == "Win") 
     
    146156             
    147157    def __onActivate(self, evt):  
    148         # Restore the saved size and position, which can't happen  
    149         # in __init__ because we may not have our name yet. 
    150         try: 
    151             restoredSP = self.restoredSP 
    152         except: 
    153             restoredSP = False 
    154         if not restoredSP: 
    155             if self.SaveRestorePosition: 
    156                 self.restoreSizeAndPosition() 
    157          
    158158        # If the ShowStatusBar property was set to True, this will create it 
    159159        sb = self.StatusBar 
  • branches/carl2/dabo/ui/uiwx/dGrid.py

    r2657 r2713  
    11# -*- coding: utf-8 -*- 
     2import copy 
    23import sys 
    34import datetime 
     
    109110    def setColumns(self, colDefs): 
    110111        """Create columns based on passed list of column definitions.""" 
    111         # Column order should already be in the definition. If there is a custom 
    112         # setting by the user, override it. 
    113  
    114         # See if the defs have changed. If not, update any column info, 
    115         # and return. If so, clear the data to force a re-draw of the table. 
    116112        if colDefs == self.colDefs: 
    117             self.setColumnInfo() 
     113            # Already done, no need to take the time. 
    118114            return 
     115 
     116        app = self.grid.Application 
     117        form = self.grid.Form 
    119118 
    120119        for idx, col in enumerate(colDefs): 
     
    126125                    nm = "" 
    127126            colName = "Column_%s" % nm 
    128             app = self.grid.Application 
    129             form = self.grid.Form 
    130127 
    131128            pos = col._getUserSetting("Order") 
     
    167164                col.Order = num 
    168165        colDefs.sort(self.orderSort) 
    169         self.colDefs = colDefs 
    170         self.setColumnInfo() 
     166        self.colDefs = copy.copy(colDefs) 
    171167     
    172168    def orderSort(self, col1, col2): 
     
    174170         
    175171         
    176     def setColumnInfo(self): 
    177         self.colDefs.sort(self.orderSort) 
    178  
    179  
    180172    def convertType(self, typ): 
    181173        """Convert common types, names and abbreviations for  
     
    17811773    def fillGrid(self, force=False): 
    17821774        """ Refresh the grid to match the data in the data set.""" 
    1783         # Save the focus, if any 
    1784         currFocus = self.FindFocus() 
    1785         currDataField = None 
    1786         # if the current focus is data-aware, we must temporarily remove it's binding 
    1787         # or the value of the control will flow to other records in the bizobj, but 
    1788         # I admit that I'm not entirely sure why.  
    1789         if currFocus: 
    1790             try: 
    1791                 currDataField = currFocus.DataField 
    1792                 currFocus.DataField = "" 
    1793             except AttributeError: 
    1794                 pass 
    17951775 
    17961776        # Get the default row size from dApp's user settings 
     
    18051785        tbl.setColumns(self.Columns) 
    18061786        tbl.fillTable(force) 
    1807  
    1808         ## pkm: I've disabled the following block, because setting the focus 
    1809         ##      can steal focus from the active form. It also doesn't seem  
    1810         ##      right to have this code here... 
    1811         if False and force: 
    1812             row = max(0, self.CurrentRow) 
    1813             col = max(0, self.CurrentColumn) 
    1814             if "linux" in sys.platform: 
    1815                 # Needed on Linux to get the grid to have the focus, 
    1816                 # but on windows this is deadly: 
    1817                 for window in self.Children: 
    1818                     window.SetFocus() 
    1819             # Needed on win and mac to get the grid to have the focus: 
    1820             self.GetGridWindow().SetFocus() 
    1821             if  not self.IsVisible(row, col): 
    1822                 self.MakeCellVisible(row, col) 
    1823                 self.MakeCellVisible(row, col) 
    1824             self.SetGridCursor(row, col) 
    1825          
    1826         if currFocus is not None: 
    1827             # put the data binding back and re-set the focus: 
    1828             try: 
    1829                 currFocus.setFocus() 
    1830                 currFocus.DataField = currDataField 
    1831                 currFocus.refresh() 
    1832             except: pass 
    18331787 
    18341788        if not self._sortRestored:   
  • branches/carl2/dabo/ui/uiwx/dMessageBox.py

    r2351 r2713  
    9393 
    9494if __name__ == "__main__": 
    95     app = wx.PySimpleApp() 
     95    app = dabo.dApp() 
     96    app.showMainFormOnStart = False 
     97    app.setup() 
    9698    print areYouSure("Are you happy?") 
    9799    print areYouSure("Are you sure?", cancelButton=True) 
  • branches/carl2/dabo/ui/uiwx/dPageFrame.py

    r2541 r2713  
    125125        dd.SetSelection(pos) 
    126126         
    127          
    128          
    129          
     127 
     128import random 
    130129class _dPageFrame_test(dPageFrame): 
    131130    def initProperties(self): 
    132131        self.Width = 400 
    133132        self.Height = 175 
     133        self.TabPosition = random.choice(("Top", "Bottom", "Left", "Right")) 
    134134     
    135135    def afterInit(self): 
    136136        self.appendPage(caption="Introduction") 
    137137        self.appendPage(caption="Chapter I") 
    138         self.appendPage(caption="Chapter 2") 
    139      
    140     def beforePageChange(self, fromPage, toPage): 
    141         # Don't allow the user to go from page 0 to page 2 
    142         if fromPage == 0 and toPage == 2: 
    143             return False 
    144         else: 
    145             return True 
     138        self.Pages[0].BackColor = "darkred" 
     139        self.Pages[1].BackColor = "darkblue" 
    146140     
    147141    def onPageChanged(self, evt): 
     
    153147        self.Width = 400 
    154148        self.Height = 175 
     149        self.TabPosition = random.choice(("Top", "Bottom", "Left", "Right")) 
    155150     
    156151    def afterInit(self): 
    157152        self.appendPage(caption="Introduction") 
    158153        self.appendPage(caption="Chapter I") 
    159         self.appendPage(caption="Chapter 2") 
     154        self.Pages[0].BackColor = "darkred" 
     155        self.Pages[1].BackColor = "darkblue" 
    160156     
    161157    def onPageChanged(self, evt): 
     
    167163        self.Width = 400 
    168164        self.Height = 175 
     165        self.TabPosition = random.choice(("Top", "Bottom", "Left", "Right")) 
    169166     
    170167    def afterInit(self): 
    171168        self.appendPage(caption="Introduction") 
    172169        self.appendPage(caption="Chapter I") 
    173         self.appendPage(caption="Chapter 2") 
     170        self.Pages[0].BackColor = "darkred" 
     171        self.Pages[1].BackColor = "darkblue" 
    174172     
    175173    def onPageChanged(self, evt): 
     
    177175 
    178176 
     177         
    179178if __name__ == "__main__": 
    180179    import test