0.3a43

0.3a42

Any customer associations which still existed were causing database integrity
errors.

0.3a41

Added get_product_by_code() API function.

0.3a40

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.

0.3a39

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.

0.3a38

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.)

0.3a37

Added temp_path() function in files module.

0.3a36

Fixed lingering issues from Vendor.contacts mapping tweak.

0.3a35

Updated repr() output for model classes.

Improved find_diffs() function.

Added db.model module.

Tweaked some ORM mappings.

0.3a34

[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)

0.3a33

[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.

0.3a32

Made product cache include all costs if so requested. (Silly oversight.)

0.3a31

[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.

0.3a30

[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.

0.3a29

[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.

0.3a28

[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.

0.3a27

[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.

0.3a26

[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.

0.3a25

[bug] Fixed Vendor.contacts relationship (added ‘delete-orphan’).

[feature] Added Department.subdepartments relationship.

0.3a24

[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.

0.3a22

0.3a21

[feature] Refactored database synchronization logic into a proper class,
which can be overridden based on configuration.

0.3a20

[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.

0.3a19

[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.

0.3a18

[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.

0.3a17

[bug] Added ‘delete, delete-orphan’ to cascade on Product.costs
relationship. This was causing an error when syncing databases.

0.3a16

[bug] Added ‘delete, delete-orphan’ to cascade on Product.prices
relationship. This was causing an error when syncing databases.

0.3a15

[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.

0.3a13

[bugfix] Fixed rattail.db.record_changes() so that it also ignores
UserRole instance changes if configuration dictates that Role changes
are to be ignored.

0.3a12

[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).

0.3a11

Add R49 SIL column.

Add rattail.pricing module.

0.3a10

Ignore batch data when recording changes.

0.3a9

Bump edbob dependency.

0.3a8

Tweak database sync.

Tweak batch processing.

0.3a7

Add Vendor.special_discount.

0.3a6

Bump edbob dependency.

0.3a5

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.

0.3a4r1

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).