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()
class SummaryColumnTests(BaseColumnTestCase): """Testing reviewboard.datagrids.columns.SummaryColumn.""" column = SummaryColumn() def test_render_data(self): """Testing SummaryColumn.render_data""" review_request = self.create_review_request(summary='Summary 1', publish=True) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.VISIBLE self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<span>Summary 1</span>') def test_render_data_with_draft(self): """Testing SummaryColumn.render_data with draft review request""" review_request = self.create_review_request( summary='Summary 1', submitter=self.request.user) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.VISIBLE self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-draft">Draft</label>' '<span>Summary 1</span>') def test_render_data_with_draft_summary(self): """Testing SummaryColumn.render_data with draft summary""" review_request = self.create_review_request( summary='Summary 1', submitter=self.request.user) # These are generally set by the column's augment_queryset(). review_request.draft_summary = 'Draft Summary 1' review_request.visibility = ReviewRequestVisit.VISIBLE self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-draft">Draft</label>' '<span>Draft Summary 1</span>') def test_render_data_with_draft_and_no_summary(self): """Testing SummaryColumn.render_data with draft and no summary""" review_request = self.create_review_request( submitter=self.request.user) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.VISIBLE review_request.summary = None self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-draft">Draft</label>' '<span class="no-summary">No Summary</span>') def test_render_data_with_archived(self): """Testing SummaryColumn.render_data with archived review request""" review_request = self.create_review_request( summary='Summary 1', submitter=self.request.user, publish=True) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.ARCHIVED self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-archived">Archived</label>' '<span>Summary 1</span>') def test_render_data_with_muted(self): """Testing SummaryColumn.render_data with muted review request""" review_request = self.create_review_request( summary='Summary 1', submitter=self.request.user, publish=True) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.MUTED self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-muted">Muted</label>' '<span>Summary 1</span>') def test_render_data_with_draft_and_archived(self): """Testing SummaryColumn.render_data with draft and archived review request """ review_request = self.create_review_request( summary='Summary 1', submitter=self.request.user) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.ARCHIVED self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-draft">Draft</label>' '<label class="label-archived">Archived</label>' '<span>Summary 1</span>') def test_render_data_with_draft_and_muted(self): """Testing SummaryColumn.render_data with draft and muted review request """ review_request = self.create_review_request( summary='Summary 1', submitter=self.request.user) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.MUTED self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-draft">Draft</label>' '<label class="label-muted">Muted</label>' '<span>Summary 1</span>') def test_render_data_with_submitted(self): """Testing SummaryColumn.render_data with submitted review request""" review_request = self.create_review_request( summary='Summary 1', status=ReviewRequest.SUBMITTED, submitter=self.request.user, public=True) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.VISIBLE self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-submitted">Submitted</label>' '<span>Summary 1</span>') def test_render_data_with_discarded(self): """Testing SummaryColumn.render_data with discarded review request""" review_request = self.create_review_request( summary='Summary 1', status=ReviewRequest.DISCARDED, submitter=self.request.user, public=True) # These are generally set by the column's augment_queryset(). review_request.draft_summary = None review_request.visibility = ReviewRequestVisit.VISIBLE self.assertEqual( self.column.render_data(self.stateful_column, review_request), '<label class="label-discarded">Discarded</label>' '<span>Summary 1</span>')
class ReviewRequestDataGrid(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. """ my_comments = MyCommentsColumn() star = ReviewRequestStarColumn() ship_it = ShipItColumn() summary = SummaryColumn() submitter = SubmitterColumn() 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() def __init__(self, *args, **kwargs): 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, is_new = Profile.objects.get_or_create(user=user) 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): if profile: self.show_closed = profile.show_closed try: self.show_closed = (int( self.request.GET.get('show-closed', self.show_closed)) != 0) except ValueError: # do nothing pass if not self.show_closed: self.queryset = self.queryset.filter(status='P') self.queryset = self.queryset.filter(local_site=self.local_site) if profile and self.show_closed != profile.show_closed: profile.show_closed = self.show_closed return True return False def post_process_queryset(self, queryset): q = queryset.with_counts(self.request.user) return super(ReviewRequestDataGrid, self).post_process_queryset(q) def link_to_object(self, state, obj, value): if value and isinstance(value, User): return local_site_reverse('user', request=self.request, args=[value]) return obj.get_absolute_url()