def GatherHelpData(self, mr, page_data):
        """Return a dict of values to drive on-page user help.

    Args:
      mr: common information parsed from the HTTP request.
      page_data: Dictionary of base and page template data.

    Returns:
      A dict of values to drive on-page user help, to be added to page_data.
    """
        help_data = super(ProjectCreate, self).GatherHelpData(mr, page_data)
        cue_remaining_projects = None

        (_period, _soft, _hard,
         life_max) = actionlimit.ACTION_LIMITS[actionlimit.PROJECT_CREATION]
        actionlimit_pb = actionlimit.GetLimitPB(mr.auth.user_pb,
                                                actionlimit.PROJECT_CREATION)
        if actionlimit_pb.get_assigned_value('lifetime_limit'):
            life_max = actionlimit_pb.lifetime_limit
        if life_max is not None:
            if (actionlimit_pb.lifetime_count + 10 >= life_max
                    and actionlimit_pb.lifetime_count < life_max):
                cue_remaining_projects = life_max - actionlimit_pb.lifetime_count

        help_data.update({
            'cue_remaining_projects': cue_remaining_projects,
        })
        return help_data
Beispiel #2
0
    def testCountAction_ResetRecentActions(self):
        action = actionlimit.ISSUE_COMMENT
        user = user_pb2.User()
        limit = actionlimit.GetLimitPB(user, action)
        limit.recent_count = 10
        limit.reset_timestamp = 11

        limit = actionlimit.GetLimitPB(user, action)
        self.assertEqual(10, limit.recent_count)
        self.assertEqual(11, limit.reset_timestamp)

        actionlimit.ResetRecentActions(user, action)

        limit = actionlimit.GetLimitPB(user, action)
        self.assertEqual(0, limit.recent_count)
        self.assertEqual(0, limit.reset_timestamp)
Beispiel #3
0
    def testNeedCaptcha_NoLifetimeLimit(self):
        action = actionlimit.ISSUE_COMMENT
        user = user_pb2.User()
        life_max = actionlimit.ACTION_LIMITS[action][3]
        actionlimit.GetLimitPB(user, action).lifetime_count = life_max + 1

        self.assertRaises(actionlimit.ExcessiveActivityException,
                          actionlimit.NeedCaptcha,
                          user,
                          action,
                          skip_lifetime_check=False)
        self.assertFalse(
            actionlimit.NeedCaptcha(user, action, skip_lifetime_check=True))
        actionlimit.GetLimitPB(user, action).recent_count = 1
        actionlimit.GetLimitPB(user,
                               action).reset_timestamp = int(time.time()) + 5
        self.assertFalse(
            actionlimit.NeedCaptcha(user, action, skip_lifetime_check=True))
Beispiel #4
0
    def testCountAction_IncrementsRecentCount(self):
        action = actionlimit.ISSUE_COMMENT
        user = user_pb2.User()
        (_period, soft_limit, _hard_limit,
         _life_max) = actionlimit.ACTION_LIMITS[action]

        for i in range(1, soft_limit):
            actionlimit.CountAction(user, action)
            limit = actionlimit.GetLimitPB(user, action)
            self.assertEqual(i, limit.recent_count)
            self.assertEqual(i, limit.lifetime_count)
Beispiel #5
0
    def testCountAction_PeriodExpiration(self):
        action = actionlimit.ISSUE_COMMENT
        user = user_pb2.User()
        (period, soft_limit, _hard_limit,
         _life_max) = actionlimit.ACTION_LIMITS[action]
        now = int(time.time())
        later = now + period + 1  # a future in which our timestamp is expired

        for i in range(1, soft_limit):
            actionlimit.CountAction(user, action, now=now)
            limit = actionlimit.GetLimitPB(user, action)
            self.assertEqual(i, limit.recent_count)
            self.assertEqual(i, limit.lifetime_count)

        actionlimit.CountAction(user, action, now=now)
        self.assertEqual(soft_limit, limit.recent_count)
        self.assertEqual(soft_limit, limit.lifetime_count)

        actionlimit.CountAction(user, action, now=later)
        self.assertEqual(1, limit.recent_count)
        self.assertEqual(soft_limit + 1, limit.lifetime_count)
Beispiel #6
0
    def _DeserializeUsersByID(self, user_rows, actionlimit_rows,
                              dismissedcue_rows):
        """Convert database row tuples into User PBs.

    Args:
      user_rows: rows from the User DB table.
      actionlimit_rows: rows from the ActionLimit DB table.
      dismissedcue_rows: rows from the DismissedCues DB table.

    Returns:
      A dict {user_id: user_pb} for all the users referenced in user_rows.
    """
        result_dict = {}

        # Make one User PB for each row in user_rows.
        for row in user_rows:
            (user_id, email, is_site_admin, notify_issue_change,
             notify_starred_issue_change, email_compact_subject,
             email_view_widget, notify_starred_ping, banned,
             after_issue_update, keep_people_perms_open, preview_on_hover,
             ignore_action_limits, obscure_email, last_visit_timestamp,
             email_bounce_timestamp, vacation_message) = row
            user = user_pb2.MakeUser(user_id,
                                     email=email,
                                     obscure_email=obscure_email)
            user.is_site_admin = bool(is_site_admin)
            user.notify_issue_change = bool(notify_issue_change)
            user.notify_starred_issue_change = bool(
                notify_starred_issue_change)
            user.email_compact_subject = bool(email_compact_subject)
            user.email_view_widget = bool(email_view_widget)
            user.notify_starred_ping = bool(notify_starred_ping)
            if banned:
                user.banned = banned
            if after_issue_update:
                user.after_issue_update = user_pb2.IssueUpdateNav(
                    after_issue_update.upper())
            user.keep_people_perms_open = bool(keep_people_perms_open)
            user.preview_on_hover = bool(preview_on_hover)
            user.ignore_action_limits = bool(ignore_action_limits)
            user.last_visit_timestamp = last_visit_timestamp or 0
            user.email_bounce_timestamp = email_bounce_timestamp or 0
            if vacation_message:
                user.vacation_message = vacation_message
            result_dict[user_id] = user

        # Make an ActionLimit for each actionlimit row and attach it to a User PB.
        for row in actionlimit_rows:
            (user_id, action_type_name, recent_count, reset_timestamp,
             lifetime_count, lifetime_limit, period_soft_limit,
             period_hard_limit) = row
            if user_id not in result_dict:
                logging.error('Found action limits for missing user %r',
                              user_id)
                continue
            user = result_dict[user_id]
            action_type = actionlimit.ACTION_TYPE_NAMES[action_type_name]
            al = actionlimit.GetLimitPB(user, action_type)
            al.recent_count = recent_count
            al.reset_timestamp = reset_timestamp
            al.lifetime_count = lifetime_count
            al.lifetime_limit = lifetime_limit
            al.period_soft_limit = period_soft_limit
            al.period_hard_limit = period_hard_limit

        # Build up a list of dismissed "cue card" help items for the users.
        for user_id, cue in dismissedcue_rows:
            if user_id not in result_dict:
                logging.error('Found dismissed cues for missing user %r',
                              user_id)
                continue
            result_dict[user_id].dismissed_cues.append(cue)

        return result_dict