27 Dec 2010

3-tier desktop app framework for Python.

Dabo is a 3-tier, cross-platform application development framework, written in Python atop the wxPython GUI toolkit. And while Dabo is designed to create database-centric apps, that is not a requirement. Lots of people are using Dabo for the GUI tools to create apps that have no need to connect to a database at all.

Desktop applications. That's what Dabo does. It's not YAWF (yet another Web framework). There are plenty of excellent Web frameworks out there, so if that's what you are looking for, Dabo isn't for you. But there are almost no desktop application frameworks out there, and if you want to create applications thatMore...

What's New

Version 0.9.3:

Cleaned up the code base by removing all trailing whitespace.

Removed the ref to md5 and replaced with hashlib. haslib is currently already being used in dDataSet.py and md5 has been deprecated (those users of python 2.4 or less need to install the hashlib.py)

Added dabo.lib.reportUtils.printPDF(), and added a print button to FrmReportBase in the AppWizard generated code.More...

Requirements

Mac OS X 10.3 or later

Python 2.4 or higher (2.5 recommended).

wxPython 2.6 or higher (2.8 highly recommended).

Also, MySQLdb (for MySQL).

kinterbasdb (Firebird).

pysqlite (SQLite) or psycopg (PostgreSQL) is required for the database-releated demos to work.

Similar Software

No similar apps have been recommended yet. You can add your suggestions to the right.

App Name

Smile Score

Suggest other similar software

suggested

Like this app? Be the first to add it to a collection!Create a Collection by bringing together complementary apps that have a common theme or purpose, then share it and discover new collections!+Create a Collection

Ratings

Details

Dabo is a 3-tier, cross-platform application development framework, written in Python atop the wxPython GUI toolkit. And while Dabo is designed to create database-centric apps, that is not a requirement. Lots of people are using Dabo for the GUI tools to create apps that have no need to connect to a database at all.

Desktop applications. That's what Dabo does. It's not YAWF (yet another Web framework). There are plenty of excellent Web frameworks out there, so if that's what you are looking for, Dabo isn't for you. But there are almost no desktop application frameworks out there, and if you want to create applications that run on Windows, OS X or Linux, Dabo is for you!

Version 0.9.3:

Cleaned up the code base by removing all trailing whitespace.

Removed the ref to md5 and replaced with hashlib. haslib is currently already being used in dDataSet.py and md5 has been deprecated (those users of python 2.4 or less need to install the hashlib.py)

Added dabo.lib.reportUtils.printPDF(), and added a print button to FrmReportBase in the AppWizard generated code.

On Windows, where the status text can go to the main frame, hidden forms were writing their current record text to the status bar on update. This fixes that awkwardness.

Fixed a bug reported by Mark Rajcok in which the WordWrap property grid columns was only affecting those with str DataType, and was ignoring unicode DataType.

Switched all of Dabo's logging to use standard Python logging.

Switched from os.system() and os.popen2() to subprocess.call() in previewPDF() and printPDF(). Removes DeprecationWarnings in Python 2.6 and above.

Added some logic to prevent infinite loops when using field-level validation.

Added a fix so that previewing and printing should be modeless by default.

Updated the internal cache code to handle permissions better when running under mod_wsgi.

Added the 'SelectedText' and 'Text' read-only properties to dHtmlBox.

Added the reports folder to the resolvePathAndUpdate method in the utils module. Added a conditional check in the reportWriter to call the resolvePathAndUpdate method if the path is a valid absolute path. So, now you can specify the ReportFormFile property of the ReportWriter object is a relative path.

Reverts a behavioral change introduced accidentally in r5846. Now scan() will requery child bizobjs by default.

Created the 'ustr()' method in dabo.lib.utils. This is designed to replace all of our calls to str() in order to eliminate the unicode encoding errors that pop up frequently when non-American developers use Dabo.To use, include the line:

from dabo.lib.utils import ustr

in your import statements, and then replace all instances of str(val) with ustr(val).

