class ReviewDataGrid(ShowClosedReviewRequestsMixin, DataGrid): """A datagrid that displays a list of reviews. This datagrid accepts the show_closed parameter in the URL, allowing submitted review requests to be filtered out or displayed. """ timestamp = DateTimeColumn(label=_('Date Reviewed'), format='F jS, Y', shrink=True) submitter = UsernameColumn(label=_('Owner'), user_relation=['review_request', 'submitter']) review_summary = ReviewSummaryColumn() status_query_field = 'review_request__status' site_query_field = 'review_request__local_site' def __init__(self, *args, **kwargs): """Initialize the datagrid.""" self.local_site = kwargs.pop('local_site', None) super(ReviewDataGrid, self).__init__(*args, **kwargs) self.listview_template = 'datagrids/review_request_listview.html' self.profile_columns_field = 'review_columns' self.show_closed = True self.default_sort = ['-timestamp'] self.default_columns = [ 'submitter', 'review_summary', 'timestamp', ] # Add local timezone info to the columns. user = self.request.user if user.is_authenticated(): profile = user.get_profile() self.timezone = pytz.timezone(profile.timezone) self.timestamp.timezone = self.timezone
class UsernameColumnTests(BaseColumnTestCase): """Tests for reviewboard.datagrids.columns.UsernameColumn.""" column = UsernameColumn() @add_fixtures(['test_site']) def test_render(self): """Testing UsernameColumn.render_cell""" user = User.objects.get(username='******') self.assertIn( 'href="/users/doc/"', self.column.render_cell(self.stateful_column, user, None)) @add_fixtures(['test_site']) def test_render_local_site(self): """Testing UsernameColumn.render_cell on a LocalSite""" self.request._local_site_name = self.local_site_name user = User.objects.get(username='******') self.assertIn( 'href="/s/%s/users/doc/"' % self.local_site_name, self.column.render_cell(self.stateful_column, user, None))
class UsersDataGrid(AlphanumericDataGrid): """A datagrid showing a list of users registered on Review Board.""" username = UsernameColumn(label=_('Username')) fullname = FullNameColumn(label=_('Full Name'), link=True, expand=True) pending_count = PendingCountColumn(_('Open Review Requests'), field_name='directed_review_requests', shrink=True) def __init__(self, request, queryset=User.objects.all(), title=_('All users'), local_site=None): """Initialize the datagrid.""" if local_site: qs = queryset.filter(local_site=local_site) else: qs = queryset super(UsersDataGrid, self).__init__(request, qs, title=title, sortable_column='username', extra_regex='^[0-9_\-\.].*') self.listview_template = 'datagrids/user_listview.html' self.default_sort = ['username'] self.profile_sort_field = 'sort_submitter_columns' self.profile_columns_field = 'submitter_columns' self.default_columns = ['username', 'fullname', 'pending_count'] self.show_inactive = False def link_to_object(self, state, obj, value): """Return a link to the given object.""" return local_site_reverse('user', request=self.request, args=[obj.username]) def load_extra_state(self, profile): """Load extra state for the datagrid. This handles hiding or showing inactive users. Args: profile (reviewboard.accounts.models.Profile): The user profile which contains some basic configurable settings. Returns: bool: Always returns False. """ show_inactive = self.request.GET.get('show-inactive', 0) try: self.show_inactive = int(show_inactive) except ValueError: pass if not self.show_inactive: self.queryset = self.queryset.filter(is_active=True) return False
class ReviewRequestDataGrid(ShowClosedReviewRequestsMixin, DataGrid): """A datagrid that displays a list of review requests. This datagrid accepts the show_closed parameter in the URL, allowing submitted review requests to be filtered out or displayed. """ new_updates = NewUpdatesColumn() my_comments = MyCommentsColumn() star = ReviewRequestStarColumn() ship_it = ShipItColumn() summary = SummaryColumn() submitter = UsernameColumn(label=_('Owner'), user_relation=['submitter']) branch = Column(label=_('Branch'), db_field='branch', shrink=True, sortable=True, link=False) bugs_closed = BugsColumn() repository = RepositoryColumn() time_added = DateTimeColumn(label=_('Posted'), detailed_label=_('Posted Time'), format='F jS, Y, P', shrink=True, css_class=lambda r: ageid(r.time_added)) last_updated = DateTimeColumn(label=_('Last Updated'), format='F jS, Y, P', shrink=True, db_field='last_updated', field_name='last_updated', css_class=lambda r: ageid(r.last_updated)) diff_updated = DiffUpdatedColumn( format='F jS, Y, P', shrink=True, css_class=lambda r: ageid(r.diffset_history.last_diff_updated)) time_added_since = DateTimeSinceColumn( label=_('Posted'), detailed_label=_('Posted Time (Relative)'), field_name='time_added', shrink=True, css_class=lambda r: ageid(r.time_added)) last_updated_since = DateTimeSinceColumn( label=_('Last Updated'), detailed_label=_('Last Updated (Relative)'), shrink=True, db_field='last_updated', field_name='last_updated', css_class=lambda r: ageid(r.last_updated)) diff_updated_since = DiffUpdatedSinceColumn( detailed_label=_('Diff Updated (Relative)'), shrink=True, css_class=lambda r: ageid(r.diffset_history.last_diff_updated)) diff_size = DiffSizeColumn() review_count = ReviewCountColumn() target_groups = GroupsColumn() target_people = PeopleColumn() to_me = ToMeColumn() review_id = ReviewRequestIDColumn() status_query_field = 'status' site_query_field = 'local_site' def __init__(self, *args, **kwargs): """Initialize the datagrid.""" self.local_site = kwargs.pop('local_site', None) super(ReviewRequestDataGrid, self).__init__(*args, **kwargs) self.listview_template = 'datagrids/review_request_listview.html' self.profile_sort_field = 'sort_review_request_columns' self.profile_columns_field = 'review_request_columns' self.show_closed = True self.submitter_url_name = 'user' self.default_sort = ['-last_updated'] self.default_columns = [ 'star', 'summary', 'submitter', 'time_added', 'last_updated_since' ] # Add local timezone info to the columns. user = self.request.user if user.is_authenticated(): profile = user.get_profile() self.timezone = pytz.timezone(profile.timezone) self.time_added.timezone = self.timezone self.last_updated.timezone = self.timezone self.diff_updated.timezone = self.timezone def load_extra_state(self, profile, allow_hide_closed=True): """Load extra state for the datagrid.""" return super(ReviewRequestDataGrid, self).load_extra_state(profile, allow_hide_closed) def post_process_queryset(self, queryset): """Add additional data to the queryset.""" q = queryset.with_counts(self.request.user) return super(ReviewRequestDataGrid, self).post_process_queryset(q) def link_to_object(self, state, obj, value): """Return a link to the given object.""" if value and isinstance(value, User): return local_site_reverse('user', request=self.request, args=[value]) return obj.get_absolute_url()