Changeset 331 for trunk/ChangeLog

Show
Ignore:
Timestamp:
06/14/04 07:32:28 (5 years ago)
Author:
paul
Message:

Prep for 0.1.1.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/ChangeLog

    r263 r331  
    1 Dabo-0.1: 
     1Dabo 0.1.1 (2004-06-13): 
     2 
     3------------------------------------------------------------------------ 
     4r330 | ed | 2004-06-13 05:44:35 -0700 (Sun, 13 Jun 2004) | 6 lines 
     5 
     6Re-wrote the __setNonUpdateFields() method to be backend-agnostic. Also 
     7reduced the number of separate queries that were being run: previously, a 
     8query was run for each field in the cursor; now just one query is run, and 
     9the results are determined from that. Got to polish my list comprehension 
     10skills in the process <g>. 
     11 
     12------------------------------------------------------------------------ 
     13r329 | ed | 2004-06-12 14:41:02 -0700 (Sat, 12 Jun 2004) | 11 lines 
     14 
     15Removed the direct access of the cursor's native rowcount and rownumber 
     16properties, and replaced it with protected attributes __rownumber and 
     17__rowcount. Made the properties RowNumber and RowCount to get and set these  
     18properties. 
     19Also updated the SQL builder code to simplify the creation of the SQL 
     20statement. 
     21NOTE: the code recently added to use the cursor's description to determine 
     22non-updatable fields contains MySQL-specific code. Will have to test this 
     23with Firebird to make sure that the 'description' is correctly returned, and 
     24that the limit clause is correctly rendered. 
     25 
     26------------------------------------------------------------------------ 
     27r328 | ed | 2004-06-12 13:07:14 -0700 (Sat, 12 Jun 2004) | 3 lines 
     28 
     29Refactored getCursor() up to the base dBackend class, since the change Paul 
     30just made for dbFirebird.py also works fine for dbMySQL. 
     31 
     32------------------------------------------------------------------------ 
     33r327 | paul | 2004-06-12 12:47:41 -0700 (Sat, 12 Jun 2004) | 4 lines 
     34 
     35Fix dbFirebird.getCursor() to not hardcode the class mix, as it wasn't necessary. 
     36All I needed to do was to pass the connection instance to the cursor constructor. 
     37 
     38 
     39------------------------------------------------------------------------ 
     40r326 | paul | 2004-06-12 12:37:12 -0700 (Sat, 12 Jun 2004) | 9 lines 
     41 
     42Modify dSqlBuilderMixin to return the correct limit clause based  
     43on the backend in use. Firebird uses 'select first 1000...' while 
     44MySQL uses 'select ... limit 1000'. 
     45 
     46Add rownumber class variable to dCursorMixin which provides a 
     47temporary solution to the AttributeError when dbFirebird is the 
     48backend. 
     49 
     50 
     51------------------------------------------------------------------------ 
     52r325 | paul | 2004-06-12 11:27:04 -0700 (Sat, 12 Jun 2004) | 18 lines 
     53 
     54Change default __params value to the empty tuple in dBizobj. Since different 
     55backends expect different types for the params arg, modify dCursorMixin.execute 
     56to not send the params arg at all if it is None or otherwise empty. Tested with 
     57MySQL and Firebird: Ok. 
     58 
     59Modified dbFirebird's getCursor() to do the required mixing-in and to return 
     60a full Dabo cursor instance. dbFirebird now gets past all the initial errors 
     61in my wiz-generated test app. Next up: there is MySQL-specific code in my 
     62dPageDataNav code - dbFirebird is currently choking on the LIMIT clause. 
     63 
     64Modified dProgressDialog to properly react to exceptions that happen in the 
     65passed function. It used to be that if an exception happened in the requery() 
     66code, the dProgressDialog wouldn't handle it and therefore the worker thread 
     67would never return control back to the main thread. Now, control is returned 
     68and the main thread tries to show useful information about the exception. It 
     69is a start at least. 
     70 
     71 
     72------------------------------------------------------------------------ 
     73r324 | ed | 2004-06-11 18:02:38 -0700 (Fri, 11 Jun 2004) | 5 lines 
     74 
     75Abstracted the actual creation of the cursor into the specific backend 
     76objects. They will be passed the class of cursor to create; if they have an 
     77interface for specifying a cursor class, as MySQLdb does, it can be used; if 
     78not, it can be ignored. 
     79 
     80------------------------------------------------------------------------ 
     81r323 | ed | 2004-06-11 17:44:56 -0700 (Fri, 11 Jun 2004) | 7 lines 
     82 
     83Forgot to update these two files. 
     84 
     85For some reason, the log message for the last commit was lost. Here it is: 
     86Changed the method 'getCursor()' to 'getCursorClass()', since its purpose is  
     87to return the class, not the actual cursor 
     88 
     89 
     90------------------------------------------------------------------------ 
     91r322 | ed | 2004-06-11 17:43:02 -0700 (Fri, 11 Jun 2004) | 1 line 
     92 
     93 
     94------------------------------------------------------------------------ 
     95r321 | ed | 2004-06-11 17:41:49 -0700 (Fri, 11 Jun 2004) | 4 lines 
     96 
     97Added explicit import of the uiwx module. This is necessary for the 
     98single-file installer I'm working with, as it can't resolve the import files 
     99when they are not explicitly specified. 
     100 
     101------------------------------------------------------------------------ 
     102r320 | paul | 2004-06-11 16:15:07 -0700 (Fri, 11 Jun 2004) | 21 lines 
     103 
     104Interim commit. Firebird is closer to working. 
     105 
     106Add a connection reference to the dBackend object. 
     107 
     108Update getLastInsertID() code to take advantage of a feature commonly added 
     109to the various dbapi's that automatically saves the last insert id for us. 
     110MySQL has this feature; Firebird does not. 
     111 
     112Add some convenience functions to dBackend (with thin wrappers in dCursorMixin): 
     113    + getTables(): list of tables in the database 
     114    + getTableRecordCount(): count of records in the table 
     115    + getFields(): list of field names and field data types for the table 
     116 
     117    Note that the field data types are expresses in fox-like 'I', 'N', etc. 
     118    format. This is because there aren't a sufficient number of Python types 
     119    to express all the possible database types (memo versus string, etc.) 
     120 
     121Firebird barfs with execute(sql, params=None), but both MySQL and Firebird can 
     122handle params=() so I made that generic change. 
     123 
     124 
     125------------------------------------------------------------------------ 
     126r319 | ed | 2004-06-11 15:01:52 -0700 (Fri, 11 Jun 2004) | 8 lines 
     127 
     128Added code for the cursorMixin to set its own superCursor reference if one 
     129isn't supplied. This will help in cases where this mixin class is used 
     130independently of the bizobj, which normally supplies that reference. Also 
     131wrapped references to the BackendObject property so that errors will not be 
     132thrown if this hasn't been set. If a developer wants to use this mixin 
     133outside of the framework, they will have to be responsible for setting this 
     134reference if they need to use any database-specific features. 
     135 
     136------------------------------------------------------------------------ 
     137r318 | ed | 2004-06-11 07:36:00 -0700 (Fri, 11 Jun 2004) | 5 lines 
     138 
     139Abstracted out the direct use of the cursor's _rows property, as this was a 
     140MySQLdb-specific implementation. The new property is named '_records', and 
     141is created by calling 'fetchall()' after the query is executed. 
     142 
     143 
     144------------------------------------------------------------------------ 
     145r317 | paul | 2004-06-10 16:52:35 -0700 (Thu, 10 Jun 2004) | 4 lines 
     146 
     147This commit makes Firebird cursors possible, but I'm not sure how the dictcursor 
     148stuff will resolve. I've verified that a connection is successful, but haven't 
     149verified that results can be obtained from the cursor yet. 
     150 
     151------------------------------------------------------------------------ 
     152r316 | paul | 2004-06-09 16:07:44 -0700 (Wed, 09 Jun 2004) | 1 line 
     153 
     154Attempting to reproduce Julian's tracebacks on Win32 but failed. I did note other oddities however, so for now I've disabled MDI Windows which makes the Windows version run just like the Linux version. 
     155------------------------------------------------------------------------ 
     156r315 | paul | 2004-06-09 15:44:14 -0700 (Wed, 09 Jun 2004) | 6 lines 
     157 
     158Fix some bugs in dConnectInfo that kept the wizMaintenanceApp from setting a  
     159valid dbConnectionDef.py file. 
     160 
     161Begin tweaking the Firebird classdef. 
     162 
     163 
     164------------------------------------------------------------------------ 
     165r314 | ed | 2004-06-09 08:16:23 -0700 (Wed, 09 Jun 2004) | 4 lines 
     166 
     167Added a rudimentary debugging dialog to the menu. Not quite a Command 
     168Window, but it at least allows for a little bit of interactive debugging. 
     169Eventually should be wrapped with a check for developer vs. user status. 
     170 
     171------------------------------------------------------------------------ 
     172r313 | ed | 2004-06-09 08:13:08 -0700 (Wed, 09 Jun 2004) | 2 lines 
     173 
     174Corrected reference that was throwing an error when working in the Designer. 
     175 
     176------------------------------------------------------------------------ 
     177r312 | ed | 2004-06-09 08:11:47 -0700 (Wed, 09 Jun 2004) | 2 lines 
     178 
     179Corrected problems integrating cursors with backend classes. 
     180 
     181------------------------------------------------------------------------ 
     182r311 | ed | 2004-06-09 08:11:30 -0700 (Wed, 09 Jun 2004) | 2 lines 
     183 
     184Corrected problems integrating cursors with backend classes. 
     185 
     186------------------------------------------------------------------------ 
     187r310 | ed | 2004-06-09 04:24:12 -0700 (Wed, 09 Jun 2004) | 3 lines 
     188 
     189Added stub files for Firebird and Sqlite. These are not tested at all, and 
     190will need to be completed with backend-specific code in order to work. 
     191 
     192------------------------------------------------------------------------ 
     193r309 | ed | 2004-06-07 14:11:10 -0700 (Mon, 07 Jun 2004) | 2 lines 
     194 
     195Added code to ignore the temp PK field when creating diffs. 
     196 
     197------------------------------------------------------------------------ 
     198r308 | ed | 2004-06-07 13:23:08 -0700 (Mon, 07 Jun 2004) | 3 lines 
     199 
     200Separated the processes of a) setting the FK link in a child and b) letting 
     201the child know the current state of its parent. 
     202 
     203------------------------------------------------------------------------ 
     204r307 | paul | 2004-06-07 13:11:11 -0700 (Mon, 07 Jun 2004) | 4 lines 
     205 
     206Remove svn:executable flags from some of the newly-added scripts. I  
     207think that this flag is getting added automagically for some reason. 
     208 
     209 
     210------------------------------------------------------------------------ 
     211r306 | ed | 2004-06-07 12:58:35 -0700 (Mon, 07 Jun 2004) | 2 lines 
     212 
     213Removed old code from my first pass at creating a saveProps stack. 
     214 
     215------------------------------------------------------------------------ 
     216r305 | ed | 2004-06-07 12:55:32 -0700 (Mon, 07 Jun 2004) | 9 lines 
     217 
     218Refactored the db classes to abstract out the backend-specific code into 
     219separate classes. There is now nothing MySQL-specific in the code (except, 
     220of course, the dbMySQL.py script!). Adding support for additional backends 
     221now will require adding a script for that backend's specific needs, and also 
     222an additional 'elif' statement in dConnectInfo.py. I changed to an if/elif 
     223structure instead of the eval() syntax because the this no longer requires 
     224that the database code be in the dBackend.py file, and the code no longer 
     225relies on naming conventions to work. 
     226 
     227------------------------------------------------------------------------ 
     228r304 | ed | 2004-06-04 05:53:29 -0700 (Fri, 04 Jun 2004) | 3 lines 
     229 
     230Added some defensive code to properly handle the new Form and Application 
     231properties when working from the Designer. 
     232 
     233------------------------------------------------------------------------ 
     234r303 | ed | 2004-05-28 05:09:59 -0700 (Fri, 28 May 2004) | 4 lines 
     235 
     236Corrected potential problem in scan() when it tries to restore its position 
     237to a row which no longer exists. In this case, it will set the row number to 
     238the last row in the data set. 
     239 
     240------------------------------------------------------------------------ 
     241r302 | paul | 2004-05-27 18:59:04 -0700 (Thu, 27 May 2004) | 10 lines 
     242 
     243Calling setChildLinkFilter() in requery() is too late, as the SQL  
     244has already been set with setSQL(), so for now I moved that from  
     245requery() to setSQL() although I'm not sure if that is correct, but 
     246it does work. 
     247 
     248Fix typo in dCursorMixin. 
     249 
     250See my next commit to appRecipes as well. 
     251 
     252 
     253------------------------------------------------------------------------ 
     254r301 | ed | 2004-05-27 14:12:19 -0700 (Thu, 27 May 2004) | 2 lines 
     255 
     256Corrected two typos in the prop defitions. 
     257 
     258------------------------------------------------------------------------ 
     259r300 | ed | 2004-05-27 14:11:40 -0700 (Thu, 27 May 2004) | 2 lines 
     260 
     261Removed old syntax for RowNumber, RowCount and the allrows parameters 
     262 
     263------------------------------------------------------------------------ 
     264r299 | ed | 2004-05-27 11:13:34 -0700 (Thu, 27 May 2004) | 45 lines 
     265 
     266dBizobj:  
     267- changed a single cursor reference to a list of cursors, keyed on parent 
     268key. For independent cursors, this key is simply None. 
     269- modified all methods to support this new cursor design. 
     270- created read-only property 'Cursor' which will return the current cursor. 
     271- removed getRowNumber(), setRowNumber() and getRowCount() methods. Replaced 
     272them with the properties RowNumber and RowCount. 
     273- removed temp PK generation and management. Moved that logic to the cursor 
     274class. 
     275- there is now isChanged(), which only tests the current row, and 
     276isAnyChanged(), which tests the entire recordset. 
     277- save(), cancel(), etc., no longer accept an 'allrows' parameter. Instead, 
     278there are new saveAll(), cancelAll(), etc. methods to be called. 
     279- added scan() function which takes a function that will be called once for 
     280each record in the current recordset. 
     281- added setChildLinkFilter() method, which tells the child bizobjs which 
     282cursor to use as their current cursor when the parent record changes. 
     283- added getChangedRecordNumbers(), which will return a list containing the 
     284record numbers of all records for which isChanged() returns True. Since the 
     285change might be in a related child record, a record number may appear in the 
     286list even though none of its fields have changed. 
     287- added getRecordStatus(), which accepts a record number as a parameter 
     288(default=current record). Will return a dictionary containing an element for 
     289each modified field. The field name will be the element key, and the element 
     290value will be a tuple whose zeroth element is the original value, and whose 
     291first element is its current value. 
     292 
     293dCursorMixin: 
     294- temp PK support is now handled here instead of the bizobj. 
     295- getPK() will return the temp PK for a new, unsaved record 
     296- implemented getRecordStatus() - see bizobj notes above. 
     297- fixed bug introduced into the SQL update statements wwhen datetime support was 
     298added. 
     299 
     300dSqlBuilderMixin: 
     301- added childFilterClause, to handle auto-filtering of child record sets by 
     302the parent FK. 
     303 
     304dForm: 
     305- removed references to 'allrows' in save(), cancel(), etc., and replaced 
     306them with the appropriate methods (saveAll(), etc.) 
     307 
     308dConstants: 
     309- added constant for the temp PK field name 
     310 
     311------------------------------------------------------------------------ 
     312r298 | paul | 2004-05-27 10:39:10 -0700 (Thu, 27 May 2004) | 3 lines 
     313 
     314Fix problem with setting the grid cursor column, where the  
     315current cursor column is -1. 
     316 
     317------------------------------------------------------------------------ 
     318r297 | paul | 2004-05-25 12:51:17 -0700 (Tue, 25 May 2004) | 3 lines 
     319 
     320Workaround to minor problem where the grid will scroll one column to the  
     321right and one row down when first instantiated. 
     322 
     323------------------------------------------------------------------------ 
     324r296 | paul | 2004-05-24 18:16:38 -0700 (Mon, 24 May 2004) | 1 line 
     325 
     326Fixes for Mac. 
     327------------------------------------------------------------------------ 
     328r295 | paul | 2004-05-24 17:44:27 -0700 (Mon, 24 May 2004) | 7 lines 
     329 
     330Rename properties dApp and dForm to Application and Form, respectively. 
     331Move the definition of Form out of dObject and into dPemMixin, as  
     332dObject was too low a location (outside of UI). 
     333 
     334 
     335 
     336 
     337------------------------------------------------------------------------ 
     338r294 | paul | 2004-05-24 12:40:29 -0700 (Mon, 24 May 2004) | 22 lines 
     339 
     340Add newlines and tabs to the output SQL in SQLBuilderMixin, as it makes 
     341it easier on the eyes for SQL debugging purposes. 
     342 
     343Add property dForm to all Dabo objects. Analagous to THISFORM in VFP, it 
     344will always contain a reference to the form.  
     345 
     346Add dGrid, a generic grid based on dControlMixin so it is a dObject. It  
     347implements its own DataSource property as it doesn't inherit from  
     348dDataControlMixin. Make dGridDataNav inherit from this new dGrid. Over 
     349time, I may move some behavior from dGridDataNav into dGrid if it seems 
     350like the behavior would apply to general dGrids. 
     351 
     352Make dForm.getBizobj() descend into the child bizobj hierarchy to find 
     353the referenced dataSource. Previously, only top-level bizobjs as registered 
     354with dForm.addBizobj() were searched. 
     355 
     356Add properties SelectPageClass, BrowsePageClass, EditPageClass, and 
     357ChildPageClass to dPageFrameDataNav, which allows for easy user-overriding 
     358of the pages in the dFormDataNav framework. Add property DefaultPagesOnLoad, 
     359which turns on/off the default select/browse/edit/child pages. 
     360 
     361 
     362------------------------------------------------------------------------ 
     363r293 | paul | 2004-05-21 13:25:43 -0700 (Fri, 21 May 2004) | 11 lines 
     364 
     365Introduce dDateControl, a composite control for editing date values. It is 
     366very crude, but it did work in my test - it kept in sync with the bizobj. 
     367 
     368Modify update and insert code in dCursorMixin to properly format dates for  
     369saving to MySQL - it wasn't putting quotes around the values. Put in  
     370comments regarding MySQL-specific code. 
     371 
     372Tested working with dates in the UI and saving to MySQL, and it seemed to  
     373work just fine. 
     374 
     375 
     376------------------------------------------------------------------------ 
     377r292 | paul | 2004-05-20 14:44:18 -0700 (Thu, 20 May 2004) | 7 lines 
     378 
     379Remove minor cruft from dFormMixin. Make it load the smaller 048 Dabo icon 
     380by default. 
     381 
     382Add an icon to the login form by converting dLogin.Icon to a bitmap. 
     383 
     384 
     385 
     386------------------------------------------------------------------------ 
     387r291 | paul | 2004-05-19 17:47:07 -0700 (Wed, 19 May 2004) | 16 lines 
     388 
     389Add a place for messages to be added to the login form, and set up 
     390dSecurityManager to pass on informative messages during the login  
     391process. 
     392 
     393Add logged-in user name to the caption of the main form. Display  
     394the application name in the caption of the login form. 
     395 
     396Move the ordering of app instantiation steps around somewhat so that 
     397the login form displays before the main form. Now, you only get to  
     398see the main form after a successful login. 
     399 
     400Base dDialog on dFormMixin, which lets it harness some useful form  
     401properties. 
     402 
     403 
     404 
     405------------------------------------------------------------------------ 
     406r290 | ed | 2004-05-19 16:37:21 -0700 (Wed, 19 May 2004) | 11 lines 
     407 
     408Corrected really stupid bug in the cursor mixin where the _blank dictionary 
     409was being added to the result set, instead of a copy of it. This meant that 
     410changing the new record changed the 'blank' template, and subsequent new 
     411records were just adding new references to the same dictionary. 
     412 
     413Added support for temp PKs for new records. Child records will get those 
     414temp PKs as their linked FKs. Work still needs to be done when saving a new 
     415parent record to ensure that its new PK is propagated down to its new 
     416children. 
     417 
     418 
     419------------------------------------------------------------------------ 
     420r289 | ed | 2004-05-19 13:02:56 -0700 (Wed, 19 May 2004) | 6 lines 
     421 
     422Modified the bizobj to handle 'backfilling' the FK links in child records 
     423added to a newly-created parent record.  
     424 
     425This has only been tested marginally, so Paul, please let me know how it 
     426works with the changes you are making to the recipes demo. 
     427 
     428------------------------------------------------------------------------ 
     429r288 | paul | 2004-05-19 11:55:43 -0700 (Wed, 19 May 2004) | 18 lines 
     430 
     431Introduce dSecurityManager, which handles validating a user login and caching 
     432group membership information. Introduce property SecurityManager to dApp  
     433object, allowing users to subclass dSecurityManager to do what they need it  
     434to do, and then attach an instance of their subclass to dApp.  
     435 
     436Make dApp check with the SecurityManager if available, before starting the 
     437main application event loop. 
     438 
     439Introduce new UI class dDialog, which is a very simple frame usually meant 
     440to be shown modally and to return a value. Introduce new UI class dLogin,  
     441which is a basic login form. 
     442 
     443Wrap some property docstrings in _().  
     444 
     445Start experimenting with Accelerator Tables, which can be used to workaround 
     446the lack of Cancel and Default properties in command buttons. 
     447 
     448 
     449------------------------------------------------------------------------ 
     450r287 | paul | 2004-05-18 18:01:26 -0700 (Tue, 18 May 2004) | 13 lines 
     451 
     452Create common ancestor object for all dabo objects, and christen it 
     453'dObject'. Not all Dabo objects inherit from this yet, and perhaps not 
     454all ever will - there is little reason for dCursorMixin to inherit from 
     455it, for example. The intent was for there to be some commonality in the 
     456public interface for all Dabo objects. 
     457 
     458Move some of the more common stuff out of ui/uiwx/classes/dPemMixin and 
     459into the new common/dObject. 
     460 
     461Add docstrings to the properties in dabo.db.dConnectInfo. 
     462 
     463 
     464 
     465------------------------------------------------------------------------ 
     466r286 | paul | 2004-05-18 13:55:40 -0700 (Tue, 18 May 2004) | 42 lines 
     467 
     468Rename dGrid to dGridDataNav, as it is really not meant as a general 
     469grid control but rather to fit in with the dFormDataNav subframework. 
     470It assumes that it is a member of a dPageDataNav, for instance. At  
     471some point, we'll want to define a basic dGrid which dGridDataNav will 
     472inherit, but the grid is one of the most complex UI controls so it'll 
     473have to wait for now. 
     474 
     475Add new property, FormType, to dFormDataNav. There is 'Normal', which  
     476is a normal form with Select/Browse/Edit/n childview pages; 'PickList'  
     477which doesn't display the edit/childview pages and is intended to be 
     478used to pick a record from a lookup; and 'Edit' which isn't implemented 
     479yet but will only display the edit page(s) for the record with the  
     480given pk value. 
     481 
     482Add new event, EVT_ITEMPICKED, for use by dFormDataNav when instantiated 
     483as a picklist. 
     484 
     485Make dGrid behave differently in several places, depending on whether  
     486its form is a picklist or a normal nav form. 
     487 
     488Make the picklist form close upon a keypress of Escape. Make the toolbar/ 
     489navigation menu display only the appropriate items depending on FormType. 
     490 
     491Define a childBehavior dict in dFormDataNav, which lets subclasses  
     492define certain things about how the childview page(s) will behave. Note 
     493that this isn't how I want it to stay, this was just to get up and 
     494running. Eventually, users will be able to easily subclass all of the 
     495separate components of dFormDataNav, not merely the form itself, and 
     496there will be appropriate hooks where they can put their code. 
     497 
     498Update the childview page to add and delete child records. Editing child 
     499records isn't implemented yet. Note that until the non-unique pk problem 
     500is fixed as discussed this morning, weird things can happen when adding 
     501child records, especially more than one of them, and it will fail if you 
     502try to add child records to a newly-added parent record.  
     503 
     504-- 
     505 
     506(I also just tweaked my svn-repository commit-notify email script, to  
     507hopefully not give the diff of deleted files. So, if it worked, there 
     508should not be a diff for the deleted dGrid.py.) 
     509 
     510------------------------------------------------------------------------ 
     511r285 | ed | 2004-05-17 09:45:13 -0700 (Mon, 17 May 2004) | 4 lines 
     512 
     513Removed the beforeConnection() and afterConnection() methods, as they are 
     514not implemented anywhere in the code. Use beforeCreateCursor() and 
     515afterCreateCursor() instead. 
     516 
     517------------------------------------------------------------------------ 
     518r284 | ed | 2004-05-17 06:58:50 -0700 (Mon, 17 May 2004) | 3 lines 
     519 
     520Changed the way the testing sql expression is generated in the 
     521__setNonUpdateFields() method. 
     522 
     523------------------------------------------------------------------------ 
     524r283 | ed | 2004-05-17 05:18:49 -0700 (Mon, 17 May 2004) | 2 lines 
     525 
     526Stupid typo! 
     527 
     528------------------------------------------------------------------------ 
     529r282 | ed | 2004-05-17 05:10:39 -0700 (Mon, 17 May 2004) | 2 lines 
     530 
     531Implemented the FillLinkFromParent logic for child bizobjs. 
     532 
     533------------------------------------------------------------------------ 
     534r281 | ed | 2004-05-16 18:27:26 -0700 (Sun, 16 May 2004) | 17 lines 
     535 
     536Modified the cursor to handle calculated and derived fields that are not to 
     537be included in updates to the backend database. The cursor mixin class has a 
     538user-editable list property called 'nonUpdateFields', and there is a private 
     539list property named '__nonUpdateFields' that is set by the cursor mixin 
     540after each requery. For most cases, the built-in behavior should suffice to 
     541prevent illegal update statements resulting from trying to update a derived 
     542field. The user-configurable property is there to allow the user to specify 
     543additonal fields to be ignored during an update. 
     544 
     545The list of user-defined non-updatable fields is set by the bizobj's 
     546'NonUpdateFields' property. Accessing the NonUpdateFields property will 
     547return the concatenated list of the public and private non-update lists. 
     548 
     549Also fixed a bunch of edge conditions dealing with the fact that until a 
     550query is run, the cursor doesn't have many of the attributes that were 
     551expected, such as _rows, rownumber, etc. 
     552 
     553------------------------------------------------------------------------ 
     554r280 | ed | 2004-05-16 18:13:19 -0700 (Sun, 16 May 2004) | 3 lines 
     555 
     556Changed delete() to first check if there is a record in the current 
     557recordset to be deleted. 
     558 
     559------------------------------------------------------------------------ 
     560r279 | paul | 2004-05-16 13:04:27 -0700 (Sun, 16 May 2004) | 1 line 
     561 
     562Oops... here is my last commit but with the scrollbars working. 
     563------------------------------------------------------------------------ 
     564r278 | paul | 2004-05-16 12:11:18 -0700 (Sun, 16 May 2004) | 12 lines 
     565 
     566Introduce new dScrollPanel control, which is a dPanel but with scrollbars. 
     567This control needs to be worked on some more, to add properties for specifying 
     568scrollbar behavior and increments. As it stands, it does a pretty good job of 
     569automatically setting itself up. 
     570 
     571Make dPage inherit from dScrollPanel instead of dPanel, so that scrollbars 
     572are available on dPage's by default. 
     573 
     574Refactor some of the browse page in dFormDataNav, fixing a problem that would 
     575occur when the rownum changed when the browse page wasn't the active page. 
     576 
     577 
     578------------------------------------------------------------------------ 
     579r277 | paul | 2004-05-16 10:33:08 -0700 (Sun, 16 May 2004) | 4 lines 
     580 
     581BugFix: After one of my last commits, SimpleFormWithControls and DaboDesigner 
     582failed to start, because they don't use the dApp application object. 
     583 
     584 
     585------------------------------------------------------------------------ 
     586r276 | paul | 2004-05-15 23:27:34 -0700 (Sat, 15 May 2004) | 16 lines 
     587 
     588Fix dGrid's newRecord(), editRecord(), and deleteRecord() functions to 
     589not eat exceptions. 
     590 
     591Fix bug introduced with my last commit that kept the form size/position 
     592from being restored because I overrode OnActivate() without running 
     593doDefault(). 
     594 
     595Change the saving of form size/position to use the absolute name rather 
     596than just the plain name. 
     597 
     598Implement deleting child records in dFormDataNav. Attempted to begin  
     599implementation of adding new child records, but ran into a problem with 
     600dCursorMixin and/or dBizobj that I posted a separate message regarding. 
     601 
     602 
     603 
     604------------------------------------------------------------------------ 
     605r275 | paul | 2004-05-15 16:46:18 -0700 (Sat, 15 May 2004) | 30 lines 
     606 
     607Add property dApp to dPemMixin, a reference to the dApp application object 
     608when dApp is present or None. This gives convenient access to dApp from 
     609all controls that inherit from dPemMixin (almost all Dabo controls and 
     610forms). 
     611 
     612Make dApp inherit from PropertyHelperMixin and DoDefaultMixin to conform 
     613to most of the rest of the Dabo objects. 
     614 
     615Add property AutoNegotiateUniqueNames to dApp, default True. When true, 
     616if an object tries to name itself identical to a sibling, a unique name 
     617will be found by appending an integer at the end. When false, a NameError 
     618will be raised which was the previous behavior.  
     619 
     620The auto-negotiation of names is definitely implicit, and could potentially  
     621cause confusion when debugging problems. Consider: 
     622 
     623    self.addObject(dabo.ui.dCheckBox, 'myCheckbox') 
     624    self.addObject(dabo.ui.dCheckBox, 'myCheckbox') 
     625 
     626No errors would have been raised, and two checkboxes got created, but  
     627the second checkbox got a name that differs from the name specified by the 
     628programmer ('myCheckbox1' instead of 'myCheckbox'). 
     629 
     630I think the convenience outweighs the concerns about implicitness, but  
     631would be willing to change the default to False instead of True, which may 
     632be better as the programmer would have to explicity tell dApp to act 
     633implicitly, and presumably understand the consequences by doing so.  
     634 
     635 
     636 
     637------------------------------------------------------------------------ 
     638r274 | paul | 2004-05-15 14:53:28 -0700 (Sat, 15 May 2004) | 5 lines 
     639 
     640Add property RequeryOnLoad to dFormDataNav, default False. Add code in 
     641dFormDataNav to check the value of the propery and run the requery if 
     642appropriate. 
     643 
     644 
     645------------------------------------------------------------------------ 
     646r273 | paul | 2004-05-14 20:59:12 -0700 (Fri, 14 May 2004) | 11 lines 
     647 
     648Move setting dTextBox.SelectOnEntry from afterInit() to initProperties(), 
     649where the user still has a chance to override. 
     650 
     651Change name of properties SpinnerLowValue and SpinnerHighValue to Min 
     652and Max, respectively. Remove the setting of default min/max values. 
     653 
     654Add spinner for setting the limit to the select page of dFormDataNav. 
     655 
     656  
     657 
     658 
     659------------------------------------------------------------------------ 
     660r272 | ed | 2004-05-14 05:05:51 -0700 (Fri, 14 May 2004) | 4 lines 
     661 
     662Cleaned up problem when a save() was called and no changes were needed. Also 
     663removed a problem in the cursor where a conflict between Unicode and String 
     664types was causing errors to be thrown. 
     665 
     666------------------------------------------------------------------------ 
     667r271 | ed | 2004-05-14 04:55:26 -0700 (Fri, 14 May 2004) | 26 lines 
     668 
     669Removed the calls to requeryAllChildren() and afterPointerMove() from the 
     670bizobj. Added those calls as an option to the seek() method. 
     671 
     672The first two methods are "for internal use only", and should never be called from 
     673an app. They exist so that the bizobj can move the pointer to where it needs 
     674to be without triggering a slew of additional effects.  
     675 
     676moveToPK() is only used in a requery() to try to restore the record pointer 
     677to the PK of the record it was on before the cursror was requeried. It is 
     678followed by a call to requeryAllChildren() and afterPointerMove() in that 
     679method; calling it again from this one is just inefficient.. 
     680 
     681moveToRowNum() is called by the validate() method so that a bizobj can check 
     682all of its records. You don't want it requerying its children, as they will 
     683need to be validated separately, and will be called in turn. 
     684 
     685In VFP Codebook, these methods are protected. For record pointer movement 
     686from within an app, the public methods first(), next(), etc., should be used 
     687to move the record pointer. 
     688 
     689Since seek() is intended to be called both internally and from developer's 
     690code, I've added a parameter 'runRequery' which defaults to False. If this 
     691value is passed as True, requeryAllChildren() and afterPointerMove() will be 
     692called if the cursor moves the pointer. 
     693 
     694 
     695------------------------------------------------------------------------ 
     696r270 | paul | 2004-05-13 22:17:15 -0700 (Thu, 13 May 2004) | 34 lines 
     697 
     698Bugfix: refactor old pre-dException code in dBizobj.requeryAllChildren(). 
     699 
     700Tried to change default of dBizobj.RequeryOnLoad() to False instead  
     701of True, but look at that it was already set to False. I guess I  
     702slipped this in before and forgot. I'll fix the demos. 
     703     
     704Recently, when we started forcing unique sibling names, I made the 
     705constructor append the id of the control to make the name unique if 
     706needed. I've improved this somewhat by making it an auto-incrementing 
     707integer instead (txt1, txt2, txt3, etc.). 
     708 
     709Add event handlers OnCreateWindow and OnDestroyWindow, and bind them  
     710to EVT_WINDOW_CREATE and EVT_WINDOW_DESTROY for all controls. 
     711 
     712Add new dEvent, EVT_VALUECHANGED, and raise this event whenever a 
     713control's value changes, whether programatically or interactively. 
     714 
     715Add new function getAbsoluteName() to dPemMixin, which returns self's 
     716fully-qualified name, such as 'dFormRecipes.dPageFrame.Page1.txtName'. 
     717 
     718Remove the property list for the form being output to the shell, which 
     719was causing problems on Windows and isn't necessary anyway. 
     720 
     721Refactor some of the Select page in dFormDataNav, and make the select 
     722checkboxes and textboxes persist their values to the user settings  
     723table. Now the select page will remember what you last searched on 
     724and present it to you for convenience. 
     725 
     726Actually, that persisting of values that I use in the select page is 
     727now available for all data controls, by setting the new property 
     728SaveRestoreValue. 
     729  
     730 
     731 
     732------------------------------------------------------------------------ 
     733r269 | ed | 2004-05-13 14:38:44 -0700 (Thu, 13 May 2004) | 3 lines 
     734 
     735Trapped the NoRecordsException when clicking on headers of grids with no 
     736records. 
     737 
     738------------------------------------------------------------------------ 
     739r268 | paul | 2004-05-12 17:21:03 -0700 (Wed, 12 May 2004) | 8 lines 
     740 
     741Bug fix: when the record changed and a control was active, dForm would 
     742inappropriately raise an exception because it was checking for a non- 
     743existent return value. 
     744 
     745Set internal _curVal when the control refreshes, to avoid unnecessary  
     746calls to the bizobj during flushValue() and possibly other places. 
     747 
     748 
     749------------------------------------------------------------------------ 
     750r267 | paul | 2004-05-12 17:08:40 -0700 (Wed, 12 May 2004) | 1 line 
     751 
     752Fix lame bug introduced with that last commit. 
     753------------------------------------------------------------------------ 
     754r266 | paul | 2004-05-12 17:04:00 -0700 (Wed, 12 May 2004) | 2 lines 
     755 
     756Work around AttributeError on Mac. 
     757 
     758------------------------------------------------------------------------ 
     759r265 | paul | 2004-05-12 16:59:35 -0700 (Wed, 12 May 2004) | 2 lines 
     760 
     761Workaround so that the navigation menu in dFormDataNav works on Mac. 
     762 
     763------------------------------------------------------------------------ 
     764r264 | paul | 2004-05-11 20:22:58 -0700 (Tue, 11 May 2004) | 18 lines 
     765 
     766The user can use bizobj.validateRecord() in a couple ways:  
     767    1) return errorMessageText, and dBizobj will raise the exception 
     768    2) raise the exception itself. 
     769In case #2, None is returned, resulting in an exception in dBizobj. 
     770This code fixes that. 
     771 
     772If a user were to requery, and then answer yes to save changes, but  
     773the save failed, the requery would happen anyway, wiping out all  
     774their changes. This code fixes that. 
     775 
     776There are still some funky problems though. Do this: 
     777    1) add a new record and save 
     778    2) add a new record and make the bizrule fail. 
     779Note that the bizrule error text is listed twice, and that the browse 
     780screen has reverted the original successfully-saved record back to the 
     781value it had when it was new. 
     782 
     783 
     784------------------------------------------------------------------------ 
     785r263 | paul | 2004-05-11 12:52:02 -0700 (Tue, 11 May 2004) | 2 lines 
     786 
     787Update changelog for 0.1 with the property list change. 
     788 
     789------------------------------------------------------------------------ 
     790 
     791 
     792 
     793Dabo-0.1 (2004-05-10): 
    2794 
    3795------------------------------------------------------------------------