To configure Stalker and make it fit to your Studios need you should use the config.py file as mentioned in next sections.
Stalker uses the config.py to let one to customize the system config.
The config.py file is searched in a couple of places through the system:
- under “~/.strc/” directory (not yet)
- under “$STALKER_PATH”
The first path is a folder in the users home dir. The second one is a path defined by the STALKER_PATH environment variable.
Defining the config.py by using the environment variable gives the most customizable and consistent setup through the studio. You can set STALKER_PATH to a shared folder in your fileserver where all the users can access.
Because, config.py is a regular Python code which is executed by Stalker, you can do anything you were doing in a normal Python script. This is very handy (also dangerous!) if you have another source of information which is reachable by a Python script.
If there is no STALKER_PATH variable in your current environment or it is not showing an existing path or there is no config.py file the system will use the system defaults.
Variables which can be set in config.py are as follows:
Actions for authorization system. These are used to create ACLs. Stalker uses CRUDL system. Default value is:
actions = ['Create', 'Read', 'Update', 'Delete', 'List'] #CRUDL
Tells Stalker to create an admin by default. Default value is:
auto_create_admin = True
The default admin user name. Default value is:
admin_name = 'admin'
The default admin login. Default value is:
admin_login = 'admin'
The default admin password. Default value is:
admin_password = 'admin'
The default email for admin user. Default value is:
admin_email = 'admin@admin.com'
The default department name for admin. Default value is:
admin_department_name = 'admins'
The default admin permission group name. Default value is:
admin_group_name = 'admins'
A dictionary of config values. The default value is:
database_engine_settings = {
"sqlalchemy.url": "sqlite:///:memory:",
"sqlalchemy.echo": False,
}
This value is not used.
The local storage path for Stalker.
local_storage_path = os.path.expanduser(‘~/.strc’)
The per user or local session file name. It is used for storing logged in user info. The default value is:
local_session_data_file_name = 'local_session_data'
Storage for uploaded files. This used by Stalker Pyramid and shows the server side storage path. Will be moved to Stalker Pyramid in later versions. Not used by Stalker by default. Default value is:
server_side_storage_path = os.path.expanduser('~/Stalker_Storage')
The default keyword which is going to be used in password scrambling. Default value is:
key = "stalker_default_key"
The default take name for Version instances. Default value is:
version_take_name = "Main"
Default background color for Status instances. Default value is:
status_bg_color = 0xffffff
Default foreground color for Status instances. Default value is:
status_fg_color = 0x000000
Default ticket label. Used by Ticket when generating a ticket name. Default value is:
ticket_label = "Ticket"
Defines the ticket statuses and the order of them. Default value is:
ticket_status_order = [
'new', 'accepted', 'assigned', 'reopened', 'closed'
]
Defines the default ticket resolutions. Default value is:
ticket_resolutions = [
'fixed', 'invalid', 'wontfix', 'duplicate', 'worksforme', 'cantfix'
]
Defines the default ticket workflow. It is a dictionary of actions. Shows the new status per action. Default value is:
ticket_workflow = {
'resolve' : {
'new': {
'new_status': 'closed',
'action': 'set_resolution'
},
'accepted': {
'new_status': 'closed',
'action': 'set_resolution'
},
'assigned': {
'new_status': 'closed',
'action': 'set_resolution'
},
'reopened': {
'new_status': 'closed',
'action': 'set_resolution'
},
},
'accept' : {
'new': {
'new_status': 'accepted',
'action': 'set_owner'
},
'accepted': {
'new_status': 'accepted',
'action': 'set_owner'
},
'assigned': {
'new_status': 'accepted',
'action': 'set_owner'
},
'reopened': {
'new_status': 'accepted',
'action': 'set_owner'
},
},
'reassign': {
'new': {
'new_status': 'assigned',
'action': 'set_owner'
},
'accepted': {
'new_status': 'assigned',
'action': 'set_owner'
},
'assigned': {
'new_status': 'assigned',
'action': 'set_owner'
},
'reopened': {
'new_status': 'assigned',
'action': 'set_owner'
},
},
'reopen': {
'closed': {
'new_status': 'reopened',
'action': 'del_resolution'
}
}
}
Defines the default timing resolution for classes which are mixed with DateRangeMixin. Stalker uses the TaskJuggler default timing resolution which is 1 hour:
timing_resolution = datetime.timedelta(hours=1)
Defines the default task duration. If only a start or end value is entered for a Task then Stalker calculates the other value by adding or subtracting the default task duration value from it. Default value is 1 hour:
task_duration = datetime.timedelta(hours=1)
Defines the default task priority. This is used by TaskJuggler to prioritize tasks. Should be a number between 0 and 1000. Default value is 500:
task_priority = 500
Defines the default weekly working hours per week day. Stalker uses the TaskJuggler default value of 9am to 6pm. The values entered are minutes from midnight, and it is a list of lists of two integers. Each list of two integers shows a working hour interval. Default value is:
working_hours = {
'mon': [[540, 1080]], # 9:00 - 18:00
'tue': [[540, 1080]], # 9:00 - 18:00
'wed': [[540, 1080]], # 9:00 - 18:00
'thu': [[540, 1080]], # 9:00 - 18:00
'fri': [[540, 1080]], # 9:00 - 18:00
'sat': [], # saturday off
'sun': [], # sunday off
}
Defines the default daily working hour. This is strongly related with the working_hours, weekly_working_hours, weekly_working_days and yearly_working_days settings and shows a mean value of daily working hour. Default value is 9:
daily_working_hours = 9
Defines the default weekly working hour. This is strongly related with the working_hours, daily_working_hours, weekly_working_days and yearly_working_days settings. Default value is 45:
weekly_working_hours = 45
Defines the default weekly working days. This is strongly related with the working_hours, daily_working_hours, weekly_working_hours and yearly_working_days settings. Default value is 5:
weekly_working_days = 5
Defines the default yearly working days. This is strongly related with the working_hours, daily_working_hours, weekly_working_hours and weekly_working_days settings. Default value is 260.714 which equals weekly_working_days * 52.1428:
yearly_working_days = 260.714
Defines the order of the week days. Default value uses European system:
day_order = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
Defines the date and time units. The order should match the datetime_unit_names setting. Default value is:
datetime_units = ['min', 'h', 'd', 'w', 'm', 'y']
Defines the names of date and time units. The order should match the datetime_units setting. Default value is:
datetime_unit_names = ['minute', 'hour', 'day', 'week', 'month', 'year']
Defines the conversion ratios of each date and time unit. Default value is:
datetime_units_to_timedelta_kwargs = {
'min': {'name': 'minutes', 'multiplier': 1},
'h' : {'name': 'hours' , 'multiplier': 1},
'd' : {'name': 'days' , 'multiplier': 1},
'w' : {'name': 'weeks' , 'multiplier': 1},
'm' : {'name': 'days' , 'multiplier': 30},
'y' : {'name': 'days' , 'multiplier': 365}
}
Defines the default schedule models. These are highly related with TaskJuggler, so anything entered here should exist in TaskJuggler. Default value is:
task_schedule_models = ['effort', 'length', 'duration']
Defines the default schedule constraints. The order also defines a binary number corresponding to each value (00: none, 01: start, 10:end, 11:both) and used in defining which side of a Task is constrained to a date. Also used by TaskJuggler to constrain the start or end or both dates of a task to a certain date. Also a Task with schedule_constraint is set to 2 (both) is considered a duration task even if its schedule_model is set to effort or length. Default value is:
task_schedule_constraints = ['none', 'start', 'end', 'both']
Defines a Jinja2 template for converting WorkingHours instances to a TaskJuggler compatible string. By default Stalker converts a WorkingHours instance to a workinghours statement in TaskJuggler. Default value is:
tjp_working_hours_template = """{% macro wh(wh, day) -%}
{%- if wh[day]|length %} workinghours {{day}} {% for part in wh[day] -%}
{%- if loop.index != 1%}, {% endif -%}
{{"%02d"|format(part[0]//60)}}:{{"%02d"|format(part[0]%60)}} - {{"%02d"|format(part[1]//60)}}:{{"%02d"|format(part[1]%60)}}
{%- endfor -%}
{%- else %} workinghours {{day}} off
{%- endif -%}
{%- endmacro -%}
{{wh(workinghours, 'mon')}}
{{wh(workinghours, 'tue')}}
{{wh(workinghours, 'wed')}}
{{wh(workinghours, 'thu')}}
{{wh(workinghours, 'fri')}}
{{wh(workinghours, 'sat')}}
{{wh(workinghours, 'sun')}}"""
Defines a Jinja2 template for converting a Studio instance to a TaskJuggler compatible string. By default Stalker converts a Studio instance to a project statement in TaskJuggler. Default value is:
tjp_studio_template = """project {{ studio.tjp_id }} "{{ studio.name }}" {{ studio.start.date() }} - {{ studio.end.date() }} {
timingresolution {{ '%i'|format((studio.timing_resolution.days * 86400 + studio.timing_resolution.seconds)//60|int) }}min
now {{ studio.now.strftime('%Y-%m-%d-%H:%M') }}
dailyworkinghours {{ studio.daily_working_hours }}
weekstartsmonday
{{ studio.working_hours.to_tjp }}
timeformat "%Y-%m-%d"
scenario plan "Plan"
trackingscenario plan
}
"""
Defines a Jinja2 template for converting a Project instance to a TaskJuggler compatible string. By default Stalker converts a Project instance to a task statement in TaskJuggler. Default value is:
tjp_project_template = """task {{project.tjp_id}} "{{project.name}}" {
{% for task in project.root_tasks %}
{{task.to_tjp}}
{% endfor %}
}
"""
Defines a Jinja2 template for converting a Task instance to a TaskJuggler compatible string. By default Stalker converts a Task to a task statement in TaskJuggler. Default value is:
tjp_task_template = """task {{task.tjp_id}} "{{task.name}}" {
{% if task.priority != 500 -%}priority {{task.priority}}{%- endif %}
{%- if task.depends %}
depends {% for depends in task.depends %}
{%- if loop.index != 1 %}, {% endif %}{{depends.tjp_abs_id}}
{%- endfor -%}
{%- endif -%}
{%- if task.is_container -%}
{%- for child_task in task.children %}
{{ child_task.to_tjp }}
{%- endfor %}
{%- else %}
{% if task.resources|length -%}
{% if task.schedule_constraint %}
{%- if task.schedule_constraint == 1 or task.schedule_constraint == 3 -%}
start {{ task.start.strftime('%Y-%m-%d-%H:%M') }}
{%- endif %}
{%- if task.schedule_constraint == 2 or task.schedule_constraint == 3 %}
end {{ task.end.strftime('%Y-%m-%d-%H:%M') }}
{%- endif -%}
{% endif %}
{{task.schedule_model}} {{task.schedule_timing}}{{task.schedule_unit}}
allocate {% for resource in task.resources -%}
{%-if loop.index != 1 %}, {% endif %}{{resource.tjp_id}}{% endfor %}
{%- endif -%}
{% for time_log in task.time_logs %}
booking {{time_log.resource.tjp_id}} {{time_log.start.strftime('%Y-%m-%d-%H:%M:%S')}} +{{'%i'|format(time_log.duration.days*24 + time_log.duration.seconds/3600)}}h { overtime 2 }
{%- endfor -%}
{% endif %}
}
"""
Defines a Jinja2 template for converting a Department instance to a TaskJuggler compatible string. By default Stalker converts a Department to a resource statement in TaskJuggler. Default value is:
tjp_department_template = '''resource {{department.tjp_id}} "{{department.name}}" {
{%- for resource in department.users %}
{{resource.to_tjp}}
{%- endfor %}
}'''
Defines a Jinja2 template for converting a Vacation instance to a TaskJuggler compatible string. By default Stalker converts a Vacation instance to a vacation statement in TaskJuggler. Default value is:
tjp_vacation_template = '''vacation {{ vacation.start.strftime('%Y-%m-%d-%H:%M') }}, {{ vacation.end.strftime('%Y-%m-%d-%H:%M') }}'''
Defines a Jinja2 template for converting a User instance to a TaskJuggler resource statement. Default value is:
tjp_user_template = '''resource {{user.tjp_id}} "{{user.name}}"{% if user.vacations %} {
{% for vacation in user.vacations -%}
{{vacation.to_tjp}}
{% endfor -%}
}{% endif %}'''
Defines a Jinja2 template for converting all the information coming from Stalker to a TaskJuggler compatible tjp file. Default value is:
tjp_main_template = """# Generated By Stalker v{{stalker.__version__}}
{{studio.to_tjp}}
# resources
resource resources "Resources" {
{%- for user in studio.users %}
{{user.to_tjp}}
{%- endfor %}
}
# tasks
{% for project in studio.active_projects %}
{{project.to_tjp}}
{% endfor %}
# reports
taskreport breakdown "{{csv_file_full_path}}"{
formats csv
timeformat "%Y-%m-%d-%H:%M"
columns id, start, end
}
"""
Defines the TaskJuggler command. Stalker uses this configuration value to call TaskJugglers tj3 command.
tj_command = ‘/usr/local/bin/tj3’,
Defines a default value for path template for FilenameTemplate instances to be used by Version instances. This value is not used yet. Default value is:
path_template = '{{project.code}}/{%- for parent_task in parent_tasks -%}{{parent_task.nice_name}}/{%- endfor -%}'
Defines a default value for filename template for FilenameTemplate instances to be used by Version instances. This value is not used yet. Default value is:
filename_template = '{{task.entity_type}}_{{task.id}}_{{version.take_name}}_v{{"%03d"|format(version.version_number)}}'
Defines the default file sequence format to be used with PySeq. This value is not used yet. Default value is:
sequence_format = "%h%p%t %R"
Fore details about the format see the PySeq documentation.
Defines the default file size format to be used in UI. Default value is:
file_size_format = "%.2f MB"
Defines the default datetime format to be used in UI and string representations of datetime.datetime instances. Default value is:
date_time_format = '%Y.%m.%d %H:%M'
Defines default resolution presets. This value is not used yet. Default value is:
resolution_presets = {
"PC Video": [640, 480, 1.0],
"NTSC": [720, 486, 0.91],
"NTSC 16:9": [720, 486, 1.21],
"PAL": [720, 576, 1.067],
"PAL 16:9": [720, 576, 1.46],
"HD 720": [1280, 720, 1.0],
"HD 1080": [1920, 1080, 1.0],
"1K Super 35": [1024, 778, 1.0],
"2K Super 35": [2048, 1556, 1.0],
"4K Super 35": [4096, 3112, 1.0],
"A4 Portrait": [2480, 3508, 1.0],
"A4 Landscape": [3508, 2480, 1.0],
"A3 Portrait": [3508, 4960, 1.0],
"A3 Landscape": [4960, 3508, 1.0],
"A2 Portrait": [4960, 7016, 1.0],
"A2 Landscape": [7016, 4960, 1.0],
"50x70cm Poster Portrait": [5905, 8268, 1.0],
"50x70cm Poster Landscape": [8268, 5905, 1.0],
"70x100cm Poster Portrait": [8268, 11810, 1.0],
"70x100cm Poster Landscape": [11810, 8268, 1.0],
"1k Square": [1024, 1024, 1.0],
"2k Square": [2048, 2048, 1.0],
"3k Square": [3072, 3072, 1.0],
"4k Square": [4096, 4096, 1.0],
}
Defines the default resolution preset fro new Projects. This value is not used yet. Default value is:
default_resolution_preset = "HD 1080"
Defines the default project structure. This value is not used by Stalker. Default value is:
project_structure = """{% for shot in project.shots %}
Shots/{{shot.code}}
Shots/{{shot.code}}/Plate
Shots/{{shot.code}}/Reference
Shots/{{shot.code}}/Texture
{% endfor %}
{% for asset in project.assets%}
{% set asset_path = project.full_path + '/Assets/' + asset.type.name + '/' + asset.code %}
{{asset_path}}/Texture
{{asset_path}}/Reference
{% endfor %}
"""
Defines the default thumbnail format. This value is not used by Stalker. Default value is:
thumbnail_format = "jpg"
Defines the default thumbnail quality. This value is not used by Stalker. Default value is:
thumbnail_quality = 70
Defines the defaul thumbnail size. This value is not used by Stalker. Default value is:
thumbnail_size = [320, 180]