SOM:
WebUI:
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 priority.
Update: Task.schedule_constraint is now filled with correct information when creating/updating a Task.
set when dialog is open.
New: Version List Page and Create/Update Dialogs added.
New: Vacation List Page and Create/Update Dialogs added.
Fix: Merge tested, and vacation adding is finished.
JQueryGantt:
SOM:
WebUI:
jQueryGantt:
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.
Updated the Create Task Dialog to reflect the TaskJuggler integration.
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.
Changed these default setting value names to corresponding new names:
stalker.conf.defaults:
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:
Task.query.filter(Task.project==proj_id).filter(Task.parent==None).all()
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 WorkingHours.
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:
ScheduleMixin:
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:
In tests all the Warnings are now properly handled as Warnings.
stalker.models.ticket.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.
Converted the view.py 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 TagSelect.
Users now can have more than one Department.
Updated java scripts to be required in Dojo AMD way.
Updated setup.py to include “pyramid_jinja2”
User instances now have two new properties for getting the user tickets (User.tickets) and the open tickets (User.open_tickets).
New shortcut Task.project returns the Task.task_of.project value.
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 written on database.
jQueryGannt:
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 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:
{{ClassName}}_{{UUID4}}
Here are a couple of naming examples:
Ticket_74bb46b0-29de-4f3e-b4e6-8bcf6aed352d
Version_2fa5749e-8cdb-4887-aef2-6d8cec6a4faa
Fixed an autoflush issue with SQLAlchemy in StatusList class. Now the status column is again not nullable in StatusMixin.
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.
Added a new class called EntityType to hold all the available class names and capabilities.
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()\
.filter_by(target_entity_type="FilenameTemplate")\
.filter_by(type="Version")\
.first()
ref_type = Type.query()\
.filter_by(target_entity_type="FilenameTemplate")\
.filter_by(type="Reference")\
.first()
# lets create a FilenameTemplate for placing Asset Version files.
f_ver = FilenameTemplate(
target_entity_type="Asset",
type=vers_type,
path="Assets/{{asset.type.code}}/{{asset.code}}/{{task.type.code}}",
filename="{{asset.code}}_{{version.take_name}}_{{task.type.code}}_v{{'%03d'|version.version_number}}{{link.extension}}"
output_path="{{version.path}}/Outputs/{{version.take_name}}"
)
# and now define a FilenameTemplate for placing Asset Reference files.
# no need to have an output_path here...
f_ref = FilenameTemplate(
target_entity_type="Asset",
type=ref_type,
path="Assets/{{asset.type.code}}/{{asset.code}}/References",
filename="{{link.type.code}}/{{link.id}}{{link.extension}}"
)
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.
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()
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.
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 out.
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 instance.