skip to navigation
skip to content

rattail 0.3a43

Retail Software Framework

Package Documentation

Latest Version: 0.9.3

Rattail is a retail software framework based on edbob, and released under the GNU Affero General Public License.

This is the core rattail package.

Please see Rattail’s home page for more information.


Install the software with:

$ pip install rattail


Built-in help can be seen with:

$ rattail help


  • 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, 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().

  • Improved sil.Writer.write_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.

    This includes:

    • “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.

    (fixes #9)


  • [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.)
File Type Py Version Uploaded on Size
rattail-0.3a43.tar.gz (md5) Source 2013-07-16 71KB