Changelogs » Stalker

PyUp Safety actively tracks 266,622 Python packages for vulnerabilities and notifies you when to upgrade.



  * **Fix:** Fixed ``TaskJugglerScheduler.schedule()`` method to correctly decode
  byte data from ``sys.stderr`` to string for Python 3.x.
  * **Fix:** Fixed a couple of tests for TaskJuggler.
  * **Update:** Updated Classifiers information in ````, removed Python
  versions 2.6, 3.0, 3.1 and 3.2 from supported Python versions.
  * **Fix:** Removed Python 3.3 from TravisCI build which is not supported by
  ``pytest`` apparently.
  * **Update:** Updated TravisCI config and removed Python 2.6 and added Python
  * **Update:** Added a test case for an edge usage of FilenameTemplate.
  * **Update:** Updated .gitignore file to ignore PyTest cache folder.
  * **Update:** Updated the License file to correctly reflect the project license
  of LGPLv3.
  * **Update:** Update copyright information.
  * **New:** Created ``make_html.bat`` for Windows.
  * **New:** Added support for Python wheel.


  * **New:** Switched from ``nose`` + ``unittest`` to ``pytest`` as the main
  testing framework (with ``pytest-xdist`` tests complete 4x faster).
  * **New:** Added ```` shortcut method for convenience which
  does an ``add`` or ``add_all`` (depending to the input) followed by a
  ``commit`` at once.
  * **Update:** Updated the about page for a more appealing introduction to the
  * **New:** Stalker now creates default ``StatusList`` for ``Project`` instances
  on database initialization.
  * **Update:** SQLite3 support is back. In fact it was newer gone. For
  simplicity of first time users the default database is again SQLite3. It was
  dropped for the sake of adding more PostgreSQL oriented features. But then it
  is recognized that the system can handle both. Though a two new Variant had
  to be created for JSON and Datetime columns.
  * **Update:** With the reintroduction of SQLite3, the new JSON type column in
  ``WorkingHours`` class has been upgraded to support SQLite3. So with SQLite3
  the column stores the data as TEXT but seamlessly convert them to JSON when
  ORM loads or commits the data.
  * **New:** Added ``ConfigBase`` as a base class for ``Config`` to let it be
  used in other config classes.
  * **Fix:** Fixed ``testing.create_db()`` and ``testing.drop_db()`` to fallback
  to ``subprocess.check_call`` method for Python 2.6.
  * **Fix:** Fixed ``stalker.models.auth.User._validate_password()`` method to
  work with Python 2.6.
  * **Update:** Updated all of the tests to use ``pytest`` style assertions to
  support Python 2.6 along with 2.7 and 3.0+.
  * **Fix:** Fixed ``stalker.db.check_alembic_version()`` function to invalidate
  the connection, so it is not possible to continue with the current session,
  preventing users to ignore the raised ``ValueError`` when the
  ``alembic_version`` of the database is not matching the ``alembic_version``
  of Stalker's current version.


  * **New:** Added ``goods`` attribute to the ``Client`` class. To allow special
  priced ``Goods`` to be created for individual clients.
  * **Fix:** The ``WorkingHours`` class is now derived from ``Entity`` thus it is
  not stored in a ``PickleType`` column in ``Studio`` anymore. (issue: 44)
  * **Update:** Updated ``appveyor.yml`` to match ``travis.yml``.


  * **Update:** Updated the ``stalker.config.Config.database_engine_settings`` to
  point the test database.
  * **Fix:** Fixed a bug in ``stalker.testing.UnitTestDBBase.setUp()`` where it
  was not considering the existence of the ``STALKER_PATH`` environment
  variable while doing the tests.
  * **Update:** Removed debug message from ``db.setup()`` which was revealing the
  database password.
  * **Update:** Updated the ``UnitTestDBBase``, it now creates its own test
  database, which allows all the tests to run in an individual database. Thus,
  the tests can now be run in ``multiprocess`` mode which speeds things a lot.
  * **Fix:** Removed any module level imports of ``stalker.defaults`` variable,
  which can be changed by a Studio (or by tests) and should always be
  * **Update:** Removed the module level import of the
  ``stalker.db.session.DBSession`` in ``stalker.db``, so it is not possible to
  use ``db.DBSession`` anymore.
  * **Update:** The import statements that imports ``stalker.defaults`` moved to
  local scopes to allow runtime changes to the ``defaults`` to be reflected
  * **Update:** Added Python fall back mode to
  ``stalker.shot.Shot._check_code_availability()`` which runs when there is no
  * **Update:** ``stalker.models.task.TimeLog._validate_task()`` is now getting
  the ``Status`` instances from the ``StatusList`` that is attached to the
  ``Task`` instance instead of doing a database query.
  * **Update:** ``stalker.models.task.TimeLog._validate_resource()`` is now
  falling back to a Python implementation if there is no database connection.
  * **Update:** ``stalker.models.task.Task._total_logged_seconds_getter()`` is
  now hundreds of times faster when there is a lot of ``TimeLog`` instances
  attached to the ``Task``.
  * **Update:** In ``stalker.models.task.Task`` class, methods those were doing a
  database query to get the required ``Status`` instances are now using the
  attached ``StatusList`` instance to get them.
  * **Fix:** A possible ``auto_flush`` is prevented in ``Ticket`` class.
  * **Update:** ``Version.latest_version`` property is now able to fall back to a
  pure Python implementation when there is no database connection.
  * **Update:** The default log level has been increased from ``DEBUG`` to
  * **Update:** In an attempt to speed up tests, a lot of tests that doesn't need
  an active Database has been updated to use the regular ``unittest.TestCase``
  instead of ``stalker.testing.TestBase`` and as a result running all of the
  tests are now 2x faster.
  * **Fix:** ``TimeLogs`` are now correctly reflected in UTC in a tj3 file.
  * **Fix:** Fixed a lot of tests which were raising Warnings and surprisingly
  considered as Errors in TravisCI.
  * **Fix:** ``to_tjp`` methods of SOM classes that is printing a Datetime object
  are now printing the dates in UTC.
  * **Fix:** Fixed ``stalker.models.auth.Permission`` to be hashable for Python
  * **Fix:** Fixed ``stalker.models.auth.AuthenticationLog`` to be sortable for
  Python 3.
  * **Fix:** Fixed ``stalker.models.version.Version.latest_version`` property for
  Python 3.
  * **Fix:** Fixed tests of ``Permission`` class to check for correct exception
  messages in Python 3.
  * **Update:** Replaced the ``assertEquals`` and ``assertNotEquals`` calls which
  are deprecated in Python 3 with ``assertEqual`` and ``assertNotEquals`` calls
  * **Fix:** Fixed tests for ``User`` and ``Version`` classes to not to cause the
  ``id column is None`` warnings of SQLAlchemy to be emitted.


  * **Update:** Support for DB backends other than Postgresql has been dropped.
  This is done to greatly benefit from a code that is highly optimized only
  for one DB backend. With This all of the tests should be inherited from the
  ``stalker.tests.UnitTestDBBase`` class.
  * **New:** All the DateTime fields in Stalker are now TimeZone aware and
  Stalker stores the DateTime values in UTC. Naive datetime values are not
  supported anymore. You should use a library like ``pytz`` to supply timezone
  information as shown below::
  import datetime
  import pytz
  from stalker import db, SimpleEntity
  new_simple_entity = SimpleEntity(
  name='New Simple Entity',
  date_created =
  * **Fix:** The default values for ``date_created`` and ``date_updated`` has now
  been properly set to a partial function that returns the current time.
  * **Fix:** Previously it was possible to enter two TimeLogs for the same
  resource in the same datetime range by committing the data from two different
  sessions simultaneously. Thus the database was not aware that it should
  prevent that. Now with the new PostgreSQL only implementation and the
  ``ExcludeConstraint`` of PostgreSQL an ``IntegrityError`` is raised by the
  database backend when something like that happens.
  * **Update:** All the tests those are checking the system against an Exception
  is being raised or not are now checking also the exception message.
  * **Update:** In the ``TimeLog`` class, the raised ``OverBookedException``
  message has now been made clear by adding the start and end date values of
  the clashing TimeLog instance.
  * **Update:** Removed the unnecessary ``computed_start`` and ``computed_end``
  columns from ``Task`` class, which are already defined in the
  ``DateRangeMixin`` which is a super for the Task class.

  * **Fix:** Fixed a bug in ``ProjectMixin`` where a proper cascade was not
  defined and the ``Delete`` operations to the ``Projects`` table were not
  cascaded to the mixed-in classes properly.

  * **Fix:** Fixed the ``image_format`` attribute implementation in ``Shot``
  class. Now it will not copy the value of ``Project.image_format`` directly on
  ``__init__`` but instead will only store the value if the ``image_format``
  argument in ``__init__`` or ``Shot.image_format`` attribute is set to

  * **Update:** Updated the comment sections of all of the source files to
  correctly show that Stalker is LGPL v3 (not v2.1).

  * **New:** Added ``Shot.fps`` attribute to hold the fps information per shot.
  * **Update:** Added the necessary alembic revision to reflect the changes in
  the ``Version_Inputs`` table.

  * **Fix:** Fixed ``Version_Inputs`` table to correctly take care of
  ``DELETE``s on the ``Versions`` table. So now it is possible to delete a
  ``Version`` instance without first cleaning the ``Link`` instances that is
  related to that ``Version`` instance.
  * **Update:** Changed the ``id`` attribute name from ``info_id`` to ``log_id``
  in ``AuthenticationLog`` class.
  * **Update:** Started moving towards PostgreSQL only implementation. Merged the
  ``DatabaseModelTester`` class and ``DatabaseModelsPostgreSQLTester`` class.
  * **Fix:** Fixed an autoflush issue in

  * **Fix:** Fixed alembic revision


  * **New:** Added ``AuthenticationLog`` class to hold user login/logout info.
  * **New:** Added ``stalker.testing`` module to simplify testing setup.

  * **Fix:** Fixed alembic revision.

  * **New:** ``ProjectUser`` now also holds a new field called ``rate``. The
  default value is equal to the ``ProjectUser.user.rate``. It is a way to hold
  the rate of a user on a specific project.
  * **New:** Added the ``Invoice`` class.
  * **New:** Added the ``Payment`` class.
  * **New:** Added two simple mixins ``AmountMixin`` and ``UnitMixin``.
  * **Update:** ``Good`` class is now mixed in with the new ``UnitMixin`` class.
  * **Update:** ``BudgetEntry`` class is now mixed in with the new
  ``AmountMixin`` and ``UnitMixin`` classes.

  * **New:** ``Group`` permissions can now be set on ``__init__()`` with the
  ``permissions`` argument.

  * **Fix:** As usual after a new release that changes database schema, fixed the
  corresponding Alembic revision (92257ba439e1).


  * **New:** ``Budget`` instances are now statusable.
  * **Update:** Updated documentation to include database migration instructions
  with Alembic.

  * **Fix:** Fixed a typo in the error message in
  ``User._validate_email_format()`` method.
  * **Fix:** Fixed a query-invoked auto-flush problem in
  ``Task.update_parent_statuses()`` method.

  * **Fix:** Fixed alembic revision (f2005d1fbadc), it will now drop any existing
  constraints before re-creating them. And the downgrade function will not
  remove the constraints.


  * **New:** ``db.setup()`` now checks for ``alembic_version`` before setting up
  a connection to the database and raises a ``ValueError`` if the database
  alembic version is not matching the current implementation of Stalker.
  * **Fix:** ``db.init()`` sets the ``created_by`` and ``updated_by``
  attributes to ``admin`` user if there is one while creating entity statuses.
  * **New:** Created ``create_sdist.cmd`` and ``upload_to_pypi.cmd`` for Windows.
  * **New:** ``Project`` to ``Client`` relation is now a many-to-many relation,
  thus it is possible to set multiple Clients for each project with each client
  having their own roles in a specific project.
  * **Update:** ``ScheduleMixin.schedule_timing`` attribute is now Nullable.
  * **Update:** ``ScheduleMixin.schedule_unit`` attribute is now Nullable.


  * **Fix:** Fixed ``Task.path`` to always return a path with forward slashes.
  * **New:** Introducing ``EntityGroups`` that lets one to group a bunch of
  ``SimpleEntity``s together, it can be used in grouping tasks even if they are
  in different places on the project task hierarchy or even in different
  * **Update:** ``Task.percent_complete`` is now correctly calculated for a
  ``Duration`` based task by using the ``Task.start`` and ``Task.end``
  attribute values.
  * **Fix:** Fixed ``stalker.models.task.update_time_log_task_parents_for_end()``
  event to work with SQLAlchemy v1.0.
  * **New:** Added an option called ``__dag_cascade__`` to the ``DAGMixin`` to
  control cascades on mixed in class. The default value is "all, delete".
  Change it to "save-update, merge" if you don't want the children also be
  deleted when the parent is deleted.
  * **Fix:** Fixed a bug in ``Version`` class that occurs when a version instance
  that is a parent of other version instances is deleted, the child versions
  are also deleted (fixed through DAGMixin class).

  * **Fix:** Fixed a bug in ``Review.finalize_review_set()`` for tasks that are
  sent to review and still have some extra time were not clamped to their total
  logged seconds when the review set is all approved.

  * **New:** Removed ``msrp``, ``cost`` and ``unit`` arguments from
  ``BudgetEntry.__init__()`` and added a new ``good`` argument to get all of
  the data from the related ``Good`` instance. But the ``msrp``, ``cost`` and
  ``unit`` attributes of ``BudgetEntry`` class are still there to store the
  values that may not correlate with the related ``Good`` in future.

  * **Fix:** Fixed a bug in ``Review.finalize_review_set()`` which causes Task
  instances to not to get any status update if the revised task is a second
  degree dependee to that particular task.


  * **New:** ``Project`` instances can now have multiple repositories. Thus the
  ``repository`` attribute is renamed to ``repositories``. And the order of the
  items in the ``repositories`` attribute is restored correctly.
  * **New:** ``stalker.db.init()`` now automatically creates environment
  variables for each repository in the database.
  * **New:** Added a new ``after_insert`` which listens ``Repository`` instance
  ``insert``s to automatically add environment variables for the newly inserted
  * **Update:** ``Repository.make_relative()`` now handles paths with environment
  * **Fix:** Fixed ``TaskJugglerScheduler`` to correctly generate task absolute
  paths for PostgreSQL DB.
  * **New:** ``Repository.path`` is now writable and sets the correct path
  (``linux_path``, ``windows_path``, or ``osx_path``) according to the current
  * **New:** Setting either of the ``Repository.path``,
  ``Repository.linux_path``, ``Repository.windows_path``,
  ``Repository.osx_path`` attributes will update the related environment
  variable if the system and attribute are matching to each other, setting the
  ``linux_path`` on Linux or setting the ``windows_path`` on Windows or setting
  the ``osx_path`` on OSX will update the environment variable.
  * **New:** Added ``Task.good`` attribute to easily connect tasks to ``Good``s.
  * **New:** Added new methods to ``Repository`` to help managing paths:
  * ``Repository.find_repo()`` to find a repo from a given path. This is a
  class method so it can be directly used with the Repository class.
  * ``Repository.to_os_independent_path()`` to convert the given path to a OS
  independent path which uses environment variables. Again this is a class
  method too so it can be directly used with the Repository class.
  * ``Repository.env_var`` a new property that returns the related environment
  variable name of a repo instance. This is an instance property::
  with default settings
  repo  = Repository(...)
  repo.env_var   should print something like "REPO131" which will be used
  in paths as "$REPO131"
  * **Fix:** Fixed ``User.company_role`` attribute which is a relationship to
  the ``ClienUser`` to cascade ``all, delete-orphan`` to prevent
  AssertionErrors when a Client instance is removed from the ``User.companies``

  * **Update:** ``Version`` class is now mixed with the ``DAGMixin``, so all the
  parent/child relation is coming from the DAGMixin.
  * **Update:** ``DAGMixin.walk_hierarchy()`` is updated to walk the hierarchy in
  ``Depth First`` mode by default (method=0) instead of ``Breadth First`` mode
  * **Fix:** Fixed ``alembic_revision`` on database initialization.


  * **Fix:** Fixed importing of ``ProjectUser`` directly from ``stalker``
  * **Fix:** Fixed importing of ``ClientUser`` directly from ``stalker``
  * **New:** Added two new columns to the ``BudgetEntry`` class to allow more
  detailed info to be hold.
  * **New:** Added a new Mixin called ``DAGMixin`` to create parent/child
  relation between mixed in class.
  * **Update:** The ``Task`` class is now mixed with the ``DAGMixin``, so all the
  parent/child relation is coming from the DAGMixin.
  * **New:** Added a new class called ``Good`` to hold details about the
  commercial items/services sold in the Studio.
  * **New:** Added a new class called ``PriceList`` to create price lists from


  * **New:** User instances now have a new attribute called ``rate`` to track
  their cost as a resource.
  * **New:** Added two new classes called ``Budget`` and ``BudgetEntry`` to
  record Project budgets in a simple way.
  * **New:** Added a new class called **Role** to manage user roles in different
  Departments, Clients and Projects.
  * **New:** User and Department relation is updated to include the role of the
  user in that department in a more flexible way by using the newly introduced
  Role class and some association proxy tricks.
  * **New:** Also updated the User to Project relation to include the role of the
  user in that Project by using an associated Role class.
  * **Update:** Department.members attribute is renamed to **users** (and removed
  the *synonym* property).
  * **Update:** Removed ``Project.lead`` attribute use ``Role`` instead.
  * **Update:** Removed ``Department.lead`` attribute use ``Role`` instead.
  * **Update:** Because the ``Project.lead`` attribute is removed, it is now
  possible to have tasks with no responsible.
  * **Update:** Client to User relation is updated to use an association proxy
  which makes it possible to set a Role for each User for each Client it is
  assigned to.
  * **Update:** Renamed to User.companies as the relation is now
  able to handle more than one Client instances for the User company.
  * **Update:** Task Status Workflow has been updated to convert the status of a
  DREV task to HREV instead of WIP when the dependent tasks has been set to
  CMPL. Also the timing of the task is expanded by the value of
  ``stalker.defaults.timing_resolution`` if it doesn't have any effort left
  (generally true for CMPL tasks) to allow the resource to review and decide if
  he/she needs more time to do any update on the task and also give a chance of
  setting the Task status to WIP by creating a time log.
  * **New:** It is now possible to schedule only a desired set of projects by
  passing a **projects** argument to the TaskJugglerScheduler.
  * **New:** Task.request_review() and Review.finalize() will not cap the timing
  of the task until it is approved and also Review.finalize() will extend the
  timing of the task if the total timing of the given revisions are not fitting
  in to the left timing.

  * **Update:** TaskJuggler output is now written to debug output once per line.

  * **New:** '' character is now allowed in Entity nice name.

  * **New:** '' character is now allowed in Version take names.

  * **Fix:** Fixed a bug in
  caused by non-ascii task names.
  * **Fix:** Removed the residual ``RootFactory`` class reference from
  * **New:** Added to new functions called ``utc_to_local`` and ``local_to_utc``
  for UTC to Local time and vice versa conversion.

  * **Fix:** Fixed a bug where for a WIP Task with no time logs (apparently
  something went wrong) and no dependencies using
  ``Task.update_status_with_dependent_statuses()`` will convert the status to


  * **New:** It is now possible to track the Edit information per Shot using the
  newly introduced ``source_in``, ``source_out`` and ``record_in`` along with
  existent ``cut_in`` and ``cut_out`` attributes.

  * **Fix:** Fixed MySQL initialization problem in ``stalker.db.init()``.

  * **New:** As usual, after a new release, fixed a bug in
  ``stalker.db.create_entity_statuses()`` caused by the behavioral change of
  the ``map`` built-in function in Python 3.


  * **New:** Added a new class called ``Daily`` which will help managing
  ``Version`` outputs (Link instances including Versions itself) as a group.
  * **New:** Added a new status list for ``Daily`` class which contains two
  statuses called "Open" and "Closed".
  * **Update:** Setting the ``Version.take_name`` to a value other than a string
  will now raise a ``TypeError``.

  * **Fix:** Fixed ``SimpleEntity._validate_name()`` method for unicode strings.

  * **Fix:** Fixed str/unicode errors due to the code written for Python3
  * **Update:** Removed ``Task.is_complete`` attribute. Use the status "CMPL"
  instead of this attribute.

  * **Fix:** Fixed ``stalker.db.create_alembic_table()`` again to prevent extra
  row insertion.

  * **Fix:** Fixed ``stalker.db.create_alembic_table()`` function to handle the
  situation where the table is already created.

  * **Fix:** Fixed ``stalker.db.create_alembic_table()`` function, it is not
  using the ``alembic`` library anymore to create the ``alembic_version``
  table, which was the proper way of doing it but it created a lot of problems
  when Stalker is installed as a package.


  * **Update:** Stalker is now Python3 compatible.
  * **New:** Added a new class called ``Client`` which can be used to track down
  information about the clients of ``Projects``. Also added ``Project.client``
  and ```` attributes which are referencing a Client instance
  allowing to add clients as normal users.
  * **New:** ``db.init()`` now creates ``alembic_version`` table and stamps the
  most recent version number to that table allowing newly initialized databases
  to be considered in head revision.
  * **Fix:** Fixed ``Version._format_take_name()`` method. It is now possible to
  use multiple underscore characters in ``Version.take_name`` attribute.

  * **Update:** Removed ``TimeLog._expand_task_schedule_timing()`` method which
  was automatically adjusting the ``schedule_timing`` and ``schedule_unit`` of
  a Task to total duration of the TimeLogs of that particular task, thus
  increasing the schedule info with the entered time logs.
  But it was setting the ``schedule_timing`` to 0 in some certain cases and it
  was unnecessary because the main purpose of this method was to prevent
  TaskJuggler to raise any errors related to the inconsistencies between the
  schedule values and the duration of TimeLogs and TaskJuggler has never given
  a real error about that situation.

  * **Fix:** Fixed Task parent/child relationship, previously setting the parent
  of a task to None was cascading a delete operation due to the
  "all, delete-orphan" setting of the Task parent/child relationship, this is
  updated to be "all, delete" and it is now safe to set the parent to None
  without causing the task to be deleted.

  * **Fix:** Fixed the following columns column type from String to Text:
  * Permissions.class_name
  * SimpleEntities.description
  * Links.full_path
  * Structures.custom_template
  * FilenameTemplates.path
  * FilenameTemplates.filename
  * Tickets.summary
  * Wiki.title
  * Wiki.content
  and specified a size for the following columns:
  * SimpleEntities.html_class -> String(32)
  * SimpleEntities.html_style -> String(32)
  * FilenameTemplates.target_entity_type -> String(32)
  to be compatible with MySQL.
  * **Update:** It is now possible to create TimeLog instances for a Task with
  PREV status.

  * **Fix:** Fixed ``Task.update_status_with_dependent_statuses()`` method for a
  Task where there is no dependency but the status is DREV. Now calling
  ``Task.update_status_with_dependent_statuses()`` will set the status to RTS
  if there is no ``TimeLog`` for that task and will set the status to WIP if
  the task has time logs.

  * **Update:** ``TaskJugglerScheduler`` is now 466x faster when dumping all the
  data to TJP file. So with this new update it is taking only 1.5 seconds to
  dump ~20k tasks to a valid TJP file where it was around ~10 minutes in
  previous implementation. The speed enhancements is available only to
  PostgreSQL dialect for now.

  * **Fix:** Fixed TimeLog output in one line per task in ``Task.to_tjp()``.
  * **New:** Added ``TaskJugglerScheduler`` now accepts a new argument called
  ``compute_resources`` which when set to True will also consider
  `Task.alternative_resources` attribute and will fill
  ``Task.computed_resources`` attribute for each Task. With
  ``TaskJugglerScheduler`` when the total number of Task is around 15k it will
  take around 7 minutes to generate this data, so by default it is set to


  * **New:** Added ``efficiency`` attribute to ``User`` class. See User
  documentation for more info.

  * **Fix:** Fixed an **autoflush** problem in ``Studio.schedule()`` method.

  * **New:** Added ``Repository.make_relative()`` method, which makes the given
  path to relative to the repository root. It considers that the path is
  already in the repository. So for now, be careful about not to pass a path
  outside of the repository.

  * **Update:** ``TaskJugglerScheduler.schedule()`` method now uses the
  ``Studio.start`` and ``Studio.end`` values for the scheduling range instead
  of the hardcoded dates.

  * **Update:** ``Task.create_time_log()`` method now returns the created
  ``TimeLog`` instance.

  * **Fix:** Fixed an ``autoflush`` issue in
  ``Task.update_status_with_children_statuses()`` method.

  * **Update:** ``Studio.is_scheduling`` and ``Studio.is_scheduling_by``
  attributes will not be updated or checked at the beginning of the
  ``Studio.schedule()`` method. It is the duty of the user to check those
  attributes before calling ``Studio.schedule()``. This is done in this way
  because without being able to do a db commit inside ``Studio.schedule()``
  method (which is the case with transaction managers which may be used in web
  applications like **Stalker Pyramid**) it is not possible to persist and thus
  use those variables. So, to be able to use those attributes meaningfully the
  user should set them. Those variables will be set to False and None
  accordingly by the ``Studio.schedule()`` method after the scheduling is done.

  * **Fix:** Fixed a deadlock in ``TaskJugglerScheduler.schedule()`` method
  related with the ``Popen.stderr.readlines()`` blocking the TaskJuggler
  process without being able to read the output buffer.

  * **Update:** ``TaskJugglerScheduler.schedule()`` is now using bulk inserts and
  updates which is way faster than doing it with pure Python. Use
  ``parsing_method`` (0: SQL, 1: Python) to choose between SQL or Pure Python
  implementation. Also updated ``Studio.schedule()`` to take in a
  ``parsing_method`` parameter.

  * **Update:** The ``cut_in``, ``cut_out`` and ``cut_duration`` attribute
  behaviour and the attribute order is updated in ``Shot`` class. So, if three
  of the values are given, then the ``cut_duration`` attribute value will be
  calculated from ``cut_in`` and ``cut_out`` attribute values. In any case
  ``cut_out`` precedes ``cut_duration``, and if none of them given ``cut_in``
  and ``cut_duration`` values will default to 1 and ``cut_out`` will be
  calculated by using ``cut_in`` and ``cut_duration``.

  * **New:** Entity to Note relation is now Many-to-Many. So one Note can now be
  assigned more than one Entity.
  * **New:** Added alembic revision for ``Entity_Notes`` table creation and data
  migration from ``Notes`` table to ``Entity_Notes`` table. So all notes are
  * **Fix:** Fixed ``Shot.cut_duration`` attribute initialization on ``Shot``
  instances restored from database.
  * **Fix:** Fixed ``Studios.is_scheduling_by`` relationship configuration, which
  was wrongly referencing the ``Studios.last_scheduled_by_id`` column instead
  of ``Studios.is_scheduled_by_id`` column.

  * **New:** Added a ``Task.review_set(review_number)`` method to get the desired
  set of reviews. It will return the latest set of reviews if ``review_number``
  is skipped or it is None.
  * **Update:** Removed ``Task.approve()`` it was making things complex than it
  should be.

  * **Fix:** Added ``Page`` to ``class_names`` in ``db.init()``.
  * **Fix:** Fixed ``TimeLog`` tjp representation to use bot the ``start`` and
  ``end`` date values instead of the ``start`` and ``duration``. This is much
  better because it is independent from the timing resolution settings.

  * **Fix:** Fixed ```` method, and prevented it
  to call ``DBSession.commit()`` which causes errors if there is a transaction
  * **Fix:** Fixed ``stalker.models._parse_csv_file()`` method for empty
  computed resources list.

  * **New:** ``stalker.models.task.TimeLog`` instances are now checking if the
  dependency relation between the task that receives the time log and the tasks
  that the task depends to will be violated in terms of the start and end dates
  and raises a ``DependencyViolationError`` if it is the case.


  * **New:** Added ```` class, for holding a per Project

  * **Fix:** ``Review.task`` attribute now accepts None but this is mainly done
  to allow its relation to the ``Task`` instance can be broken when it needs to
  be deleted without issuing a database commit.

  * **Update:** The following column names are updated:
  * ``Tasks._review_number`` to ``Tasks.review_number``
  * ``Tasks._schedule_seconds`` to ``Tasks.schedule_seconds``
  * ``Tasks._total_logged_seconds`` to ``Tasks.total_logged_seconds``
  * ``Reviews._review_number`` to ``Reviews.review_number``
  * ``Shots._cut_in`` to ``Shots.cut_in``
  * ``Shots._cut_out`` to ``Shots.cut_out``
  Also updated alembic migration to create columns with those names.
  * **Update:** Updated Alembic revision ``433d9caaafab`` (the one related with
  stalker 2.5 update) to also include following updates:
  * Create StatusLists for Tasks, Asset, Shot and Sequences and add all the
  Statuses in the Task Status Workflow.
  * Remove ``NEW`` from all of the status lists of Task, Asset, Shot and
  * Update all the ``PREV`` tasks to ``WIP`` to let them use the new Review
  * Update the ``Tasks.review_number`` to 0 for all tasks.
  * Create StatusLists and Statuses (``NEW``, ``RREV``, ``APP``) for Reviews.
  * Remove any other status then defined in the Task Status Workflow from Task,
  Asset, Shot and Sequence status list.

  * **Fix:** Fixed a bug in ``Task`` class where trying to remove the
  dependencies will raise an ``AttributeError`` caused by the
  ``Task._previously_removed_dependent_tasks`` attribute.

  * **New:** Task instances now have two new properties called ``path`` and
  ``absolute_path``. As in Version instances, these are the rendered version
  of the related FilenameTemplate object in the related Project. The ``path``
  attribute is Repository root relative and ``absolute_path`` is the absolute
  path including the OS dependent Repository path.
  * **Update:** Updated alembic revision with revision number "433d9caaafab" to
  also create Statuses introduced with Stalker v0.2.5.

  * **Update:** ``Version.__repr__`` results with a more readable string.
  * **New:** Added a generalized generator called
  ``stalker.models.walk_hierarchy()`` that walks and yields the entities over
  the given attribute in DFS or BFS fashion.
  * **New:** Added ``Task.walk_hierarchy()`` which iterates over the hierarchy of
  the task. It walks in a breadth first fashion. Use ``method=0`` to walk in
  depth first.
  * **New:** Added ``Task.walk_dependencies()`` which iterates over the
  dependencies of the task. It walks in a breadth first fashion. Use
  ``method=0`` to walk in depth first.
  * **New:** Added ``Version.walk_hierarchy()`` which iterates over the hierarchy
  of the version. It walks in a depth first fashion. Use ``method=1`` to walk
  in breadth first.
  * **New:** Added ``Version.walk_inputs()`` which iterates over the inputs of
  the version. It walks in a depth first fashion. Use ``method=1`` to walk in
  breath first.
  * **Update:** ``stalker.models.check_circular_dependency()`` function is now
  using ``stalker.models.walk_hierarchy()`` instead of recursion over itself,
  which makes it more robust in deep hierarchies.
  * **Fix:** ``db.init()`` now updates the statuses of already created status
  lists for ``Task``, ``Asset``, ``Shot`` and ``Sequence`` classes.


  * **Update:** ``Revision`` class is renamed to ``Review`` and introduced a
  couple of new attributes.
  * **New:** Added a new workflow called "Task Review Workflow". Please see the
  documentation about the new workflow.
  * **Update:** ``Task.responsible`` attribute is now a list which allows
  multiple responsible to be set for a ``Task``.
  * **New:** Because of the new "Task Review Workflow" task statuses which are
  normally created in Stalker Pyramid are now automatically created in Stalker
  database initialization. The new statuses are
  **Waiting For Dependency (WFD)**, **Ready To Start (RTS)**,
  **Work In Progress (WIP)**, **Pending Review (PREV)**,
  **Has Revision (HREV)**, **On Hold (OH)**, **Stopped (STOP)** and
  **Completed (CMPL)** are all used in ``Task``, ``Asset``, ``Shot`` and
  ``Sequence`` status lists by default.
  * **New:** Because of the new "Task Review Workflow" also a status list for
  ``Review`` class is created by default. It contains the statuses of
  **New (NEW)**, **Requested Revision (RREV)** and **Approved (APP)**.
  * **Fix:** ``Users.login`` column is now unique.
  * **Update:** Ticket workflow in config is now using the proper status names
  instead of the lower case names of the statuses.
  * **New:** Added a new exception called **StatusError** which states the entity
  status is not suitable for the action it is applied to.
  * **New:** ``Studio`` instance now stores the scheduling state to the database
  to prevent two scheduling process to override each other. It also stores the
  last schedule message and the last schedule date and the id of the user who
  has done the scheduling.
  * **New:** The **Task Dependency** relation is now using an
  **Association Object** instead of just a **Secondary Table**. The
  ``Task.depends`` and ``Task.dependent_of`` attributes are now
  Also added extra parameters like ``dependency_target``, ``gap_timing``,
  ``gap_unit`` and ``gap_model`` to the dependency relation. So all of the
  dependency relations are now able to hold those extra information.
  Updated the ``task_tjp_template`` to reflect the details of the dependencies
  that a task has.
  * **New:** ``ScheduleMixin`` class now has some default class attributes that
  will allow customizations in inherited classes. This is mainly done for
  ``TaskDependency`` class and for ``the gap_timing``, ``gap_unit``,
  ``gap_model`` attributes which are in fact synonyms of ``schedule_timing``,
  ``schedule_unit`` and ``schedule_model`` attributes coming from the
  ``ScheduleMixin`` class. So by using the ``__default_schedule_attr_name__``
  Stalker is able to display error messages complaining about ``gap_timing``
  attribute instead of ``schedule_timing`` etc.
  * **New:** Updating a task by calling ``Task.request_revision()`` will now set
  the ``TaskDependency.dependency_target`` to **'onstart'** for tasks those are
  depending to the revised task and updated to have a status of **DREV**,
  **OH** or **STOP**. Thus, TaskJuggler will be able to continue scheduling
  these tasks even if the tasks are now working together.
  * **Update:** Updated the TaskJuggler templates to make the tjp output a little
  bit more readable.
  * **New:** ``ScheduleMixin`` now creates more localized (to the mixed in class)
  column and enum type names in the mixed in classes.
  For example, it creates the ``TaskScheduleModel`` enum type for ``Task``
  class and for ``TaskDependency`` it creates ``TaskDependencyGapModel`` with
  the same setup following the ``{{class_name}}{{attr_name}}Model`` template.
  Also it creates ``schedule_model`` column for ``Task``, and ``gap_model`` for
  ``TaskDependency`` class.
  * **Update:** Renamed the ``TaskScheduleUnit`` enum type name to ``TimeUnit``
  in ``ScheduleMixin``.


  * **New:** Added new class called ``Revision`` to hold info about Task
  * **Update:** Renamed ``ScheduleMixin`` to ``DateRangeMixin``.
  * **New:** Added a new mixin called ``ScheduleMixin`` (replacing the old one)
  which adds attributes like ``schedule_timing``, ``schedule_unit``,
  ``schedule_model`` and ``schedule_constraint``.
  * **New:** Added ```` and ``Task.open_tickets`` properties.
  * **Update:** Removed unnecessary arguments (``project_lead``, ``tasks``,
  ``watching``, ``last_login``) from User class.
  * **Update:** The ``timing_resolution`` attribute is moved from the
  ``DateRangeMixin`` to ``Studio`` class. So instances of classes like
  ``Project`` or ``Task`` will not have their own timing resolution anymore.
  * **New:** The ``Studio`` instance now overrides the values on
  ``stalker.defaults`` on creation and on load, and also the ``db.setup()``
  function lets the first ``Studio`` instance that it finds to update the
  defaults. So it is now possible to use ``stalker.defaults`` all the time
  without worrying about the Studio settings.
  * **Update:** The ``Studio.yearly_working_days`` value is now always an
  * **New:** Added a new method ``ScheduleMixin.least_meaningful_time_unit()`` to
  calculate the most appropriate timing unit and the value of the given seconds
  which represents an interval of time.
  So it will convert 3600 seconds to 1 hours, and 8424000 seconds to 1 years if
  it represents working time (``as_working_time=True``) or 2340 hours if it is
  representing the calendar time.
  * **New:** Added a new method to ``ScheduleMixin`` called ``to_seconds()``. The
  ``to_seconds()`` method converts the given schedule info values
  (``schedule_timing``, ``schedule_unit``, ``schedule_model``) to seconds
  considering if the given ``schedule_model`` is work time based ('effort' or
  'length') or calendar time based ('duration').
  * **New:** Added a new method to ``ScheduleMixin`` called ``schedule_seconds``
  which you may recognise from ``Task`` class. What it does is pretty much the
  same as in the ``Task`` class, it converts the given schedule info values to
  * **Update:** In ``DateRangeMixin``, when the ``start``, ``end`` or
  ``duration`` arguments given so that the duration is smaller then the
  ``defaults.timing_resolution`` the ``defaults.timing_resolution`` will be
  used as the ``duration`` and the ``end`` will be recalculated by anchoring
  the ``start`` value.
  * **New:** Adding a ``TimeLog`` to a ``Task`` and extending its schedule info
  values now will always use the least meaningful timing unit. So expanding a
  task from 16 hours to 18 hours will result a task with 2 days of schedule
  (considering the ``daily_working_hours = 9``).
  * **Update:** Moved the ``daily_working_hours`` attribute from ``Studio`` class
  to ``WorkingHours`` class as it was much related to this one then ``Studio``
  class. Left a property with the same name in the ``Studio`` class, so it will
  still function as it was before but there will be no column in the database
  for that attribute anymore.

  * **Fix:** Fixed a bug in ``stalker.models.auth.LocalSession`` where stalker
  was complaining about "copy_reg" module, it seems that it is related to
  `this bug`_.
  .. _this bug:

  * **Update:** Fixed a little bug in Link.extension property setter.
  * **New:** Moved the stalker.models.env.EnvironmentBase class to
  "Anima Tools" python module.
  * **Fix:** Fixed a bug in stalker.models.task.Task._responsible_getter() where
  it was always returning the greatest parents responsible as the responsible
  for the child task when the responsible is set to None for the child.
  * **New:** Added ``stalker.models.version.Version.naming_parents`` which
  returns a list of parents starting from the closest parent Asset, Shot or
  * **New:** ``stalker.models.version.Version.nice_name`` now generates a name
  starting from the closest Asset, Shot or Sequence parent.

  * **New:** ``Ticket`` action methods (``resolve``, ``accept``, ``reassign``,
  ``reopen``) now return the created ``TicketLog`` instance.

  * **Update:** Added tests for negative or zero fps value in Project class.
  * **Fix:** Minor fix to ``schedule_timing`` argument in Task class, where IDEs
  where assuming that the value passed to the ``schedule_timing`` should be
  integer where as it accepts floats also.
  * **Update:** Removed ``bg_color`` and ``fg_color`` attributes (and columns)
  from Status class. Use SimpleEntity.html_class and SimpleEntity.html_style
  attributes instead.
  * **New:** Added ``Project.open_tickets`` property.

  * **Fix:** Fixed an inconvenience in SimpleEntity.__init__() when a
  date_created argument with a value is later than is
  supplied and the date_updated argument is skipped or given as None, then the
  date_updated attribute value was generated from this
  was causing an unnecessary ValueError. This is fixed by directly copying the
  date_created value to date_updated value when it is skipped or None.


  * **New:** SimpleEntity now have two new attributes called ``html_style`` and
  ``html_class`` which can be used in storing cosmetic html values.

  * **Update:** Note.content attribute is now a synonym of the Note.description

  * **Update:** Studio.schedule() now returns information about how much did it
  take to schedule the tasks.
  * **Update:** Studio.to_tjp() now returns information about how much did it
  take to complete the conversion.

  * **Fix:** Task.percent_complete() now calculates the percent complete


  * **Update:** Added cascade attributes to all necessary relations for all the
  * **Update:** The Version class is not mixed with the StatusMixin anymore. So
  the versions are not going to be statusable anymore. Also created alembic
  revision (a6598cde6b) for that update.

  * **Update:** TaskJugglerScheduler and the Studio classes are now returning the
  stderr message out of their ``schedule()`` methods.

  * **Fix:** Disabled some deep debug messages on
  * **Fix:** Fixed a flush issue related to the Task.parent attribute which is
  lazily loaded in Task._schedule_seconds_setter().


  * **Fix:** As usual distutil thinks ``0.2.0`` is a lower version number than
  ``0.2.0.rc5`` (I should have read the documentation again and used
  ``0.2.0.c5`` instead of ``0.2.0.rc5``) so this is a dummy update to just to
  fix the version number.


  * **Update:** Vacation tjp template now includes the time values of the start
  and end dates of the Vacation instance.


  * **Update:** For a container task, ``Task.total_logged_seconds`` and
  ``Task.schedule_seconds`` attributes are now using the info of the child
  tasks. Also these attributes are cached to database, so instead of querying
  the child tasks all the time, the calculated data is cached and whenever a
  TimeLog is created or updated for a child task (which changes the
  ``total_logged_seconds`` for the child task) or the ``schedule_timing`` or
  ``schedule_unit`` attributes are updated, the cached values are updated on
  the parents. Allowing Stalker to display percent_complete info of a container
  task without loading any of its children.
  * **New:** Added ``Task.percent_complete`` attribute, which calculates the
  percent of completeness of the task based on the
  ``Task.total_logged_seconds`` and ``Task.schedule_seconds`` attributes.
  * **Fix:** Added ``TimeLog.__eq__()`` operator to more robustly check if the
  time logs are overlapping.
  * **New:** Added ``Project.percent_complete``,
  ``Percent.total_logged_seconds`` and ``Project.schedule_seconds`` attributes.
  * **Update:** ``ScheduleMixin._validate_dates()`` does not set the date values
  anymore, it just return the calculated and validated ``start``, ``end`` and
  ``duration`` values.
  * **Update:** ``Vacation`` now can be created without a ``User`` instance,
  effectively making the ``Vacation`` a ``Studio`` wide vacation, which applies
  to all users.
  * **Update:** ``Vacation.__strictly_typed__`` is updated to ``False``, so there
  is no need to create a ``Type`` instance to be able to create a ``Vacation``.
  * **New:** ```` property now returns the ``Vacation`` instances
  which has no *user*.
  * **Update:** ``Task.start`` and ``Task.end`` values are no more read from
  children Tasks for a container task over and over again but calculated
  whenever the start and end values of a child task are changed or a new child
  is appended or removed.
  * **Update:** ``SimpleEntity.description`` validation routine doesn't convert
  the input to string anymore, but checks the given description value against
  being a string or unicode instance.
  * **New:** Added ``Ticket.summary`` field.
  * **Fix:** Fixed ``Link.extension``, it is now accepting unicode.


  * **New:** Added a new attribute to ``Version`` class called
  ``latest_version`` which holds the latest version in the version queue.
  * **New:** To optimize the database connection times, ``stalker.db.setup()``
  will not try to initialize the database every time it is called anymore. This
  leads a ~4x speed up in database connection setup. To initialize a newly
  created database please use::
  for a newly created database
  from stalker import db
  db.setup()  connects to database
  db.init()   fills some default values to be used with Stalker
  for any subsequent access just use (don't need to call db.init())
  * **Update:** Removed all ``__init_on_load()`` methods from all of the classes.
  It was causing SQLAlchemy to eagerly load relations, thus slowing down
  queries in certain cases (especially in ``Task.parent`` -> ``Task.children``
  * **Fix:** Fixed ``Vacation`` class tj3 format.
  * **Fix:** ```` attribute was not properly working when the
  ``Studio`` instance has been restored from database.


  * **New:** Added a new attribute to ``Task`` class called ``responsible``.
  * **Update:** Removed ``Sequence.lead_id`` use ``Task.reponsible`` instead.
  * **Update:** Updated documentation to include documentation about
  Configuring Stalker with ````.
  * **Update:** The ``duration`` argument in ``Task`` class is removed. It is
  somehow against the idea of having ``schedule_model`` and ``schedule_timing``
  arguments (``schedule_model='duration'`` is kind of the same).
  * **Update:** Updated ``Task`` class documentation.


  * **New:** Added ``Version.created_with`` attribute to track the environment or
  host program name that a particular ``Version`` instance is created with.


  * **Update:** Moved the Pyramid part of the system to another package called
  * **Fix:** Fixed ```` where importing ``stalker`` to get the
  ``__version__`` variable causing problems.


  * **New:** Added ``Version.latest_published_version`` and
  * **Fix:** Fixed ``Version.__eq__()``, now Stalker correctly distinguishes
  different Version instances.
  * **New:** Added ``Repository.to_linux_path()``,
  ``Repository.to_windows_path()``, ``Repository.to_osx_path()`` and
  ``Repository.to_native_path()`` to the ``Repository`` class.
  * **New:** Added ``Repository.is_in_repo(path)`` which checks if the given
  path is in this repo.


  * **Update:** Renamed **Version.version_of** attribute to **Version.task**.
  * **Fix:** Fixed **Version.version_number** where it was not possible to have
  a version number bigger than 2.
  * **Fix:** In **db.setup()** Ticket statuses are only created if there aren't
  * **Fix:** Added **Vacation** class to the registered class list in


  * **Update:** **Task.schedule_constraint** is now reflected to the tjp file
  * **Fix:** **check_circular_dependency()** now checks if the **entity** and
  the **other_entity** are the same.
  * **Fix:** **Task.to_tjp()** now correctly add the dependent tasks of a
  container task.
  * **Fix:** **Task.__eq__()** now correctly considers the parent, depends,
  resources, start and end dates.
  * **Update:** **Task.priority** is now reflected in tjp file if it is
  different than the default value (500).
  * **New::** Added a new class called **Vacation** to hold user vacations.
  * **Update:** Removed dependencies to ```` and
  ```` in couple of packages.
  * **Update:** Changed the way the ``stalker.defaults`` is created.
  * **Fix:** **EnvironmentBase.get_version_from_full_path()**,
  **EnvironmentBase.trim_repo_path()**, **EnvironmentBase.find_repo** methods
  are now working properly.
  * **Update:** Added **Version.absolute_full_path** property which renders the
  absolute full path which also includes the repository path.
  * **Update:** Added **Version.absolute_path** property which renders the
  absolute path which also includes the repository path.


  * **Fix:** Fixed **LocalSession._write_data()**, previously it was not
  creating the local session folder.
  * **New:** Added a new method called **LocalSession.delete()** to remove the
  local session file.
  * **Update:** **Link.full_path** can now be set to an empty string. This is
  updated in this way for **Version** class.
  * **Update:** Updated the formatting of **SimpleEntity.nice_name**, it is now
  possible to have uppercase letters and camel case format will be preserved.
  * **Update**: **Version.take_name** formatting is enhanced.
  * **New**: **Task** class is now mixed in with **ReferenceMixin** making it
  unnecessary to have **Asset**, **Shot** and **Sequence** classes all mixed
  in individually. Thus removed the **ReferenceMixin** from **Asset**,
  **Shot** and **Sequence** classes.
  * **Update**: Added **Task.schedule_model** validation and its tests.
  * **New**: Added **ScheduleMixin.total_seconds** and


  * **New:** **Version** class now has two new attributes called ``parent`` and
  ``children`` which will be used in tracking of the history of Version
  instances and track which Versions are derived from which Version.
  * **New:** **Versions** instances are now derived from **Link** class and not
  * **Update:** Added new revisions to **alembic** to reflect the change in
  **Versions** table.
  * **Update:** **Links.path** is renamed to **Links.full_path** and added
  three new attributes called **path**, **filename** and **extension**.
  * **Update:** Added new revisions to alembic to reflect the change in
  **Links** table.
  * **New:** Added a new class called **LocalSession** to store session data in
  users local filesystem. It is going to be replaced with some other system
  like **Beaker**.
  * **Fix:** Database part of Stalker can now be imported without depending to
  * **Fix:** Fixed documentation errors that **Sphinx** complained about.


  * No changes in SOM.


  * **Update:** FilenameTemplate's are not ``strictly typed`` anymore.
  * **Update:** Removed the FilenameTemplate type initialization, FilenameTemplates
  do not depend on Types anymore.
  * **Update:** Added back the ``plural_class_name`` (previously ``plural_name``)
  property to the ORMClass class, so all the classes in SOM now have this new
  * **Update:** Added ``accepts_references`` attribute to the EntityType class.
  * **New:** The Link class has a new attribute called ``original_filename`` to
  store the original file names of link files.
  * **New:** Added **alembic** to the project requirements.
  * **New:** Added alembic migrations which adds the ``accepts_references`` column
  to ``EntityTypes`` table and ``original_name`` to the ``Links`` table.


  * Stalker is now compatible with Python 2.6.
  * Task:
  * **Update:** Tasks now have a new attribute called ``watchers`` which holds a
  list of User instances watching the particular Task.
  * **Update:** Users now have a new attribute called ``watching`` which is a
  list of Task instances that this user is watching.
  * TimeLog:
  * **Update:** TimeLog instances will expand Task.schedule_timing value
  automatically if the total amount of logged time is more than the
  schedule_timing value.
  * **Update:** TimeLogs are now considered while scheduling the task.
  * **Fix:** TimeLogs raises OverBookedError when appending the same TimeLog
  instance to the same resource.
  * Auth:
  * **Fix:** The default ACLs for determining the permissions are now working


  * WorkingHours.is_working_hour() is working now.
  * WorkingHours class is moved from stalker.models.project to module.
  * ``daily_working_hours`` attribute is moved from
  stalker.models.project.Project to class.
  * Repository path variables now ends with a forward slash even if it is not
  * Updated Project classes validation messages to correlate with Stalker
  * Implementation of the Studio class is finished. The scheduling works like a
  * It is now possible to use any characters in and the derived
  * Booking class is renamed to TimeLog.


  * Added new attribute to WorkingHours class called ``weekly_working_hours``,
  which calculates the weekly working hours based on the working hours defined
  in the instance.
  * Task class now has a new attribute called ``schedule_timing`` which is
  replacing the ``effort``, ``length`` and ``duration`` attributes. Together
  with the ``schedule_model`` attribute it will be used in scheduling the Task.
  * Updated the config system to the one used in oyProjectManager (based on
  Sphinx config system). Now to reach the defaults::
  instead of doing the following
  from stalker.conf import defaults  not valid anymore
  use this
  from stalker import defaults
  If the above idiom is used, the old ``defaults`` module behaviour is
  retained, so no code change is required other than the new lower case config
  variable names.


  * A new property called ``to_tjp`` added to the SimpleEntity class which needs
  to be implemented in the child and is going to be used in TaskJuggler
  * A new attribute called ``is_scheduled`` added to Task class and it is going
  to be used in Gantt charts. Where it will lock the class and will not try
  to snap it to anywhere if it is scheduled.
  * Changed the ``resolution`` attribute name to ``timing_resolution`` to comply
  with TaskJuggler.
  * ScheduleMixin:
  * Updated ScheduleMixin class documentation.
  * There are two new read-only attributes called ``computed_start`` and
  ``computed_end``. These attributes will be used in storing of the values
  calculated by TaskJuggler, and will be used in Gantt Charts if available.
  * Added ``computed_duration``.
  * Task:
  * Arranged the TaskJuggler workflow.
  * The task will use the effort > length > duration attributes in `to_tjp`
  * Changed the license of Stalker from BSD-2 to LGPL 2.1. Any version previous
  to 0.2.0.a9 will be still BSD-2 and any version from and including 0.2.0.a9
  will be distributed under LGPL 2.1 license.
  * Added new types of classes called Schedulers which are going to be used in
  scheduling the tasks.
  * Added TaskJugglerScheduler, it uses the given project and schedules its


  * TagSelect now can be filled by setting its ``value`` attribute (Ex:
  TagSelect.set('value', data))
  * Added a new method called ``is_root`` to Task class. It is true for tasks
  where there are no parents.
  * Added a new attribute called ``users`` to the Department class which is a
  synonym for the ``members`` attribute.
  * Task:
  * Task class is now preventing one of the dependents to be set as the parent
  of a task.
  * Task class is now preventing one of the parents to be set as the one of the
  dependents of a task.
  * Fixed ``autoflush`` bugs in Task class.
  * Fixed `admin` users department initialization.
  * Added ``thumbnail`` attribute to the SimpleEntity class which is a reference
  to a Link instance, showing the path of the thumbnail.
  * Fixed Circular Dependency bug in Task class, where a parent of a newly
  created task is depending to another task which is set as the dependee for
  this newly created task (T1 -> T3 -> T2 -> T1 (parent relation) -> T3 -> T2


  * Changed these default setting value names to corresponding new names:
  * stalker.conf.defaults:
  * Added default settings for project working hours (``WORKING_HOURS``,
  * Added a new variable for setting the task time resolution called
  * stalker.models.project.Project:
  * Removed Project.project_tasks attribute, use Project.tasks directly to get
  all the Tasks in that project. For root task you can do a quick query::
  This will also return the Assets, Sequences and Shots in that project,
  which are also Tasks.
  * Users are now assigned to Projects by appending them to the Project.users
  list. This is done in this way to allow a reduced list of resources to be
  shown in the Task creation dialogs.
  * Added a new helper class for Project working hour management, called
  * Added a new attribute to Project class called ``working_hours`` which holds
  stalker.models.project.WorkingHours instances to manage the Project working
  hours. It will directly be passed to TaskJuggler.
  * stalker.models.task.Task:
  * Removed the Task.task_of attribute, use Task.parent to get the owner of
  this Task.
  * Task now has two new attributes called Task.parent and Task.children which
  allow more complex Task-to-Task relation.
  * Secondary table name for holding Task to Task dependency relation is
  renamed from ``Task_Tasks`` to ``Task_Dependencies``.
  * check_circular_dependency function is now accepting a third argument which
  is the name of the attribute to be investigated for circular relationship.
  It is done in that way to be able to use the same function in searching for
  circular relations both in parent/child and depender/dependee relations.
  * ScheduleMixin:
  * Added a new attribute to ScheduleMixin for time resolution adjustment.
  Default value is 1 hour and can be set with
  stalker.conf.defaults.TIME_RESOLUTION. Any finer time than the resolution
  is rounded to the closest multiply of the resolution. It is possible to set
  it from microseconds to years. Although 1 hour is a very reasonable
  resolution which is also the default resolution for TaskJuggler.
  * ScheduleMixin now uses datetime.datetime for the start and end attributes.
  * Renamed the ``start_date`` attribute to ``start``.
  * Renamed the ``end_date`` attribute to ``end``
  * Removed the TaskableEntity.
  * Asset, Sequence and Shot classes are now derived from Task class allowing
  more complex Task relation combined with the new parent/child relation of
  Tasks. Use Asset.children or Asset.tasks to reach the child tasks of that
  asset (same with Sequence and Shot classes).
  * stalker.models.shot.Shot:
  * Removed the sequence and introduced sequences attribute in Shot class. Now
  one shot can be in more than one Sequence. Allowing more complex
  Shot/Sequence relations..
  * Shots can now be created without a Sequence instance. The sequence
  attribute is just used to group the Shots.
  * Shots now have a new attribute called ``scenes``, holding Scene instances.
  It is created to group same shots occurring in the same scenes.
  * In tests all the Warnings are now properly handled as Warnings.
  * stalker.models.ticket.Ticket:
  * Ticket instances are now tied to Projects and it is now possible to create
  Tickets without supplying a Version. They are free now.
  * It is now possible to link any SimpleEntity to a Ticket.
  * The Ticket Workflow is now fully customizable. Use
  stalker.conf.defaults.TICKET_WORKFLOW dictionary to define the workflow and
  stalker.conf.defaults.TICKET_STATUS_ORDER for the order of the ticket
  * Added a new class called ``Scene`` to manage Shots with another property.
  * Removed the ``output_path`` attribute in FilenameTemplate class.
  * Grouped the templates for each entity under a directory with the entity name.


  * Users now can have more than one Department.
  * User instances now have two new properties for getting the user tickets
  ( and the open tickets (User.open_tickets).
  * New shortcut Task.project returns the Task.task_of.project value.
  * Shot and Asset creation dialogs now automatically updated with the given
  Project instance info.
  * User overview page is now reflection the new design.


  * The ``code`` attribute of the SimpleEntity is now introduced as a separate
  mixin. To let it be used by the classes it is really needed.
  * The ``query`` method is now converted to a property so it is now possible to
  use it like a property as in the SQLAlchemy.orm.Session as shown below::
  from stalker import Project
  Project.query.all()  instead of Project.query().all()
  * ScheduleMixin.due_date is renamed to ScheduleMixin.end_date.
  * Added a new class attribute to SimpleEntity called ``__auto_name__`` which
  controls the naming of the instances and instances derived from SimpleEntity.
  If ``__auto_name__`` is set to True the ``name`` attribute of the instance
  will be automatically generated and it will have the following format::
  Here are a couple of naming examples::
  * Fixed an autoflush issue with SQLAlchemy in StatusList class. Now the status
  column is again not nullable in StatusMixin.


  * Added a new class called EntityType to hold all the available class names and
  * Version class now has a new attribute called ``inputs`` to hold the inputs of
  the current Version instance. It is a list of Link instances.
  * FilenameTemplate classes ``path`` and ``filename`` attributes are no more
  converted to string, so given a non string value will raise TypeError.
  * Structure.custom_template now only accepts strings and None, setting it to
  anything else will raise a TypeError.
  * Two Type's for FilenameTemplate's are created by default when initializing
  the database, first is called "Version" and it is used to define
  FilenameTemplates which are used for placing Version source files. The second
  one is called "Reference" and it is used when injecting references to a given
  class. Along with the FilenameTemplate.target_entity_type this will allow one
  to create two different FilenameTemplates for one class::
  first get the Types
  vers_type = Type.query()\
  ref_type = Type.query()\
  lets create a FilenameTemplate for placing Asset Version files.
  f_ver = FilenameTemplate(
  and now define a FilenameTemplate for placing Asset Reference files.
  no need to have an output_path here...
  f_ref = FilenameTemplate(
  * stalker.db.register() now accepts only real classes instead of class names.
  This way it can store more information about classes.
  * Status.bg_color and Status.fg_color attributes are now simple integers. And
  the Color class is removed.
  * StatusMixin.status is now a ForeignKey to a the Statuses table, thus it is a
  real Status instance instead of an integer showing the index of the Status in
  the related StatusList. This way the Status of the object will not change if
  the content of the StatusList is changed.
  * Added new attribute Project.project_tasks which holds all the direct or
  indirect Tasks created for that project.
  * User.login_name is renamed to User.login.
  * Removed the ``first_name``, ``last_name`` and ``initials`` attributes from
  User class. Now the ``name`` and ``code`` attributes are going to be used,
  thus the ``name`` attribute is no more the equivalent of ``login`` and the
  ``code`` attribute is doing what was ``initials`` doing previously.


  * Status class now has two new attributes ``bg_color`` and ``fg_color`` to hold
  the UI colors of the Status instance. The colors are Color instances.


  * SimpleEntity now has an attribute called ``generic_data`` which can hold any
  kind of ``SOM`` object inside and it is a list.
  * Changed the formatting rules for the ``name`` in SimpleEntity class, now it
  can start with a number, and it is not allowed to have multiple whitespace
  characters following each other.
  * The ``source`` attribute in Version is renamed to ``source_file``.
  * The ``version`` attribute in Version is renamed to ``version_number``.
  * The ``take`` attribute in Version is renamed to ``take_name``.
  * The ``version_number`` in Version is now generated automatically if it is
  skipped or given as None or it is too low where there is already a version
  number for the same Version series (means attached to the same Task and has
  the same ``take_name``.
  * Moved the User class to ``stalker.models.auth module``.
  * Removed the ``stalker.ext.auth`` module because it is not necessary anymore.
  Thus the User now handles all the password conversions by itself.
  * ``PermissionGroup`` is renamed back to Group
  again to match with the general naming of the authorization concept.
  * Created two new classes for the Authorization system, first one is called
  Permission and the second one is a Mixin which is called ACLMixin which adds
  ACLs to the mixed in class. For now, only the User and Group classes are
  mixed with this mixin by default.
  * The declarative Base class of SQLAlchemy is now created by binding it to a
  ORMClass (a random name) which lets all the derived class to have a method
  called ``query`` which will bypass the need of calling
  ``DBSession.query(class_)`` but instead just call ``class_.query()``::
  from stalker.models.auth import User
  user_1 = User.query().filter_by(name='a user name').first()


  * Changed the ``db.setup`` arguments. It is now accepting a dictionary instead
  of just a string to comply with the SQLAlchemy scaffold and this dictionary
  should contain keys for the SQLAlchemy engine setup. There is another utility
  that comes with Pyramid to setup the database under the `scripts` folder, it
  is also working without any problem with stalker.db.
  * The ``session`` variable is renamed to ``DBSession`` and is now a scopped
  session, so there is no need to use ``DBSession.commit`` it will be handled
  by the system it self.
  * Even though the ``DBSession`` is using the Zope Transaction Manager extension
  normally, in the database tests no extension is used because the transaction
  manager was swallowing all errors and it was a little weird to try to catch
  this errors out of the ``with`` block.
  * Refactored the code, all the models are now in separate python files, but can
  be directly imported from the main stalker module as shown::
  from stalker import User, Department, Task
  By using this kind of organization, both development and usage will be eased
  * ``task_of`` now only accepts TaskableEntity instances.
  * Updated the examples. It is now showing how to extend SOM correctly.
  * Updated the references to the SOM classes in docstrings and rst files.
  * Removed the ``Review`` class. And introduced the much handier Ticket class.
  Now reviewing a data is the process of creating Ticket's to that data.
  * The database is now initialized with a StatusList and a couple of Statuses
  appropriate for Ticket instances.
  * The database is now initialized with two Type instances ('Enhancement' and
  'Defect') suitable for Ticket instances.
  * StatusMixin now stores the status attribute as an Integer showing the index
  of the Status in the ``status_list`` attribute but when asked for the value
  of ``StatusMixin.status`` attribute it will return a proper Status instance
  and the attribute can be set with an integer or with a proper Status


  * **Fix:** Fixed image orientation bug. References are now displayed correctly
  if they contain an "Image Orientation" among their EXIF tags.
  * **Update:** Updated the ColorBox image title field to correctly contain both
  a download link and a "open in new tab" link to the highest version of the
  related image.


  * **Update:** MediaManager now replaces any Turkish characters with English
  versions of them.
  * **New:** Added script for moving old style references from SPL to the
  Fileserver with new style References
  * **New:** Added script to remove any unused file from SPL
  * **Fix:** Fixed ``video_player.jinja2`` to center the video and maximize it to
  the whole screen,
  * **Fix:** Fixed ``upload_reference`` dialog ``submit`` button to show correct
  message on file upload and video convertion.


  * **New:** References are now stored in the *Project Repository* instead of
  *Stalker Pyramid Local Storage*, allowing much bigger files to be uploaded
  (like videos). They are following the FilenameTemplate rules so the files are
  correctly placed under the Task folder (see Stalker documentation).
  * **New:** Video files are now supported as both references and version
  outputs and a thumbnail is correctly created from the first, middle and last
  frames of the video. Also a version for web view (in WebM format) is saved
  under "{{Task}}/References/StalkerPyramid/ForWeb/" folder.
  * **New:** Entity references are now searchable with their tags, original file
  names or entity full name.
  * **New:** List Entity References page is now paginated.
  * **New:** Fully implemented ``Paginator.js`` a jQuery pagination plugin.
  * **Fix:** Users are not allowed to create TimeLogs for future dates.
  * **Update:** Updated the SQL query for getting hierarchical Task names to a
  much better one, which allows *Depth First* or *Breadth First* sorting.
  * **Fix:** Fixed performance issue in GanttChart drawing by using a pure SQL
  query in ``views.tasks.convert_to_dgrid_gantt_project_format()``.
  * **Update:** Task Scheduling process UI is now much more informative. Allowing
  the user to be informed about when the process is going to end by showing a
  progress bar.
  * **New:** Centralized the Task Scheduling, so that only one user at a time is
  allowed to schedule the tasks, preventing any clashes and unnecessary system
  * **Update:** The calendar is now drawn way faster than before thaks to pure
  SQL queries.
  * **Update:** Extended search functionality.
  * **Update:** ``minute`` time unit is added to GanttChart.
  * **Update:** Updated the mail content so two different emails are sent to the
  responsible and resources upon review request.
  * **Update:** ``Shot.cut_in`` and ``Shot.cut_out`` attributes are now correctly
  updated (there was a bug in Stalker).


  * **New:** Updated the UI to follow changes in Stalker v0.2.5 including
  features like "Task Status Workflow", "Multiple Reviewers".

  * **Update:** Switched to Pillow from PIL.


  * **New:** The images on ticket comments are now copied to Stalker Storage and
  the links in the comments are replaced with proper Link instance paths. And
  the upload limit is increased to 2 MBytes per file.
  * **Update:** Unified the "Review Request Dialog" over the whole site.
  * **Update:** Updated the templates for "Review Request", "Ticket Update" and
  "Revision Request" mails.
  * **Fix:** Fixed Ticket comment display on multiple lines when the comment is
  plain text.


  * **Update:** ``views.task.request_revision()`` will not create any new task
  anymore, it will only extend the task with the given revision timing.
  * **Update:** ``views.time_log.create_time_log()`` will allow to create time
  logs for tasks with "hrev" status, and as usual it will convert the status
  to "wip" for that particular task.
  * **Update:** ``views.time_log.delete_time_log()`` now doesn't allow to delete
  time logs of a completed task.
  * **Update:** ``views.task.request_revision()`` now adds the revision
  description as a comment to the tickets which have the revised task in their
  links list.
  * **Update:** ``views.task.request_review()`` now updates the related ticket if
  this is not the first review requested for the task.


  * **New:** Added a new status called "Ready To Start | RTS" which sits in
  between NEW and WIP. Any newly created task will have its status set to RTS
  if no dependencies has given. If there are dependencies and not all of them
  are in "Complete | CMPL" status, then the newly created tasks status will be
  NEW, otherwise its status will be RTS. And the status of all the dependent
  tasks will be updated on any review has been made to a task.
  * **Fix:** Fixed ``GanttGrid.js`` where the event argument was not set for
  right arrow and down arrow key functions.
  * **Fix:** A bug is fixed in ``views.entity.submit_search()`` and
  ``views.entity.list_search_result()`` views.
  * **Update:** The tjp ids in the error messages of TaskJuggler are now replaced
  with correct links to the related task.


  * **New:** Added "Create" button to ``view_ticket.jinja2`` template. So it is
  now possible to create a new ticket using the dialog.
  * **Fix:** Fixed "Asset", "Shot", "Sequence" menu entries under "Create" sub
  menu under "Actions" menu in ``list_tasks.jinja2`` template.
  * **Fix:** Fixed "Create" button address in ``list_entity_assets.jinja2``,
  ``list_entity_shots.jinja2`` and ``list_entity_sequences.jinja2`` templates.
  * **Update:** Removed schedule related fields from Task Dialog when the entity
  type is Asset, Shot or Sequence.
  * **Fix:** Replaced "?came_from=" statements with proper "_query()" arguments
  in several templates.
  * **New:** Link statuses are now shown in ``view_ticket.jinja2`` if the link is
  a Task derivative.
  * **Fix:** Fixed a bug in the sql query in ``views.auth.get_resources()`` view.
  * **New:** Added new Ticket type called "Review" and updated
  ``task.request_review()`` to use this type for newly created Review Tickets.


  * **Update:** Upgraded to `stalker v0.2.3.3`.
  * **Fix:** Any TicketLog created for a Ticket is now created with UTC time.
  * **Update:** When a Ticket is updated all of the previous commenters will also
  receive emails.
  * **New:** Ticket status changes are also emailed to anybody related to the
  particular ticket.


  * **Update:** Upgraded to `stalker v0.2.3.2`.
  * **Update:** Separated the create/update/review dialog routes for Task, Asset,
  Shot and Sequences.
  * **New:** Added utc_to_local() and local_to_utc() functions to
  stalker_pyramid.views module.
  * **Fix:** Added ``transaction.abort()`` statements before all return
  statements when the return value
  is a Response instance with a status integer of 500.
  * **Update:** Replaced task_dialog_template.jinja2 with dialog_template.jinja2
  * **New:** Added Review Task dialog.
  * **Fix:** Fixed Create/Update TimeLog dialog by disabling the submit button
  when it is hit once.
  * **Update:** GanttChart now shows the status of the task as the background
  color in `percent complete` column.
  * **Fix:** When a review request is made for a task, the resulting Ticket is
  created in UTC time.
  * **New:** Added `description` field to TimeLog create/update dialog.
  * **Update:** Included `dialog_template.jinja2` in `base.jinja2` by default.
  * **Update:** TimeLog dialog now only lists tasks with NEW or WIP status.
  * **Update:** Replaced the queries inside
  ``stalker_pyramid.views.project.get_project_tasks_today()`` with pure sql
  queries which are ~100x faster.
  * **Update:** Replaced the queries inside
  ``stalker_pyramid.views.asset.get_asset()`` with pure sql queries which are
  over ~450x faster.
  * **New:** Added `stalker.less` file for the main `stalker.css` generation.
  * **New:** GanttChart now displays rows in status color.
  * **New:** Added ``stalker_pyramid.views.asset.get_assets_count()`` to easily
  get the asset counts.
  * **New:** Parent task statuses are now updated when a review is made or a time
  log has been entered to a child task.
  * **New:** Review request only can be made by one of the resources or by the
  responsible of a task.
  * **New:** ``stalker_pyramid.views.task.review_task()`` will now send emails if
  the task is approved.
  * **New:** Added "Request Review" button to task view.
  * **Update:** Optimized the load times of the project_sidebar and user_sidebar
  menus by both using raw sql queries and changing the query and dom element
  modification orders in javascript.
  * **New:** Added ``fix_task_statuses`` view to fix a particular task and its
  parent statuses according to the task/status pipeline.
  * **New:** GanttChart columns can now be toggled without any problem in tree
  * **Update:** ``stalker_pyramid.views.tasks.get_tasks()`` is now using raw sql
  query which is around ~300x faster then previous pure Python implementation.
  * **New:** It is now possible to select a parent task in GanttGrid by left
  clicking from keyboard, and then collapsing the parent with a second click.


  * **Update:** Moved to Ace, a Bootstrap derived template.
  * **New:** Added Resource Chart.
  * **New:** Added the ability to zoom in Gantt Chart.
  * **Fix:** Fixed avatar uploads in user info update page.
  * **Update:** Added status and status list creation for Project, Task, Asset,
  Shot and Sequence entity types and New, Work In Progress, Pending Review,
  Has Revision and Completed to
  * **Update:** Status colors are now coming from SimpleEntity.html_class


  * **Update:** Updating both the code and the style to Twitter Bootstrap.
  * **Update:** Main Navigation Bar is updated both the code and the style to
  Twitter Bootstrap.
  * **Update:** TaskJuggler error messages are now correctly displayed in the UI.
  * **Update:** Updated the GanttChart theme to match the rest of the site.
  * **Fix:** Task dialog is now able to create Tasks, Assets, Shots and
  * **Fix:** Task dialog is now working properly and it is now possible to add a
  type for the Tasks to distinguish different type of tasks like Modeling,
  Animation, Look Development, Lighting, Comp etc.
  * **Fix:** It is now possible to create a child or dependent task from the
  "Create" menu in **List Tasks** view.
  * **Update:** The ``chosen_field_creator()`` function now sets the field to
  ``is_updating=true`` mode before filling the data in, and back to
  ``is_updating=false`` mode after the data arrived and items are created. Also
  this is used extensively in the Task Dialog.


  * **Update:** Redesigned all the routes to comply with a RESTful service
  * **New:** Leaf tasks on gantt chart now have a new functionality called
  "Request Review" which can be invoked through the context menu. It will
  create a new Ticket and assign it to the task responsible.
  * **New:** Calling 'Request Review' now will send an email to the responsible
  and the logged in user.
  * **Update:** It is now possible to upload multiple References.
  * **Update:** Reference dialog now has a tag field.
  * **Update:** "Duplicate Task Hierarchy" now confirms the action to the user
  before doing anything.
  * **New:** It is now possible to create new Version files by uploading files to
  the server. Though the stalker server now needs to have a link to the file
  * **Update:** Updating a StudioWide Vacation is not allowed in user vacation
  * **Update:** All the DGrid table columns are now resizable.
  * **Update:** GanttColumn now scrolls to the desired date so that the date will
  be in the middle of the view.
  * **Update:** GanttColumn now shows the width of the days/weeks correctly.
  * **New:** References are now shown in a dojox.image.LightBox dialog.
  * **Fix:** Fixed **get_permissions_from_multi_dict()**, it is now skipping
  unknown access, action and class_name entries.
  * **Fix:** Fixed Gantt Chart not showing completed parent tasks id column with
  a in green background.
  * **New:** Added menu for Projects in Gantt Chart.
  * **Fix:** The bugs after RESTful service scheme in appending user to different
  types of entity are fixed.
  * **Fix:** In TimeLog UI, when updating a time log the remaining hours is
  calculated correctly by first adding the updated time log duration to the
  remaining time. Thus the ui shows the correct value after update.
  * **Fix:** URL of duplicate task hierarchy method changed into Restful service
  scheme format.
  * **New:** Gantt Chart is displayed in Department Views Task tab.
  * **Update:** The date time format in dgrid views is turn into yyyy-mm-dd HH:MM


  * **New:** Stalker_Pyramid now uses a brand new implementation for the
  gantt chart which utilizes a DGrid with OnDemand capabilities. The new Gantt
  Chart is over 100x faster then the previous implementation.
  * **Update:** Started to move the view designs towards a RESTFul Service style.
  * **Update:** Files stored in Stalker Pyramid Local Storage (SPL Storage) are
  now reached with the 'SPL'
  prefix instead of revealing the real path on the server.
  * **New:** It is now possible to upload and query References (Link instances
  assigned as references) for Task, Asset, Shot and Sequences.
  * **Update:** Adding studio vacation method is changed.Vacation that has not
  got a user is suppose to be studio vacation
  * **Fix:** Minor bug is fixed in update vacation
  * **Fix:** Minor bug is fixed in and


  * **Update:** All the date values are now returned as **UTC String** and
  stored in database as UTC datetime thus Stalker now supports Time Zones.
  * **Fix:** Fixed all the dialogs with TimeTextBox inputs, where the
  date portion was reset to epoch by the widget itself, causing a change in
  Day Light Saving of the users locale and the dialog was reporting wrong
  date time values. Now in those dialogs, on submit a new date object is
  created or the DateTextBox widget value is used and the time portion of the
  Date object is updated from the TimeTextBox. This way, it is guaranteed to
  get correct date and time values.
  * **Fix:** Fixed Studio create/update dialog, it is now correctly setting the
  start and end hours of a non working day.
  * **New:** Studio Page is created.It has Tasks and Resources as Tabs.
  * **New:** Update Studio function id added.
  * **New:** Thumbnail Add function is added to several objects' Summarize Pages.
  (Task, Asset, Shot, Sequence,Department, Group). List Page is also updated
  by new thumbnail information.
  * **Fix:** dgrid height attribute is updated and new div's are added for
  dgrid object.
  * **Fix:** Working hours for each day is taken from database in
  Studio Update Dialog.
  * **New:** List Ticket page and Create/Update Ticket dialog are created.
  * **Fix:** Added logged_in_user object to user page to fix permission bug. So
  default facilities of page is define based on logged_in_user.
  * **Fix:** Fixed DGrid auto height problem.
  * **Fix:** GanttChart  view of Assets, Shots,Sequences or Tasks now displays
  only the children and parents of that Task derivative.
  * **Update:** Task create/update dialog now displays the full hierarchy in
  parent/dependent task listings.
  * **Fix:** TimeLog create/update dialog now displays the default times
  correctly when creating a new TimeLog.
  * **Fix:** TimeLog create/update view callables are now checking if there
  will be any OverBookedError raised.
  * **Fix:** Task create/update dialog now will not list the task itself in
  parent and dependent task lists, if the UI is called with a Task instance
  ({{task}} is not None).
  * **Update:** For Asset Page and Task Page tab order is changed.
  * **New:** Starts and Ends attributes are added to Task Summary Page.
  * **Update:** List of Users, Departments and Groups are now sorted by using
  the name of the entity.
  * **Update:** Task create/update dialog now has a new field called
  * **Update:** **Task.schedule_constraint** is now filled with correct
  information when creating/updating a Task.
  * **Fix:** Selected 'Status' attribute for 'Task Dialog' in 'Update' mode is
  set when dialog is open.
  * **New:** Version List Page and Create/Update Dialogs are added.
  * **New:** Vacation List Page and Create/Update Dialogs are added.
  * **Fix:** Merge tested, and vacation adding is finished.
  * **New:** Version Page is created. It has Outputs,Inputs and Children as
  * **New**: Added 'duration' field to TimeLog's List dgrid.
  * **Fix:** Fixed the error in rendering of the **home** occurred when there is
  no user login information found in the request.
  * **New:** User thumbnails now can be changed.
  * **New:** Project thumbnails now can be changed.
  * **New:** ``content_list_projects`` now shows the project thumbnails.
  * **New:** ``content_list_users`` now shows the user thumbnails.
  * **New:** ``submitForm.js`` now enables all the disabled fields of the given
  form, and disables them back again upon error.
  * **Fix:** ``TagSelect.js`` will now correctly disable the child widgets if the
  ``disabled`` attribute is set to **true**.
  * **New:** Added ``fields`` javascript library which are a special group of
  input fields designed to be used with Stalker.
  * **New:** Added the first input field to stalker/fields, called ``tagField``.
  It is now possible to add a TagSelect field which is correctly updated by
  only two lines of code.
  * **New:** Added ``get_tags()`` to stalker.views.__init__ module. Because all
  the tags now should be created with the ``tagField`` the way to retrieve tags
  is the same, so this helper function will let you retrieve tags from the
  given request instance.
  * **New:** Permissions page is added to Group Page.
  * **Fix:** dgrid object is declared from [Grid, Selection, Keyboard]. So it's
  possible to select a row and navigate by Keyboard.
  * **New:** Permission controls are added to 'Page' and 'List' files.
  * **New:** Permission controls are added to 'Dialog' and 'Summary' files.
  * **Fix:** Minor bug is fixed in Update Department dialog.
  * **Update:** Updated to Dojo 1.9
  * **Update:** stalker.js is renamed to dialogs.js and it is now fully
  compatible with Dojo AMD.
  * **Update:** Merged StatusList create and update dialogs in to one.
  * **Update:** Content List - Task now checks user permissions to disable part
  of the UI.
  * **Update:** Added description field to the Summarize Task view.
  * **Update:** Added permission checks to several views.
  * **Fix:** Fixed fieldUpdater.js to work properly with Dojo 1.9 especially for
  MultiSelect widgets.
  * **Fix:** Separated the dialog and action routes for Structure.
  * **Fix:** Fixed unnecessary module imports in stalker.js.
  * **Fix:** Schedule button is now working properly.
  * **Fix:** Fixed Image Format creation.
  * **Fix:** Fixed Filename Template create dialog routine.
  * **Fix:** Fixed Filename Template update dialog routine.
  * **Fix:** Fixed entity_types in Filename Template creation UI.
  * **Fix:** Fixed Group update dialog, the permissions were not displayed and
  the name was not updated on the server side.
  * **Fix:** Fixed TaskBox CSS template
  * **New:** GanttChart now displays the finished/unfinished tasks with a
  green/red 'id' column.
  * **Fix:** Status color attribute converted from unicode to integer.
  * **Fix:** To destroy previous open dialog, same dialog id is given for create
  and update dialogs.
  * **Update:** In create/update_group dialog, to check all rows new checkboxes
  are added to head of each column.
  * **Update:** ``ComboBox`` is added to TagSelect widget as a new input widget
  * **Update:** Description field is added to Department dialog.
  * **Fix:** ``user_create_dialog`` now shows and updates groups.
  * **Fix:** Updating a project now correctly refreshes the ``project_summary``
  content pane.
  * **Fix:** Separated the dialog and action routes for ImageFormat.
  * **Fix:** Separated the dialog and action routes for Asset.
  * **Fix:** Separated the dialog and action routes for Repository.
  * **Fix:** The working hours were not correctly passed to the studio instance
  in Studio creation.
  * **Fix:** "Append User Dialog" is now working properly.
  * **Fix:** Links between pages is created with redirectLink function which is
  written in base.jinja2. goToLink.js is deprecated, but still there are some
  codes that uses gotolink.js, they must be changed for next update.
  * **Update:** Combined ``user_create_dialog`` and ``user_update_dialog`` into
  * **Update:** Logged in work times will now be visible in gantt charts as a
  green bar in the TaskBar div.
  * **Update:** Department menus under 'Crew' menu are now showing the department
  * **Update:** Color choosers in "Create Status Dialog" now have colors picked
  by default for BG and FG colors.
  * **Update:** Replaced DataGrid objects with dgrid.
  * **Update:** Added navigation bar for assets, shots, sequences.
  * **Update:** Combined ``project_create_dialog`` and ``project_update_dialog``
  into one.
  * **Update:** Merged the 'Crew' menu creation code in to one single
  teamMenuCreator.js, which is able to create menus for any groups and faux
  * **Update:** All DataGrid field updated with dgrid class.
  * **New:** Placeholder images added for user and department.
  * **New:** Added update group dialog.
  * **Update:** Colors for the layouts are changed with MiamiNice PieChart's
  * **New:** Added update group dialog.
  * **New:** Append department and append group pages has connected to database.
  * **New:** Timelog List page added.
  * **New:** New placeholders added for different type of object.
  * **New:** Added dialogCreator.js which helps creating a dialog without having
  a widget (Button or MenuItem) calling it and updated dialogCaller.js to use
  dialogCreator while creating a dialog.
  * The Shot, Asset, Sequence detail pages under the Project Overview now opens
  inside the related tab on the Project Page.
  * Updated the Create Task Dialog to reflect the TaskJuggler integration.
  * Changed the license of Stalker_Pyramid from BSD-2 to LGPL 2.1. Any version
  previous to 0.2.0.a9 will be still BSD-2 and any version from and including
  0.2.0.a9 will be distributed under LGPL 2.1 license.
  * TagSelect now can be filled by setting its ``value`` attribute (Ex:
  TagSelect.set('value', data))
  * Fixed Projects menu in base.jinja2, the link is now updating correctly when a
  new project is added.
  * Converted the ```` to a python module and put the views for each
  entity to its own python file.
  * Added a new Dojo Widget called Tag to help the creation of the tags in the
  * Updated java scripts to be `required` in Dojo AMD way.
  * Updated to include "pyramid_jinja2"
  * Added 'PlaceHolder' property for 'FilterSelect Widgets'. And 'Label' property
  is used in construction of 'PlaceHolder' property.
  * Set disabled prerequisite fields, until their prerequisite is selected.
  * Added **StartDate**, **EndDate** and **Duration** field to add_project page.
  **StartDate**, **EndDate** properties are now written to database.
  * Project page is redesigned. SplitContainer is removed. All contents are
  displayed in TabContainer. New Contents in TabContainer are:
  * ProjectName (Disabled Field - Used for displaying projectname.)
  * Overview  (It has InlineEditable fields. Although they are not connected
  to DB.)
  * Shot and Asset creation dialogs now automatically updated with the given
  Project instance info.
  * User overview page is now reflection the new design.
  * The WebUI form fields are now refreshed with newly added data.
  * Added a new Dojo widget called TagSelect. Which is basically a widget for
  adding Tag style widgets.
  * Converted the whole system to a Pyramid Web application. If the previous
  implementations investigated, it will be understood that it was only the
  database model of a Web Application.
  * **jQueryGantt:**
  * **Update:** The gantt chart is now able to display much more info then
  before. There are two new modes for each of the Grid and Gantt parts of
  the Gantt Chart. Grid can be set to display *Task*\ s or *Resources* and
  the Gantt can set to display *Task*\ s or *TimeLog*\ s.
  * **Update:** Horizontal scrolling is disabled in gantt part of Gantt
  Chart. All the drawn tasks and links are now set in position with percent
  values, so they will stick and scale correctly when the split container
  * **Update:** Any task out of range is culled in gantt chart.
  * **Update:** Added new buttons to change the range in -1/+1 month,
  -1/+1 week, -1/+1 day.
  * **Update:** Replaced the **Date.format()** (originally replaced by
  jQueryGantt **date.js**) with **date.format.js** library.
  * **Update:** Changed the background of the Grid and Gantt editors.
  * **Update:** If the displayed tasks is clipped to the current start end
  range a double red border is displayed in the clipped start or end.
  * **Update:** Context menu can now be opened in task names in grid editor.
  * **Update:** Optimized the creation of task rows.
  * **Update:** Replaced the ``input`` elements with ``div`` in the task row.
  * **New:** Holding the mouse on Task bar elements will now show a popup
  window for more info.
  * **Update:** Gantt Chart zoom levels are now fully controlled by the start
  and end date DateTextBoxes.
  * **New:** Added a new button which will center the gantt chart on today.
  * **Update:** Replaced the ``duration`` column with ``timing`` which
  correctly shows the schedule timing info of the related task.
  * **Fix:** The ``depends`` column shows the dependent task names correctly.
  * **Update:** jQueryGantt displays the owner Project of the Tasks as a
  container task.
  * **Update:** Added content link (this will be updated to support proper
  links, hardcoded links to be removed).
  * **Update:** Disabled drag and resize of TaskBar elements.
  * **Update:** Moved the resource link code to the JST template code instead
  of the Task class.
  * **Fix:** t is now possible to correctly move a TaskBar without getting in
  to an infinite loop which was freezing the browser.
  * **Update:** The timing resolution of jQueryGantt is now 1 hour.
  * **Fix:** GanttMaster.task_ids were not properly cleaned in
  GanttMaster.reset(), resulting wrong links to be created.
  * **Update:** Added a new zoom level where it is possible to see the every 1
  hour of 1 day.
  * Moving any child task will adjust the parent start and end dates so they
  fit to the children.
  * Gannt view is now communicating with Stalker correctly. The only left issue
  is the end date value is not properly shown in the gannt view.
  * Updated the jQueryGannt css's to work with Stalker and Dojo.
  * Colorized the Sunday column in suitable zoom levels. In upcoming releases
  it will use the attribute to
  determine if the day/hour is an off day/hour.
  * Disabled editing of date fields.
  * Disabled undo/redo queue for performance test.
  * Fixed vertical overflow in gantt chart.
  * It is now possible to not to align a tasks start to its dependent tasks
  * jQueryGantt is now using the Task ids coming from Stalker instead of the
  ridiculous rowId.
  * Fixed a lot of issues related with the new data structure, it seems
  everything is working properly right now.
  * Parent Tasks displayed differently than the leaf tasks (on paar with the
  other gantt charts).
  * Gantt chart in User Detail page is now showing the parent tasks of the
  tasks of the user.
  * Now there are two different context menus for container/parent tasks and
  leaf tasks.
  Stalker Changes