Added some sizer outline code to dFormMixin that was inadvertantly left out of the last Web Update.

dRichTextBox: Changed the 'InsertionPoint' property to 'InsertionPosition' to be consistent with other editing controls.

dRichTextBox: Renamed the 'loadFromFile()' and 'saveToFile()' methods to 'load()' and 'save()', respectively, as they can use any file-like object.

Added the dRichTextBox class, which allows for basic rich text editing and display.

Fixed a bug in Web Update that prevented apps from recognizing that Web Update had not yet been run for that Dabo installation.

Changed the PreferenceDialog to use a basic dPageFrame instead of dPageList, due to wx warnings.

Fixed a potential problem in list controls where the control could try to access its value before the correct DataSource had been set.

Added code to reduce dGrid flickering under Windows.

Added the ImageRenderer class to display images in grid cells.

The code that handles dropped text/files now preserves the x,y location of the drop so that you can tell where on the control the user dropped.

Added a textbox-level NoneDisplay property so that individual text box controls can determine how they display None values instead of all controls using dApp.NoneDisplay.

Fixed an incompatibility with a recent wxPython change to the foldpanelbar class.

Several visual improvements to the dPageStyled class.

Fixed a bug in dSlider that prevented reversed display.

Fixed some inheritance issues with sizers.

Improved sizer outlining to be more flexible. This is mostly for app design uses.

Added support for the dPageStyled class to the Class Designer.

Added visual indication of sizers in the Class Designer when a sizer is the selected object.

Added the HomeDirectoryStatusBar to the visual tools to display your current app's HomeDirectory.

Updated the standard directory structure for Dabo apps to include 'cache' and 'lib' directories.

Fixed some import errors in reportWriter.py

Added an optimization to dDataSet that improves performance when doing multiple queries against the same data.

Added an optional optimization to dBizobj that avoids having to requery child bizobjs during a scan().

Fixed a bug in the JsonConverter imports.

Corrected the bizobj isChanged() function to reflect new records as well as modified records.

Added dApp.AutoImportConnections property. When False, dApp will skip the process of finding and loading dConnectInfo objects from found cnxml files. My app is being enhanced to use cnxml files, but I use my own logic on which cnxml file to use.

Augmented biz.getTempCursor() with some optional arguments, allowing the appdev to set sql, params, and have automatic requerying before returning the cursor reference.

dSlider: added the Reversed and TickPosition properties, as requested by Mike Mabey.

Finally fixed a dMenuItem bug that's been bothering me for (I think) years now. On Windows, sometimes there would be double captions, and the "Close Window" item in the File menu would be corrupted. Apparently, the timing of calling SetBitmap() is crucial: it must happen before SetText().

dDateTextBox: allows the user to clear the date (set to None) by adding a shortcut ('N')

dReportWriter: Fixed bug with spanning objects: if the group didn't print for whatever reason, the spanning never started. Therefore, we can't try to draw the object.

Fixed a bug in dGrid's incremental search on Windows.

Refactored the 'resolvePathAndUpdate()' method into dabo.lib.utils instead of dabo.ui.uiwx

Added window scrolling events to dGrid and dScrollPanel, so that your code can now handle them if needed.

Added optional argument to cur.execute() to convert any ?'s to the backend's paramPlaceholder.

Made the localization installation process a little more sane, as it seems that it is especially prone to errors. Now, instead of abending when the dabo localization file isn't found, it prints an error and continues. The app will continue to work fine, but no translations will be done.

Added a flag to avoid an unnecessary pointer movement caused by setting the DataSource of the grid to a bizobj after the bizobj had already been created and had its record pointer set. Trac issue #1314.

The logic for constructing the filtering WHERE clause in child bizobjs has been corrected to by fully paramterized, instead of 'injecting' the value directly into the SQL.

Fixed a problem when re-opening designs for custom classes. Reported by Martinecz Miklós.

Added the 'GridCellEditEnd' event, which is raised when a grid cell editor is hidden, whether the value has been changed or not.

