# Copyright 2016 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

"""A class to display a paginated list of activity stream updates."""
from __future__ import print_function
from __future__ import division
from __future__ import absolute_import

import logging

from features import activities
from framework import servlet
from framework import urls


class ProjectUpdates(servlet.Servlet):
  """ProjectUpdates page shows a list of past activities."""

  _PAGE_TEMPLATE = 'project/project-updates-page.ezt'
  _MAIN_TAB_MODE = servlet.Servlet.MAIN_TAB_UPDATES

  def GatherPageData(self, mr):
    """Build up a dictionary of data values to use when rendering the page."""

    page_data = self._GatherUpdates(mr)
    page_data['subtab_mode'] = None
    page_data['user_updates_tab_mode'] = None
    logging.info('project updates data is %r', page_data)
    return page_data

  def _GatherUpdates(self, mr):
    """Gathers and returns activity streams data."""

    url = '/p/%s%s' % (mr.project_name, urls.UPDATES_LIST)
    return activities.GatherUpdatesData(
        self.services, mr, project_ids=[mr.project_id],
        ending='by_user', updates_page_url=url,
        autolink=self.services.autolink)

  def GetProjectUpdatesPage(self, **kwargs):
    return self.handler(**kwargs)
