# Copyright 2016 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style
# license that can be found in the LICENSE file or at
# https://developers.google.com/open-source/licenses/bsd

"""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

import ezt

from features import activities
from framework import flaskservlet
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 = flaskservlet.FlaskServlet.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)