Retail Software Framework
Rattail is a retail software framework, released under the GNU Affero General Public License.
This is the core rattail package.
Please see Rattail’s home page for more information.
- Make get_sync_engines() require a config object.
- Add getset_factory() to rattail.db.core.
- Dont auto-import core and changes from rattail.db.
- Handle keyboard interrupt when running dbsync on Linux console.
- Make rattail.db.model the true home for all models.
Removed global Session from rattail.db.
A Session class may now be had via get_session_class().
Removed reliance on edbob.db.engines.
Added initial docs (barely, mostly for testing Buildbot).
Updated tests to work on Python 2.6.
Improved init scripts to create PID file parent directory as needed.
Allow Windows file monitor installation with custom user account.
Improve make-user command somewhat.
Allow username etc. to be overridden; add sanity check if running on platform other than win32.
Fix ChangeRecorder.is_deletable_orphan() for SQLAlchemy 0.7.
Apparently Mapper.relationships is not available until SQLAlchemy 0.8 and later…
Add deleted attribute to repr(Change).
Add “deletable orphan” awareness when recording changes.
Turns out there was a long-standing bug where orphans which were deleted from the host would be marked as “changed” (instead of deleted), causing the store databases to keep the orphan.
- Added mail.send_message() etc.
- Altered dump command to allow easy overriding of data model.
Add all of data folder to manifest.
Replaced insserv calls with update-rc.d in Fabric script.
Fixed bug in price_check_digit(); added tests.
Fixed bug in upce_to_upca(); added tests.
Added get_employee_by_id() convenience function.
Refactored model imports, etc.
This is in preparation for using database models only from rattail (i.e. no edbob). Mostly the model and enum imports were affected.
Added remaining values from edbob.enum to rattail.enum.
Added get_setting() and save_setting() to db.api.
- Overhauled db sync somewhat; made a little more customizable, added tests.
- Fixed db sync to properly handle Family deletions.
- Fixed bug in Product.full_description.
- Added core.Object class.
- Made enum module available from root namespace upon initial import.
- Added util module, for OrderedDict convenience.
- Add Family and Product.family.
- Declare dependencies instead of relying on edbob.
- Added db.auth module.
- Added initdb command.
- Added the adduser command.
- Pretend commands.Subcommand is defined in rattail.
- Fixed Customer._people relationship cascading.
Fixed bugs with CustomerGroupAssignment.
Now orphaned records should no longer be allowed.
Fixed CustomerPerson to require customer and person.
Added --do-not-daemonize flag to dbsync command on Linux.
Overhauled some database stuff; added tests.
Added some CustomerEmailAddress tests, removed some unused tests.
- Fixed bug in csvutil.DictWriter; added tests.
- Added Product.full_description convenience attribute.
- Added --do-not-daemonize arg to filemon command on Linux.
- Added dump command.
- Added unicode-aware CSV reader.
Fixed dbsync bug when deleting a CustomerGroup.
Any customer associations which still existed were causing database integrity errors.
- Added get_product_by_code() API function.
Added proper init.d support to Linux dbsync daemon.
- Added --pidfile argument to dbsync command.
- Added configure_dbsync Fabric command.
Added files.overwriting_move() convenience function.
Added --all argument to purge-batches command.
Added ProductCode, Product.codes to data model.
Fixed db.cache module so as not to require initialization.
Added make-user command for creating Windows system user account.
Added avatar image, who knows when that will be useful.
This was created in the hopes it could be used to programmatically set the Windows user “tile” image; but that proved unfruitful.
Changed Linux file monitor to leverage local code instead of edbob.
Added Batch.rows property, deprecated Batch.iter_rows().
This method now allows explicitly specifying the row count, and accepts a progress factory.
Changed home folder of system user account to /var/lib/rattail.
Slight overhaul of Linux file monitor.
This includes the following:
- “More native” Linux file monitor (i.e. less reliant on edbob; current code is more or less copied from that project).
- Addition of --pidfile command argument on Linux.
Added (Linux) file monitor configuration to Fabric script.
Also improved create_user to allow overwriting some settings.
Fixed file monitor service registration on Windows with --auto-start.
Fixed “process elevation check” on Windows XP.
Overhaul of Windows file monitor.
- “More native” Windows file monitor (i.e. less reliant on edbob; current code is more or less copied from that project).
- Improve base class for services, to handle the case where the Windows event log is full and can’t be written to. (This prevented the file monitor from starting on a machine where the log was full.)
- Added temp_path() function in files module.
- Fixed lingering issues from Vendor.contacts mapping tweak.
- Updated repr() output for model classes.
- Improved find_diffs() function.
- Added db.model module.
- Tweaked some ORM mappings.
[feature] Changed some logging instances from INFO to DEBUG.
I was just getting tired of the noise.
[feature] Added create_user Fabric command.
This creates the rattail user on a Linux environment. Probably needs some improvement but it’s a start.
[bug] Fixed instances_differ() function for SQLAlchemy < 0.8.
Presumably the use of Mapper.column_attrs was not a good idea anyway. I’m not quite sure what functionality it adds over .columns.
- [general] Tweaked Fabric script to remove egg info before building a release.
- [feature] Added mail module; delegates to edbob.
- [feature] Added Session to db module; delegates to edbob.
- [feature] Added db.diffs module.
- Made product cache include all costs if so requested. (Silly oversight.)
- [bug] Made change recorder better able to handle new “sets” of related objects. A situation occurred where multiple related objects were being introduced to the database within the same session. Somehow a dependent object was being processed first, and its UUID value could not be determined since its “upstream” object did yet have one either. This commit improves this situation so that the upstream object will be given an UUID value first, if it doesn’t yet have one. The dependent object will then reuse the upstream object’s UUID as normal.
- [feature] Added console module. For now this only delegates to edbob.console.
- [feature] Added get_product_cache() function to db.cache module. This is probably the first of many such convenience functions.
- [feature] Made Palm conduit unregistration more graceful. Now this will “succeed” even if the conduit isn’t actually registered. fixes #7
- [feature] Improved Palm conduit (un)registration logic. Now this can handle the case where Hotsync Manager is not installed on the local machine. The code was refactored to make things cleaner also. fixes #8
- [feature] Added admin rights check for Palm conduit registration. Now the registration process is checked for an “elevated token” and if none is found, a message is displayed and it exits without attempting the registration. fixes #3
- [feature] Added admin rights check for Windows file monitor registration. Now the registration process is checked for an “elevated token” and if none is found, a message is displayed and it exits without attempting the registration. fixes #5
- [feature] Added make-config command. This may need some work yet, to better handle the namespace package situation.
- [feature] Added Employee.user association proxy attribute.
- [feature] Pretend all models and enumerations from edbob are part of rattail. Some day this will actually be the case. Client code should be able to avoid the edbob namespace now so that porting will be easier.
- [bug] Fixed issue with recording changes when SQLAlchemy >= 0.8.0. Apparently RelationshipProperty.remote_side is now a set and doesn’t support indexing.
- [feature] Added csvutil module. Currently this only adds some better DictWriter support for Python versions older than 2.7.
- [feature] Added Palm OS app interface. This adds the Palm HotSync conduit, which is used to create CSV files when a handheld running the Rattail app is synced with its desktop PC.
- [feature] Added files module. This will eventually supercede edbob.files, but for now this commit adds only three functions. These just so happened to be ones needed to support some code involving inventory count batches.
- [feature] Added wince module. This module is used to interface with the Rattail app for Windows CE handheld devices.
- [feature] Added new batch system, which will eventually replace the old one. Hopefully they can play nicely in parallel, in the meantime.
- [feature] Added purge-batches command. This command will delete forever all batches whose purge date has passed. It is meant to be run on a scheduled basis, e.g. nightly.
- [feature] Added “case” value to UNIT_OF_MEASURE enumeration.
- [feature] Added custom Thread implementation. This overrides the default behavior of threading.Thread by ensuring the system exception hook is invoked in case an error occurs within the thread.
- [feature] Added get_product_by_upc() API function. This is a convenience function which will return a single Product instance, or None. It is the first of hopefully many API functions.
- [feature] Added SIL columns F188, R71 and R72. These have been added to support inventory count batches.
- [bugfix] Fixed Batch.drop_table() to handle case where row table doesn’t exist. While theoretically this method shouldn’t encounter a missing table, in practice it does happen occasionally. Now this situation is handled gracefully instead of raising an exception.
- [bug] Fixed Vendor.contacts relationship (added ‘delete-orphan’).
- [feature] Added Department.subdepartments relationship.
- [feature] Added __eq__() and __ne__() methods to GPC class.
- [general] Moved GPCType SQLAlchemy type class to rattail.db module. This was necessary to make the GPC class more generally available to callers who don’t want or need SQLAlchemy to be installed.
- [general] Moved enumerations from database extension to “core” enum module. This is mostly for convenience to callers.
- [bug] Fixed a few bugs with label batches. These existed mostly because this feature hasn’t been used in production…
- [feature] Added default_format attribute to LabelFormatter class. Now when a label profile is edited, this default format is used if no format is provided by the user.
- [feature] Changed LabelProfile.get_formatter() method so that it assigns the formatter’s format attribute using the value from the profile. The formatter is free to use or ignore this value, at its discretion.
- [feature] Improved the database synchronizer so that it is somewhat tolerant of database server restarts. This likely will need further improvement as more testing is done. The current implementation wraps the entire sync loop in a try/catch block and when a disconnect is detected, will wait 5 seconds before re-entering the loop and trying again.
- [general] Fixed namespace packages, per setuptools documentation.
- [feature] Added connection timeout support to CommandNetworkPrinter.
- [feature] Added LabelProfile.visible field.
- [feature] Added generic CommandNetworkPrinter label printer class. This class sends textual commands directly to a networked printer.
- [feature] Refactored database synchronization logic into a proper class, which can be overridden based on configuration.
- [feature] Tweaked the SIL writer so that it doesn’t quote row values when they’re of data type float.
- [bug] Fixed database sync to properly handle Vendor deletions. Now any associated ProductCost records are also deleted, so no more foreign key violations.
- [bug] Fixed “price toggle” bug in database sync. It was noticed that whenever a product’s regular price did not change, yet the product instance itself did have a change, the regular price association was being removed in one sync, then reestablished in the next sync (then removed, etc.). The sync operation now ensures the relationship is removed only when it really should be, and that it remains intact when that is appropriate.
- [bug] Added special delete logic to the database sync. Currently, only the Department and Subdepartment classes are affected. When deletions of these classes are to be synced between databases, some effort is made to ensure that associations with any dependent objects (e.g. Product) are removed before the primary instance (e.g. Department) is deleted.
- [bug] Added ‘delete, delete-orphan’ to cascade on Product.costs relationship. This was causing an error when syncing databases.
- [bug] Added ‘delete, delete-orphan’ to cascade on Product.prices relationship. This was causing an error when syncing databases.
- [bug] Fixed database sync logic to ensure Product changes are processed before ProductPrice changes. Since the underlying tables are mutually dependent, the dependency_sort() call can’t quite take care of it. Now a lexical sort is applied to the class names before the dependency sort happens. This is somewhat of a hack, merely taking advantage of the fact that “Product” comes before “ProductPrice” when lexically sorted. If other mutually-dependent tables come about in the future, this approach may need to be revised if their class names don’t jive.
- [bug] Fixed database synchonization logic to properly handle merging Product instances between database sessions. Since Product is so interdependent on ProductPrice, a pretty custom merge hack is required.
- [bugfix] Fixed rattail.db.record_changes() so that it also ignores UserRole instance changes if configuration dictates that Role changes are to be ignored.
- [bugfix] Fixed foreign key uuid handling in rattail.db.record_changes(). Some tables are meant to be used solely as providers of “association proxy” fields, the uuid column is not only a primary key, but also a foreign key to the “primary” entity table. In such cases, the uuid value was not present at session flush time, so a new one was being generated. Unfortunately this meant that the Change record would point to a nonexistent entity record, so the sync would not work. Now uuid fields are inspected to determine if a foreign key is present, in which case the relationship is traversed and the true uuid value is used.
- [feature] Added “extra classes” configuration for the load-host-data command. This is necessary when initially populating a “store” (er, “non-host”) database instance if custom schema extensions are in use (and need to be synchronized with the host).
- Add R49 SIL column.
- Add rattail.pricing module.
- Ignore batch data when recording changes.
- Bump edbob dependency.
- Tweak database sync.
- Tweak batch processing.
- Add Vendor.special_discount.
- Bump edbob dependency.
- Added Store and related models.
- Added Customer.email_preference field.
- Added load-host-data command.
- Added database changes/synchronization framework.
- Fixed batch table create/drop.
- Added Product.cost, Product.vendor.
- Added basic one-up label printing support.
- Added initial batch support, with PrintLabels provider.
- Added GPC data type.
- Changed internal name of file monitor Windows service.
- Added progress support for label printing.
- Label profiles moved from config to database model.
- Removed rattail.db.init_database() function.
- Moved some enum values from db extension to core (rattail.enum module).
- Improved SIL support: moved rattail.sil to subpackage, added Writer class etc.
- Fixed file monitor in Linux.
- Added delete-orphan to Vendor.contacts relationship cascade.
- Update file monitor per changes in edbob.
- Move database extension to subdir (rattail.db.extension).
- Make database extension require auth extension.
- Fix rattail.db.init().
- Add lots of classes to database extension model.
- Add rattail.labels module.
- Add rattail.db.cache module.
- Add SIL output functions.
- Remove some batch code (for now?).
- Added Windows file monitor service.
- Refactored to rely on edbob. (Most of Rattail’s “guts” now live there instead.)