Fixed a potential issue in the Class Designer Property Sheet in which you could be editing the value of a property of one control, and then navigate to a different control and have your change accidentally be applied to the second control.

Fixed the Crypto property so that setting it to a crypto object will result in the encrypt() and decrypt() methods using that object.

Fixed a bug in the filterByExpression() method that only replace the first occurrence of a field name in the expression. Reported by Ricardo Aráoz.

Changed the Face setter to ignore attempts to set it to 'MS Shell Dlg*' font face names, which can happen when a cdxml file created on Windows is opened on Mac or Linux.

Changed the HomeDirectory setter to write an errorLog entry instead of throwing an exception when an invalid path is passed. Again, this is an issue with moving a cdxml from one system to another.

Changed the behavior when attempting to set the Face to a non-existent fontface. Instead of throwing an error, an entry is written to the Dabo error log describing the issue.

Updated dLed to make it data-aware. It can now be bound to a DataSource and DataField, and have its Color reflect the underlying boolean value.

Revamped the handling of pathing. If you have file path references in your cdxml or cnxml files, this could break your old files. Pathing is now relative to the HomeDirectory of your app, instead of the location of the tool that created the file.

Updated the internal encryption code to support the use of DES3 cryptography if you have the PyCrypto package installed. There is also a write-only property of dApp called 'CryptoKey': when you set that property, if you have PyCrypto installed, it will create a new SimpleCrypt instance that uses DES3 encryption, with that value as the encryption key. And to avoid having to pass a plain-text value to the app creation, you can set this property at any time, passing either a string or any callable. By passing a callable, you can more effectively hide the way your key is stored; the actual key never has to appear in your code at all. If you have cnxml files created with the old code, they may no longer work. Simple re-run the CxnEditor to re-save them with the new encryption.

Added the UIAppClass property to dApp. It can be set to a custom subclass of dabo.ui.uiApp, to enable developers to add ui toolkit-specific behaviors.

Fixed an issue with the cursor's _mementos attribute getting inadvertantly altered by record cloning. Trac #1316

Overrode the removeAll() method of this control to work properly with the underlying wx control. Trac #1308

Added some code to ensure a minimal wx version.

Fixed the problem where the cursor won't save a new unchanged record even if the bizobj is set to SaveNewUnchanged.

Fixed a problem in the seek() method when called from the bizobj when the table has a compound pk. Also improved the algorithm for matching and near-matching. Trac issue #1330.

Major fix to how resizing is handled for panels. Previously, there were cases where panels would get "stuck" at a large size and were not able to be resized smaller. This should fix that problem. Also added the 'Square' property. When set to True, the panel will confine itself to a square shape.

If a dBizobj.filter() call filters out all records, a NoRecordsException was being raised. This is generally not necessary, so this is now caught. Trac #1331

Added code to handle the case in dGrid where a case-insensitive search is being done on a string type column with null values.

Corrects a problem identified by Jacek Kałucki in which some columns that don't have defined data types only get their type corrected the first time a query is run.

Fixed a bug that only happened if you called the layout() method of the StatusBar. The attribute '_platformIsWindows' had been previously defined in dPanel, but dStatusBar no longer inherits from that.

Fixed getCaptureBitmap() to use a WindowDC for panels and dialogs instead of the parent's ClientDC.

Added the StatusBarClass property, which will allow a form to create any status bar subclass that is needed. Defaults to the standard dStatusBar.

Fixed a problem when using direct object references as the DataSource, discovered by Jacek Kałucki.

Added biz.hasPK() method. It answers the question "is this PK value present in the dataset?" It doesn't move the pointer or have any side-effects, and is optimized to return the answer to this question as fast as possible.

Fixed a bug in cdxml rendering: if it contained a boolean value False, it was stored as the word 'False'. But when the attProperties were being read back in, we were doing bool(val) to convert it back, and bool("False") is True.

