I have a new installation of Trac 0.11.7 and Agilo 1.2.1 running and
when I select Dashboard from the menu I receive the below Trac error.
Is there something I may have setup incorrect?

TypeError: 'NoneType' object is not iterable

Most recent call last:

    * File "c:\program files\python25\lib\site-packages\Trac-0.11.7-
py2.5.egg\trac\web\main.py", line 450, in _dispatch_request
      Code fragment:
       445. try:
       446. if not env and env_error:
       447. raise HTTPInternalError(env_error)
       448. try:
       449. dispatcher = RequestDispatcher(env)
       450. dispatcher.dispatch(req)
       451. except RequestDone:
       452. pass
       453. resp = req._response or []
       454.
       455. except HTTPException, e:
      Local variables:
      Name      Value
      after     [u' except RequestDone:', u' pass', u' resp = ...
      before    [u' try:', u' if not env and env_error:', u' raise ...
      dispatcher        <trac.web.main.RequestDispatcher object at
0x03C30BD0>
      e         TypeError("'NoneType' object is not iterable",)
      env       <trac.env.Environment object at 0x03839630>
      env_error         None
      exc_info  (<type 'exceptions.TypeError'>, TypeError("'NoneType'
object is not ...
      filename  'c:\\program ...
      frames    [{'function': '_dispatch_request', 'lines_before': [u'
try:', u' ...
      has_admin         True
      line      u' dispatcher.dispatch(req)'
      lineno    449
      message   u"TypeError: 'NoneType' object is not iterable"
      req       <Request "GET u'/dashboard'">
      resp      []
      tb        <traceback object at 0x03F5D260>
      tb_hide   None
      traceback         u'Traceback (most recent call last):\n File "c:\
\program ...
    * File "c:\program files\python25\lib\site-packages\Trac-0.11.7-
py2.5.egg\trac\web\main.py", line 206, in dispatch
      Code fragment:
       201. req.args.get('__FORM_TOKEN') != req.form_token:
       202. raise HTTPBadRequest('Missing or invalid form token. '
       203. 'Do you have cookies enabled?')
       204.
       205. # Process the request and render the template
       206. resp = chosen_handler.process_request(req)
       207. if resp:
       208. if len(resp) == 2: # Clearsilver
       209. chrome.populate_hdf(req)
       210. template, content_type = \
       211. self._post_process_request(req, *resp)
      Local variables:
      Name      Value
      chosen_handler    <agilo.scrum.backlog.dashboard.ScrumDashboard
object at 0x03C3C6B0>
      chrome    <trac.web.chrome.Chrome object at 0x03C30AB0>
      err       (<type 'exceptions.TypeError'>, TypeError("'NoneType'
object is not ...
      handler   <agilo.scrum.backlog.dashboard.ScrumDashboard object at
0x03C3C6B0>
      req       <Request "GET u'/dashboard'">
      self      <trac.web.main.RequestDispatcher object at 0x03C30BD0>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\backlog\dashboard.py",
line 101, in process_request
      Code fragment:
        96. 'may_edit_tickets': Action.TICKET_EDIT in req.perm
        97. }
        98. # Makes sure the Add Backlog list data is done once...
        99. if not AgiloConfig(self.env).is_agilo_ui:
       100. BacklogModule(self.env).send_backlog_list_data(req, data)
       101. self._add_charts_to_template_data(req,
current_sprint_name, data)
       102.
       103. return 'agilo_dashboard.html', data, None
       104.
       105.
#=============================================================================
       106. # INavigationContributor methods
      Local variables:
      Name      Value
      current_sprint    <spr...@65747120 (Physical Engine Fixes) for
u'Physical Engine v1.0' ...
      current_sprint_name       u'Physical Engine Fixes'
      data      {'may_edit_tickets': True, 'may_delete_tickets': True,
'current_sprint': ...
      req       <Request "GET u'/dashboard'">
      self      <agilo.scrum.backlog.dashboard.ScrumDashboard object at
0x03C3C6B0>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\backlog\dashboard.py",
line 71, in _add_charts_to_template_data
      Code fragment:
        66. backlog = Backlog(self.env, Key.SPRINT_BACKLOG,
scope=current_sprint_name)
        67. cached_data = dict(tickets=backlog)
        68. chart_generator = ChartGenerator(self.env)
        69. get_widget = chart_generator.get_chartwidget
        70. widget = get_widget(ChartType.BURNDOWN, width=680,
height=350,
        71. sprint_name=current_sprint_name, cached_data=cached_data)
        72. widget.prepare_rendering(req)
        73. data['burndown'] = widget
        74.
        75. widget = get_widget(ChartType.SPRINT_RESOURCES_STATS,
width=300, height=300,
        76. sprint_name=current_sprint_name, cached_data=cached_data)
      Local variables:
      Name      Value
      backlog   <agilo.scrum.backlog.model.Backlog object at
0x03EB3A70>
      cached_data       {'tickets': <agilo.scrum.backlog.model.Backlog
object at 0x03EB3A70>}
      chart_generator   <agilo.charts.chart_generator.ChartGenerator
object at 0x03D9A990>
      current_sprint_name       u'Physical Engine Fixes'
      data      {'may_edit_tickets': True, 'may_delete_tickets': True,
'current_sprint': ...
      get_widget        <bound method ChartGenerator.get_chartwidget of ...
      req       <Request "GET u'/dashboard'">
      self      <agilo.scrum.backlog.dashboard.ScrumDashboard object at
0x03C3C6B0>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\charts\chart_generator.py",
line 135, in get_chartwidget
      Code fragment:
       130. kwargs.pop(Key.WIDTH, None)
       131.
       132. def get_chartwidget(self, name, use_cache=True, **kwargs):
       133. """Return a widget instance which will generate the
chart's HTML."""
       134.
       135. new_widget = self._get_widget(name, kwargs, use_cache)
       136. self._set_widget_dimensions(new_widget, name, kwargs)
       137. new_widget.update_data(**kwargs)
       138. return new_widget
       139.
       140. def _add_names_for_persistent_objects(self,
changed_items):
      Local variables:
      Name      Value
      kwargs    {'cached_data': {'tickets':
<agilo.scrum.backlog.model.Backlog object at ...
      name      'burndown'
      self      <agilo.charts.chart_generator.ChartGenerator object at
0x03D9A990>
      use_cache         True
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\charts\chart_generator.py",
line 110, in _get_widget
      Code fragment:
       105. if cache_key is not None and cache_key in self.cache:
       106. cached_widget = self.cache[cache_key]
       107. new_widget = cached_widget.copy()
       108. else:
       109. self._add_configured_colors(kwargs)
       110. new_widget = generator.generate_widget(name, **kwargs)
       111. if cache_key is not None:
       112. # Maybe clean cache after a certain amount of time/certain
size?
       113. self.cache[cache_key] = new_widget.copy()
       114. kwargs = {} # don't overwrite everything again
with .update() below
       115. return new_widget
      Local variables:
      Name      Value
      cache_key         None
      generator         <agilo.scrum.backlog.charts.BurndownChartGenerator
object at 0x03F519F0>
      kwargs    {'cached_data': {'tickets':
<agilo.scrum.backlog.model.Backlog object at ...
      name      'burndown'
      new_widget        None
      self      <agilo.charts.chart_generator.ChartGenerator object at
0x03D9A990>
      use_cache         True
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\backlog\charts.py", line
62, in generate_widget
      Code fragment:
        57. self._push_today_color_if_available(burndown_widget,
kwargs)
        58. if 'sprint_name' in kwargs:
        59. if 'cached_data' in kwargs:
        60.
burndown_widget.update_data(cached_data=kwargs['cached_data'])
        61. sprint_name = kwargs.get('sprint_name')
        62. burndown_widget.populate_with_sprint_data(sprint_name)
        63. return burndown_widget
        64.
        65. def get_backlog_information(self):
        66. # Charts are a layer above the burndown so this module
must not import
        67. # agilo.scrum.backlog globally
      Local variables:
      Name      Value
      burndown_widget   <agilo.scrum.backlog.charts.BurndownWidget
object at 0x037665B0>
      kwargs    {'cached_data': {'tickets':
<agilo.scrum.backlog.model.Backlog object at ...
      name      'burndown'
      self      <agilo.scrum.backlog.charts.BurndownChartGenerator object
at 0x03F519F0>
      sprint_name       u'Physical Engine Fixes'
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\backlog\charts.py", line
300, in populate_with_sprint_data
      Code fragment:
       295.
       296. backlog = self._get_backlog(sprint_name)
       297. filtered_backlog = getattr(backlog, 'filter_by', None) is
not None
       298.
       299. commitment = self.get_commitment(sprint_name)
       300. actual_data = self.get_remaining_time_series(sprint_name,
backlog, commitment)
       301. capacity_data = self._get_capacity(sprint_name,
filtered_backlog)
       302. first_remaining_time = commitment
       303. if first_remaining_time is None and len(actual_data) > 0:
       304. first_remaining_time = actual_data[0]
       305. ideal_data = self._calculate_ideal_burndown(capacity_data,
first_remaining_time, len(dates))
      Local variables:
      Name      Value
      backlog   <agilo.scrum.backlog.model.Backlog object at
0x03EB3A70>
      commitment        None
      dates     [733861, 733862, 733863, 733864, 733865, 733866, 733867,
733868, 733869, ...
      end_sprint        733877
      filtered_backlog  False
      self      <agilo.scrum.backlog.charts.BurndownWidget object at
0x037665B0>
      sprint    ValueObject({'end': datetime.datetime(2010, 4, 14, 16,
0, ...
      sprint_name       u'Physical Engine Fixes'
      start_sprint      733861
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\backlog\charts.py", line
284, in get_remaining_time_series
      Code fragment:
       279.
       280. def get_remaining_time_series(self, sprint_name, backlog,
commitment):
       281. cmd_rem_times =
SprintController.GetRemainingTimesCommand(self.env,
       282. sprint=sprint_name, cut_to_today=True,
       283. commitment=commitment, tickets=backlog)
       284. actual_data =
self.sp_controller.process_command(cmd_rem_times)
       285. return actual_data
       286.
       287. def populate_with_sprint_data(self, sprint_name):
       288. sprint = self._load_sprint(sprint_name)
       289. if sprint == None:
      Local variables:
      Name      Value
      backlog   <agilo.scrum.backlog.model.Backlog object at
0x03EB3A70>
      cmd_rem_times
<agilo.scrum.sprint.controller.GetRemainingTimesCommand object at ...
      commitment        None
      self      <agilo.scrum.backlog.charts.BurndownWidget object at
0x037665B0>
      sprint_name       u'Physical Engine Fixes'
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\api\controller.py", line 333,
in process_command
      Code fragment:
       328. if not
self._check_command_is_for_this_controller(command):
       329. raise self.CommandNotFoundError("The command (%s) was " \
       330. "not found on this " \
       331. "controller" % command)
       332. try:
       333. return command.execute(self, date_converter, as_key)
       334. except Exception, e:
       335. if not isinstance(e, ICommand.CommandError):
       336. e = ICommand.CommandError(to_unicode(e))
       337. #raise e
       338. raise
      Local variables:
      Name      Value
      as_key    None
      command   <agilo.scrum.sprint.controller.GetRemainingTimesCommand
object at ...
      date_converter    None
      e         CommandError(u"'NoneType' object is not iterable",)
      self      <agilo.scrum.sprint.controller.SprintController object at
0x03C3CA50>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\api\controller.py", line 286,
in execute
      Code fragment:
       281. command can be executed, normally called by the controller
       282. """
       283. if self._errors and len(self._errors) > 0:
       284. self._raise_errors()
       285. else:
       286. return self._execute(controller, date_converter, as_key)
       287.
       288. def _execute(self, controller, date_converter=None,
as_key=None):
       289. """
       290. Execute the command, needs to have a controller reference
to
       291. access the environment and other members specific to the
      Local variables:
      Name      Value
      as_key    None
      controller        <agilo.scrum.sprint.controller.SprintController
object at 0x03C3CA50>
      date_converter    None
      self      <agilo.scrum.sprint.controller.GetRemainingTimesCommand
object at ...
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\sprint\controller.py",
line 654, in _execute
      Code fragment:
       649. # rather False by default, the validator checks for not
None so if
       650. # it would be None would be evaluated as False, and not as
True
       651. if self.cut_to_today:
       652. end = min(end, self._midnight(today + timedelta(days=1)))
       653. remaining_times =
self._get_remaining_times_for_interval(env,
       654. start, end, sprint, sp_controller, commitment)
       655. return remaining_times
       656.
       657.
       658. class
GetTotalRemainingTimeCommand(GetRemainingTimesCommand):
       659. """Returns the total current remaining time for this
sprint,
      Local variables:
      Name      Value
      as_key    None
      commitment        None
      date_converter    None
      end       datetime.datetime(2010, 4, 7, 0, 0, tzinfo=<FixedOffset
"UTC" 0:00:00>)
      env       <trac.env.Environment object at 0x03839630>
      self      <agilo.scrum.sprint.controller.GetRemainingTimesCommand
object at ...
      sp_controller     <agilo.scrum.sprint.controller.SprintController
object at 0x03C3CA50>
      sprint    <spr...@65747120 (Physical Engine Fixes) for u'Physical
Engine v1.0' ...
      start     datetime.datetime(2010, 3, 30, 15, 52, 40,
tzinfo=<FixedOffset "UTC" ...
      today     datetime.datetime(2010, 4, 6, 17, 20, 1, 329000,
tzinfo=<FixedOffset "UTC" ...
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\sprint\controller.py",
line 623, in _get_remaining_times_for_interval
      Code fragment:
       618.
       619. def _get_remaining_times_for_interval(self, env, start,
end, sprint,
       620. sp_controller, commitment):
       621. rt_series_by_task = \
       622. self.build_remaining_time_series_for_interval(env, start,
end,
       623. sprint, sp_controller)
       624. remaining_time_by_day = {}
       625. for task, days in rt_series_by_task.items():
       626. for day, remaining_time in days:
       627. if day not in remaining_time_by_day:
       628. remaining_time_by_day[day] = 0
      Local variables:
      Name      Value
      commitment        None
      end       datetime.datetime(2010, 4, 7, 0, 0, tzinfo=<FixedOffset
"UTC" 0:00:00>)
      env       <trac.env.Environment object at 0x03839630>
      self      <agilo.scrum.sprint.controller.GetRemainingTimesCommand
object at ...
      sp_controller     <agilo.scrum.sprint.controller.SprintController
object at 0x03C3CA50>
      sprint    <spr...@65747120 (Physical Engine Fixes) for u'Physical
Engine v1.0' ...
      start     datetime.datetime(2010, 3, 30, 15, 52, 40,
tzinfo=<FixedOffset "UTC" ...
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\sprint\controller.py",
line 573, in build_remaining_time_series_for_interval
      Code fragment:
       568. # AT: we have to check if the command received tickets or
       569. # not. In case there are no tickets we will get the full
       570. # backlog
       571. backlog = self.tickets or self._get_backlog(env, sprint)
       572. stories = self._get_tickets_with_attribute(tc, env,
backlog,
       573. Key.ESTIMATED_REMAINING_TIME)
       574. orphan_tasks = self._get_orphan_tasks(tc, env, backlog)
       575. get_tasks = lambda story=None:
self._get_tasks_for_story(env,
       576. sp_controller, sprint.name, story, backlog)
       577. story_tasks = [get_tasks(story) for story in stories]
       578. all_tasks = orphan_tasks + reduce(lambda x, y: x+y,
      Local variables:
      Name      Value
      backlog   None
      cut_to_today      True
      end       datetime.datetime(2010, 4, 7, 0, 0, tzinfo=<FixedOffset
"UTC" 0:00:00>)
      env       <trac.env.Environment object at 0x03839630>
      self      <agilo.scrum.sprint.controller.GetRemainingTimesCommand
object at ...
      sp_controller     <agilo.scrum.sprint.controller.SprintController
object at 0x03C3CA50>
      sprint    <spr...@65747120 (Physical Engine Fixes) for u'Physical
Engine v1.0' ...
      start     datetime.datetime(2010, 3, 30, 15, 52, 40,
tzinfo=<FixedOffset "UTC" ...
      tc        <agilo.ticket.controller.TicketController object at
0x03FDE870>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\scrum\sprint\controller.py",
line 460, in _get_tickets_with_attribute
      Code fragment:
       455.
       456. def _get_tickets_with_attribute(self, tc, env, backlog,
attribute):
       457. cmd = TicketController.FilterTicketsWithAttribute(env,
       458. tickets=backlog, attribute_name=attribute)
       459. cmd.native = True
       460. return tc.process_command(cmd)
       461.
       462. def _get_orphan_tasks(self, tc, env, backlog):
       463. cmd = TicketController.FindOrphanTasks(env,
       464. tickets=backlog)
       465. cmd.native = True
      Local variables:
      Name      Value
      attribute         'estimated_remaining_time'
      backlog   None
      cmd       <agilo.ticket.controller.FilterTicketsWithAttribute object
at 0x024E0330>
      env       <trac.env.Environment object at 0x03839630>
      self      <agilo.scrum.sprint.controller.GetRemainingTimesCommand
object at ...
      tc        <agilo.ticket.controller.TicketController object at
0x03FDE870>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\api\controller.py", line 333,
in process_command
      Code fragment:
       328. if not
self._check_command_is_for_this_controller(command):
       329. raise self.CommandNotFoundError("The command (%s) was " \
       330. "not found on this " \
       331. "controller" % command)
       332. try:
       333. return command.execute(self, date_converter, as_key)
       334. except Exception, e:
       335. if not isinstance(e, ICommand.CommandError):
       336. e = ICommand.CommandError(to_unicode(e))
       337. #raise e
       338. raise
      Local variables:
      Name      Value
      as_key    None
      command   <agilo.ticket.controller.FilterTicketsWithAttribute
object at 0x024E0330>
      date_converter    None
      e         CommandError(u"'NoneType' object is not iterable",)
      self      <agilo.ticket.controller.TicketController object at
0x03FDE870>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\api\controller.py", line 286,
in execute
      Code fragment:
       281. command can be executed, normally called by the controller
       282. """
       283. if self._errors and len(self._errors) > 0:
       284. self._raise_errors()
       285. else:
       286. return self._execute(controller, date_converter, as_key)
       287.
       288. def _execute(self, controller, date_converter=None,
as_key=None):
       289. """
       290. Execute the command, needs to have a controller reference
to
       291. access the environment and other members specific to the
      Local variables:
      Name      Value
      as_key    None
      controller        <agilo.ticket.controller.TicketController object at
0x03FDE870>
      date_converter    None
      self      <agilo.ticket.controller.FilterTicketsWithAttribute object
at 0x024E0330>
    * File "c:\program files\python25\lib\site-packages
\binary_agilo-1.2.1_PRO-py2.5.egg\agilo\ticket\controller.py", line
118, in _execute
      Code fragment:
       113.
       114. def _execute(self, controller, date_converter, as_key):
       115. # avoid circular imports
       116. from agilo.scrum.backlog import Backlog
       117. result_tickets = []
       118. for ticket_or_bi in self.tickets:
       119. if isinstance(ticket_or_bi, Backlog.BacklogItem):
       120. if not ticket_or_bi.is_visible:
       121. continue
       122. ticket_or_bi = ticket_or_bi.ticket
       123. if ticket_or_bi.is_readable_field(self._attribute_name):
      Local variables:
      Name      Value
      Backlog   <class 'agilo.scrum.backlog.model.Backlog'>
      as_key    None
      controller        <agilo.ticket.controller.TicketController object at
0x03FDE870>
      date_converter    None
      result_tickets    []
      self      <agilo.ticket.controller.FilterTicketsWithAttribute object
at 0x024E0330>

Trac: 0.11.7
Python: 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit
(Intel)]
setuptools: 0.6c11
MySQL: server: "5.0.51a-community-nt", client: "5.0.27", thread-safe:
1
MySQLdb: 1.2.2
Genshi: 0.5.1
mod_python: 3.3.1
Agilo: 1.2.1-pro
Subversion: 1.6.5 (r38866)
jQuery:1.2.6

-- 
Follow Agilo on Twitter: http://twitter.com/agiloforscrum
-----
You received this message because you are subscribed to the Google
Groups "Agilo for Scrum" group. This group is moderated by agile42 GmbH 
http://www.agile42.com and is focused in supporting Agilo for Scrum users.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/agilo?hl=en

To unsubscribe, reply using "remove me" as the subject.

Reply via email to