Browse our Products

Aspose.Tasks for Python via .NET 26.9 Release Notes

All Changes

KeySummaryIssue Type
TASKSNET-11196Optimize TimephasedData calculation: remove baseline’s TimephasedData from Task, Resource, Assignment.TimephasedDataEnhancement
TASKSNET-11811Add progress notification API when loading Project from Primavera XML formatEnhancement
TASKSNET-3249Fix calculation of summary task’s properties when non-active child task is presentBug
TASKSNET-3674Fix overtimed assignment’s cost calculation when a resource has a non-flat rateBug
TASKSNET-11585Fix assignment cost timephased data generation: Resource.CostPerUse and Resource.AccrueAt should be taken into accountBug
TASKSNET-11829Fix resource baseline reading: include items with zero work/cost but non-empty TD when reading MPP formatBug

Public API and Backwards Incompatible Changes

The following public methods and properties were added:Description
aspose.tasks.Baseline.timephased_dataGets or sets a TimephasedDataCollection instance for this object.

Related issue: TASKSNET-11196 - Optimize TimephasedData calculation: remove baseline’s TimephasedData from Task, Resource, Assignment.TimephasedData

This release optimizes timephased data calculation by no longer adding baseline timephased data to the TimephasedData collection of Task, Resource, and Assignment objects. Baseline timephased data is now stored separately within each Baseline object.

Timephased Data access changes

Before version 26.9: Baseline timephased data was stored both in the Baseline object AND in the parent entity’s TimephasedData collection. This led to increased memory consumption and performance overhead which could be noticeable for enterprise-level projects with large number of tasks, assignments and baselines.

Now:

Baseline timephased data is stored separately in Baseline.TimephasedData. The new implementation uses lazy initialization which only creates timephased data when it’s actually accessed. Regular timephased data is in the entity’s TimephasedData collection.

To retrieve baseline timephased data, use one of these methods:

For:

import aspose.tasks as tasks

# Get baseline timephased data via Baseline object
baseline = next(
    b for b in task.baselines
    if b.baseline_number == tasks.BaselineType.BASELINE
)
baseline_td = baseline.timephased_data

# Or use get_timephased_data method
baseline_td = task.get_timephased_data(start, finish, tasks.TimephasedDataType.TASK_BASELINE_WORK)

For Resource:

import aspose.tasks as tasks

# Get baseline timephased data via Baseline object
baseline = next(
    b for b in resource.baselines
    if b.baseline_number == tasks.BaselineType.BASELINE
)
baseline_td = baseline.timephased_data

# Or use get_timephased_data method
baseline_td = resource.get_timephased_data(start, finish, tasks.TimephasedDataType.RESOURCE_BASELINE_WORK)

For ResourceAssignment:

import aspose.tasks as tasks

# Get baseline timephased data via Baseline object
baseline = next(
    b for b in assignment.baselines
    if b.baseline_number == tasks.BaselineType.BASELINE
)
baseline_td = baseline.timephased_data

# Or use get_timephased_data method
baseline_td = assignment.get_timephased_data(start, finish, tasks.TimephasedDataType.ASSIGNMENT_BASELINE_WORK)

Migration Guide Old code example:

import aspose.tasks as tasks

# Get all timephased data including baseline data
all_td = task.timephased_data

# Filter baseline data
baseline_td = [
    td for td in all_td
    if td.timephased_data_type == tasks.TimephasedDataType.TASK_BASELINE_WORK
]

New code example:

import aspose.tasks as tasks

# Get baseline timephased data directly
baseline = next(
    b for b in task.baselines
    if b.baseline_number == tasks.BaselineType.BASELINE
)
baseline_td = baseline.timephased_data

# Or use get_timephased_data for filtered results
baseline_td = task.get_timephased_data(
    task.start,
    task.finish,
    tasks.TimephasedDataType.TASK_BASELINE_WORK,
)