Added a bit of verbosity to quickStart(). Also changed it so that it requires an app name.

Deprecated ShowColumnLabels; added ShowHeaders. Fixed ShowHeaders and HeaderHeight to not have side-effects on each other.

Fixed some display issues when the grid has at least one column with Expand=True.

Made history searches in the Command Window case-insensitive.

Fixed an issue when opening up the preferences dialog for the first time: since no update frequency preference had been set, an error was raised when the frequency radio list was bound to that pref.

Changed the order in which we import the app subdirectory modules. This is necessary when using a customized uiApp subclass, which would typically be added as a class in the ui module, and then used by overriding the app creation line: app = App(SourceURL=remotehost, UIAppClass=ui.MyCustomUIClass)

Fixed a typo that caused an exception when pressing when a report object was selected. Now it brings up the default property in the property sheet like was intended.

Corrected an error when saving/running a non-sizer-based form.

Enhanced copy/paste in the report designer: if objects from multiple bands are selected when copied, paste them into the same bands instead of the currently selected band. Allows for copy/pasting a header and a detail item, for example.

The recent change to make dImage a data-aware control had an unintended effect in the Class Designer: saving an image resulted in not only saving the path, but also the complete byte stream of that image in the Value property. This fixes that oversight.

Added build scripts for Linux to AppWizard. Now you can 'buildwin', 'buildmac' *and* 'buildlin'.

Added support for the pudb debugger if it is installed.

Improved the flow when controls have their value changed from an update() call. Now the flushValue() is no longer called, which avoids unnecessary data validation calls.

Fixed some issues with establishing HomeDirectory when running from the runtime engine.

Restored the call to flushValue() that was removed in the recent changes to dSpinner. It was breaking anything that used a data-bound spinner, especially the Class Designer.

Corrected the issues raised by Jacek Kałucki regarding the navigation problems of dComboBox under Windows.

Made some changes designed to better support images as data-bound controls. Also allowed for the image's Picture property to accept a wx.Bitmap as the image source, as that's what is returned from the clipboard methods.

Added the convenience methods dabo.ui.copyToClipboard() and dabo.ui.getFromClipboard(). They work with both text and bitmap types.

Added a menu option to the Dabo Editor for toggling whitespace visibility.

Fixed the download_url in setup.py to match the current download location. I guess easy_install has been broken for a while. Thanks Carl Karsten for finding and reporting the problem, along with a solution!

Fixed setup.py to work with pip, per Carl Karsten.

Fixed a problem in the SQL generation of AppWizard-generated apps when using full text searches.

Fixed the issues with custom classes in the Class Designer not being properly inherited when running inside other class designs. The problem came down to pathing, as have most similar issues, so I approached it by adding some smarter pathing code.

Consolidated the logic for app standard directories. Recent changes had not kept the different locations where they were referenced in sync, so now there is an attribute of dApp called '_standardDirs' that is a tuple of the subdirectory names. There is also now a method of dApp called 'getStandardDirectories()' that will return a tuple containing the HomeDirectory and the full paths to all these subdirectories.

Enhanced the Editor app by adding an option for setting the number of characters before AutoAutoComplete fires, and another option for toggling whether line numbers are visible.

Added some events to dReportWriter: ReportCancel, ReportBegin, ReportEnd, and ReportIteration. Your code can bind to them like any other Dabo event.

Fixed an issue when setting the DataSource to a dPref object.

Wrapped the creation of the status bar to hopefully not give artifacts when created too close to form creation/resize time.

Updated dSecurityManager and added dApp.LoginDialogClass.

Fixed color settings in dLed.

Added the EditorStyleNeeded event to support custom styling in dEditor.

Fixed an occasional problem with dObject.__repr__() calls.

Removed code that was slowing searches on virtual fields.

Implemented full parameter passing to backend SQL instead of using string substitution.

Added a lib directory into the standard Dabo structure.

Fixed datanav Form to not keep the edit page active after a delete or cancel if that action resulted in the RowCount going to 0.