def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: try: field = field_cls(review_request_details) except Exception as e: logging.error('Error instantiating ReviewRequestFieldset %r: %s', field_cls, e, exc_info=1) try: if field.should_render(field.value): context.push() context['field'] = field s.append(nodelist.render(context)) context.pop() except Exception as e: logging.error('Error running should_render for ' 'ReviewRequestFieldset %r: %s', field_cls, e, exc_info=1) return ''.join(s)
def shutdown(self): super(ReviewRequestFieldsHook, self).shutdown() fieldset = get_review_request_fieldset(self.fieldset_id) for field_cls in self.fields: fieldset.remove_field(field_cls)
def test_post_with_publish_and_custom_field(self): """Testing the POST review-requests/<id>/draft/ API with custom field set in same request and public=1 """ class CustomField(BaseReviewRequestField): can_record_change_entry = True field_id = 'my-test' fieldset = get_review_request_fieldset('info') fieldset.add_field(CustomField) review_request = self.create_review_request(submitter=self.user, publish=True) rsp = self.api_post( get_review_request_draft_url(review_request), { 'extra_data.my-test': 123, 'public': True }, expected_mimetype=review_request_draft_item_mimetype) self.assertEqual(rsp['stat'], 'ok') review_request = ReviewRequest.objects.get(pk=review_request.id) self.assertIn('my-test', review_request.extra_data) self.assertEqual(review_request.extra_data['my-test'], 123) self.assertTrue(review_request.public)
def test_post_with_publish_and_custom_field(self): """Testing the POST review-requests/<id>/draft/ API with custom field set in same request and public=1 """ class CustomField(BaseReviewRequestField): can_record_change_entry = True field_id = 'my-test' fieldset = get_review_request_fieldset('info') fieldset.add_field(CustomField) review_request = self.create_review_request(submitter=self.user, publish=True) rsp = self.api_post( get_review_request_draft_url(review_request), { 'extra_data.my-test': 123, 'public': True }, expected_mimetype=review_request_draft_item_mimetype) self.assertEqual(rsp['stat'], 'ok') review_request = ReviewRequest.objects.get(pk=review_request.id) self.assertIn('my-test', review_request.extra_data) self.assertEqual(review_request.extra_data['my-test'], 123) self.assertTrue(review_request.public)
def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] request = context.get('request') if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: try: field = field_cls(review_request_details, request=request) except Exception as e: logging.exception('Error instantiating field %r: %s', field_cls, e) continue try: if field.should_render(field.value): context.push() context['field'] = field s.append(nodelist.render(context)) context.pop() except Exception as e: logging.exception( 'Error running should_render for field %r: %s', field_cls, e) return ''.join(s)
def shutdown(self): # We have to put the TestingDone field back before we shut down # in order to get the instance back to its original state. main_fieldset = get_review_request_fieldset('main') if not get_review_request_field('testing_done'): main_fieldset.add_field(TestingDoneField) info_fieldset = get_review_request_fieldset('info') if not get_review_request_field('branch'): info_fieldset.add_field(BranchField) if not get_review_request_field('depends_on'): info_fieldset.add_field(DependsOnField) if not get_review_request_field('blocks'): info_fieldset.add_field(BlocksField) super(MozReviewExtension, self).shutdown()
def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] request = context.get('request') if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: try: field = field_cls(review_request_details, request=request) except Exception as e: logging.exception('Error instantiating field %r: %s', field_cls, e) continue if field.should_render: context.push() context['field'] = field s.append(nodelist.render(context)) context.pop() return mark_safe(''.join(s))
def shutdown(self): super(ReviewRequestFieldsHook, self).shutdown() fieldset = get_review_request_fieldset(self.fieldset_id) for field_cls in self.fields: fieldset.remove_field(field_cls)
def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] request = context.get("request") if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: try: field = field_cls(review_request_details, request=request) except Exception as e: logging.error("Error instantiating ReviewRequestFieldset %r: %s", field_cls, e, exc_info=1) try: if field.should_render(field.value): context.push() context["field"] = field s.append(nodelist.render(context)) context.pop() except Exception as e: logging.error("Error running should_render for " "ReviewRequestFieldset %r: %s", field_cls, e, exc_info=1) return "".join(s)
def shutdown(self): # We have to put the TestingDone field back before we shut down # in order to get the instance back to its original state. fieldset = get_review_request_fieldset('main') field = get_review_request_field('testing_done') if not field: fieldset.add_field(TestingDoneField)
def test_publish_with_custom_fields(self): """Testing ReviewRequestDraft.publish with custom fields propagating from draft to review request """ class RichField(BaseTextAreaField): field_id = 'rich_field' class SpecialRichField(BaseTextAreaField): # Exercise special case field name 'text' field_id = 'text' class BasicField(BaseEditableField): field_id = 'basic_field' fieldset = get_review_request_fieldset('main') fieldset.add_field(RichField) fieldset.add_field(SpecialRichField) fieldset.add_field(BasicField) try: draft = self._get_draft() review_request = draft.review_request draft.description = 'New description' draft.extra_data['rich_field'] = '**Rich custom text**' draft.extra_data['rich_field_text_type'] = 'markdown' draft.extra_data['text'] = 'Nothing special' draft.extra_data['text_type'] = 'plain' draft.extra_data['basic_field'] = 'Basic text' draft.target_people.add(review_request.submitter) draft.publish() self.assertNotIn('description_text_type', review_request.extra_data) self.assertIn('rich_field', review_request.extra_data) self.assertIn('rich_field_text_type', review_request.extra_data) self.assertIn('text', review_request.extra_data) self.assertIn('text_type', review_request.extra_data) self.assertIn('basic_field', review_request.extra_data) self.assertNotIn('basic_field_text_type', review_request.extra_data) self.assertEqual(review_request.description, draft.description) self.assertEqual(review_request.extra_data['rich_field'], draft.extra_data['rich_field']) self.assertEqual(review_request.extra_data['rich_field_text_type'], draft.extra_data['rich_field_text_type']) self.assertEqual(review_request.extra_data['text'], draft.extra_data['text']) self.assertEqual(review_request.extra_data['text_type'], draft.extra_data['text_type']) self.assertEqual(review_request.extra_data['basic_field'], draft.extra_data['basic_field']) finally: fieldset.remove_field(RichField) fieldset.remove_field(SpecialRichField) fieldset.remove_field(BasicField)
def test_publish_with_custom_fields(self): """Testing ReviewRequestDraft.publish with custom fields propagating from draft to review request """ class RichField(BaseTextAreaField): field_id = 'rich_field' class SpecialRichField(BaseTextAreaField): # Exercise special case field name 'text' field_id = 'text' class BasicField(BaseEditableField): field_id = 'basic_field' fieldset = get_review_request_fieldset('main') fieldset.add_field(RichField) fieldset.add_field(SpecialRichField) fieldset.add_field(BasicField) try: draft = self._get_draft() review_request = draft.review_request draft.description = 'New description' draft.extra_data['rich_field'] = '**Rich custom text**' draft.extra_data['rich_field_text_type'] = 'markdown' draft.extra_data['text'] = 'Nothing special' draft.extra_data['text_type'] = 'plain' draft.extra_data['basic_field'] = 'Basic text' draft.target_people.add(review_request.submitter) draft.publish() self.assertNotIn('description_text_type', review_request.extra_data) self.assertIn('rich_field', review_request.extra_data) self.assertIn('rich_field_text_type', review_request.extra_data) self.assertIn('text', review_request.extra_data) self.assertIn('text_type', review_request.extra_data) self.assertIn('basic_field', review_request.extra_data) self.assertNotIn('basic_field_text_type', review_request.extra_data) self.assertEqual(review_request.description, draft.description) self.assertEqual(review_request.extra_data['rich_field'], draft.extra_data['rich_field']) self.assertEqual(review_request.extra_data['rich_field_text_type'], draft.extra_data['rich_field_text_type']) self.assertEqual(review_request.extra_data['text'], draft.extra_data['text']) self.assertEqual(review_request.extra_data['text_type'], draft.extra_data['text_type']) self.assertEqual(review_request.extra_data['basic_field'], draft.extra_data['basic_field']) finally: fieldset.remove_field(RichField) fieldset.remove_field(SpecialRichField) fieldset.remove_field(BasicField)
def shutdown(self): # We have to put the TestingDone field back before we shut down # in order to get the instance back to its original state. main_fieldset = get_review_request_fieldset('main') testing_done_field = get_review_request_field('testing_done') if not testing_done_field: main_fieldset.add_field(TestingDoneField) super(MozReviewExtension, self).shutdown()
def __init__(self, extension, fieldset_id, fields): super(ReviewRequestFieldsHook, self).__init__(extension) self.fieldset_id = fieldset_id self.fields = fields fieldset = get_review_request_fieldset(fieldset_id) for field_cls in fields: fieldset.add_field(field_cls)
def __init__(self, extension, fieldset_id, fields): super(ReviewRequestFieldsHook, self).__init__(extension) self.fieldset_id = fieldset_id self.fields = fields fieldset = get_review_request_fieldset(fieldset_id) for field_cls in fields: fieldset.add_field(field_cls)
def shutdown(self): # Restore the built-in opcode generator. set_diff_opcode_generator_class(self.original_opcode_generator) # We have to put the TestingDone field back before we shut down # in order to get the instance back to its original state. main_fieldset = get_review_request_fieldset('main') if not get_review_request_field('testing_done'): main_fieldset.add_field(TestingDoneField) info_fieldset = get_review_request_fieldset('info') if not get_review_request_field('branch'): info_fieldset.add_field(BranchField) if not get_review_request_field('depends_on'): info_fieldset.add_field(DependsOnField) if not get_review_request_field('blocks'): info_fieldset.add_field(BlocksField) super(MozReviewExtension, self).shutdown()
def _test_put_with_text_types(self, text_type_field, text_type_value, expected_change_text_type, expected_description_text_type, expected_testing_done_text_type, expected_custom_field_text_type): text = '`This` is a **test**' class CustomField(BaseTextAreaField): field_id = 'mytext' fieldset = get_review_request_fieldset('main') fieldset.add_field(CustomField) try: review_request = self.create_review_request(submitter=self.user, publish=True) rsp = self.api_put( get_review_request_draft_url(review_request), { 'changedescription': text, 'description': text, 'testing_done': text, 'extra_data.mytext': text, text_type_field: text_type_value, }, expected_mimetype=review_request_draft_item_mimetype) self.assertEqual(rsp['stat'], 'ok') draft_rsp = rsp['draft'] extra_data = draft_rsp['extra_data'] self.assertEqual(draft_rsp['changedescription'], text) self.assertEqual(draft_rsp['description'], text) self.assertEqual(draft_rsp['testing_done'], text) self.assertEqual(extra_data['mytext'], text) self.assertEqual(draft_rsp['changedescription_text_type'], expected_change_text_type) self.assertEqual(draft_rsp['description_text_type'], expected_description_text_type) self.assertEqual(draft_rsp['testing_done_text_type'], expected_testing_done_text_type) self.assertEqual(extra_data['mytext_text_type'], expected_custom_field_text_type) draft = ReviewRequestDraft.objects.get(pk=rsp['draft']['id']) self.compare_item(draft_rsp, draft) finally: fieldset.remove_field(CustomField)
def _test_put_with_text_types(self, text_type_field, text_type_value, expected_change_text_type, expected_description_text_type, expected_testing_done_text_type, expected_custom_field_text_type): text = '`This` is a **test**' class CustomField(BaseTextAreaField): field_id = 'mytext' fieldset = get_review_request_fieldset('main') fieldset.add_field(CustomField) try: review_request = self.create_review_request(submitter=self.user, publish=True) rsp = self.api_put( get_review_request_draft_url(review_request), { 'changedescription': text, 'description': text, 'testing_done': text, 'extra_data.mytext': text, text_type_field: text_type_value, }, expected_mimetype=review_request_draft_item_mimetype) self.assertEqual(rsp['stat'], 'ok') draft_rsp = rsp['draft'] extra_data = draft_rsp['extra_data'] self.assertEqual(draft_rsp['changedescription'], text) self.assertEqual(draft_rsp['description'], text) self.assertEqual(draft_rsp['testing_done'], text) self.assertEqual(extra_data['mytext'], text) self.assertEqual(draft_rsp['changedescription_text_type'], expected_change_text_type) self.assertEqual(draft_rsp['description_text_type'], expected_description_text_type) self.assertEqual(draft_rsp['testing_done_text_type'], expected_testing_done_text_type) self.assertEqual(extra_data['mytext_text_type'], expected_custom_field_text_type) draft = ReviewRequestDraft.objects.get(pk=rsp['draft']['id']) self.compare_item(draft_rsp, draft) finally: fieldset.remove_field(CustomField)
def initialize(self): # Start by hiding the Testing Done field in all review requests, since # Mozilla developers will not be using it. fieldset = get_review_request_fieldset('main') field = get_review_request_field('testing_done') if (field): fieldset.remove_field(field) # All of our review request styling is injected via review-stylings-css, # which in turn loads the review.css static bundle. TemplateHook(self, 'base-css', 'rbmozui/review-stylings-css.html', apply_to=review_request_url_names) TemplateHook(self, 'base-css', 'rbmozui/viewdiff-stylings-css.html', apply_to=diffviewer_url_names) TemplateHook(self, 'base-before-content', 'rbmozui/review-header.html', apply_to=review_request_url_names) TemplateHook(self, 'base-scripts-post', 'rbmozui/review-header-workaround.html', apply_to=review_request_url_names)
def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] request = context.get('request') if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: try: field = field_cls(review_request_details, request=request) except Exception as e: logging.exception('Error instantiating field %r: %s', field_cls, e) continue if hasattr(field_cls.should_render, '__call__'): warnings.warn('Field %r uses an old style should_render function ' 'which is deprecated and will be removed in the ' 'future. This should be converted to a property.' % field_cls, RemovedInReviewBoard40Warning) try: should_render = field.should_render(field.value) except Exception as e: logging.exception( 'Error running should_render for field %r: %s', field_cls, e) should_render = True else: should_render = field.should_render if should_render: context.push() context['field'] = field s.append(nodelist.render(context)) context.pop() return ''.join(s)
def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] request = context.get('request') if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: try: field = field_cls(review_request_details, request=request) except Exception as e: logging.exception('Error instantiating field %r: %s', field_cls, e) continue if hasattr(field_cls.should_render, '__call__'): warnings.warn('Field %r uses an old style should_render function ' 'which is deprecated and will be removed in the ' 'future. This should be converted to a property.' % field_cls, DeprecationWarning) try: should_render = field.should_render(field.value) except Exception as e: logging.exception( 'Error running should_render for field %r: %s', field_cls, e) should_render = True else: should_render = field.should_render if should_render: context.push() context['field'] = field s.append(nodelist.render(context)) context.pop() return ''.join(s)
def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: field = field_cls(review_request_details) if field.should_render(field.value): context.push() context['field'] = field s.append(nodelist.render(context)) context.pop() return ''.join(s)
def for_review_request_field(context, nodelist, review_request_details, fieldset): """Loops through all fields in a fieldset. This can take a fieldset instance or a fieldset ID. """ s = [] if isinstance(fieldset, six.text_type): fieldset = get_review_request_fieldset(fieldset) for field_cls in fieldset.field_classes: field = field_cls(review_request_details) if field.should_render(field.value): context.push() context['field'] = field s.append(nodelist.render(context)) context.pop() return ''.join(s)
def shutdown(self): fieldset = get_review_request_fieldset(self.fieldset_id) for field_cls in self.fields: fieldset.remove_field(field_cls)
def initialize(self): initialize_pulse_handlers(self) URLHook(self, patterns('', url(r'^mozreview/', include('mozreview.urls')))) HeaderDropdownActionHook(self, actions=[{ 'label': 'MozReview', 'items': [ { 'label': 'User Guide', 'url': 'https://mozilla-version-control-tools.readthedocs.org/en/latest/mozreview-user.html', }, { 'label': 'Mercurial for Mozillians', 'url': 'https://mozilla-version-control-tools.readthedocs.org/en/latest/hgmozilla/index.html', }, { 'label': 'Hacking MozReview', 'url': 'https://mozilla-version-control-tools.readthedocs.org/en/latest/hacking-mozreview.html', }, { 'label': 'File a Bug', 'url': 'https://bugzilla.mozilla.org/enter_bug.cgi?product=Developer%20Services&component=MozReview', }, ], }]) ReviewRequestDropdownActionHook(self, actions=[ { 'label': 'Automation', 'id': 'automation-menu', 'items': [ { 'id': 'autoland-try-trigger', 'label': 'Trigger a Try Build', 'url': '#', }, { 'id': 'autoland-trigger', 'label': 'Land Commits', 'url': '#', }, ], }, ]) # Hide fields from all review requests that are not used by Mozilla # developers. main_fieldset = get_review_request_fieldset('main') testing_done_field = get_review_request_field('testing_done') if testing_done_field: main_fieldset.remove_field(testing_done_field) info_fieldset = get_review_request_fieldset('info') for field_name in ('branch', 'depends_on', 'blocks'): field = get_review_request_field(field_name) if field: info_fieldset.remove_field(field) # We "monkey patch" (yes, I feel dirty) the should_render method on # the description field so that it is not rendered for parent review # requests. description_field = get_review_request_field('description') if description_field: description_field.should_render = (lambda self, value: not is_parent(self.review_request_details)) # All of our review request styling is injected via # review-stylings-css, which in turn loads the review.css static # bundle. TemplateHook(self, 'base-css', 'mozreview/review-stylings-css.html', apply_to=review_request_url_names) TemplateHook(self, 'base-css', 'mozreview/viewdiff-stylings-css.html', apply_to=diffviewer_url_names) TemplateHook(self, 'base-scripts-post', 'mozreview/review-scripts-js.html', apply_to=review_request_url_names) TemplateHook(self, 'base-extrahead', 'mozreview/base-extrahead-login-form.html', apply_to=['login']) TemplateHook(self, 'before-login-form', 'mozreview/before-login-form.html', apply_to=['login']) TemplateHook(self, 'after-login-form', 'mozreview/after-login-form.html', apply_to=['login']) TemplateHook(self, 'base-after-content', 'mozreview/scm_level.html') TemplateHook(self, 'base-after-content', 'mozreview/repository.html') ReviewRequestFieldsHook(self, 'main', [CommitsListField]) # This forces the Commits field to be the top item. main_fieldset.field_classes.insert(0, main_fieldset.field_classes.pop()) # The above hack forced Commits at the top, but the rest of these # fields are fine below the Description. ReviewRequestFieldsHook(self, 'main', [CombinedReviewersField]) ReviewRequestFieldsHook(self, 'main', [TryField]) ReviewRequestFieldsHook(self, 'main', [BaseCommitField]) ReviewRequestFieldsHook(self, 'main', [FileDiffReviewerField]) # We want pull to appear first as it is the more robust way of # retrieving changesets. ReviewRequestFieldsHook(self, 'info', [PullCommitField]) ReviewRequestFieldsHook(self, 'info', [ImportCommitField]) # Use a custom method to calculate a review approval state. MozReviewApprovalHook(self) SignalHook(self, post_save, self.on_draft_changed, sender=ReviewRequestDraft) HostingServiceHook(self, HMORepository) URLHook(self, patterns('', url(r'^import-pullrequest/(?P<user>.+)/(?P<repo>.+)/(?P<pullrequest>\d+)/$', import_pullrequest, name='import_pullrequest')))
def _test_get_with_custom_and_force(self, source_text, rich_text, force_text_type, expected_text, custom_field_supports_markdown): """Helper function to test custom fields and ``?include-text-types=``. This will test GET requests of custom text fields in two alternative formats (one fixed as ``raw`` and the other controlled by ``force_text_type``) via the ``?include-text-types=`` query parameter. Args: source_text (unicode): Text to use as source data for fields being tested. rich_text (bool): Whether ``source_text`` is rich text. force_text_type (unicode): Value for ``?force-text-type=`` query parameter. Should be one of: ``plain``, ``markdown`` or ``html``. expected_text (unicode): Expected resultant text after forcing ``source_text`` to requested format. custom_field_supports_markdown (bool) Whether custom field being tested should enable markdown support. """ # Exercise custom fields that support markdown (BaseTextAreaField) and # those that don't (BaseEditableField). Fields that don't support # markdown do not get serialized into # <text_type>_text_fields.extra_data. if custom_field_supports_markdown: base = BaseTextAreaField else: base = BaseEditableField class CustomField(base): # Utilize "text" as the field_id because it is a special case and # results in a text type field named "text_type". field_id = 'text' fieldset = get_review_request_fieldset('main') fieldset.add_field(CustomField) try: url, mimetype, draft = \ self.setup_basic_get_test(self.user, False, None) source_text_type = "markdown" if rich_text else "plain" draft.description = source_text draft.description_rich_text = rich_text draft.extra_data['text'] = source_text if custom_field_supports_markdown: draft.extra_data['text_type'] = source_text_type draft.save() rsp = self.api_get(url + '?force-text-type=%s' % force_text_type, expected_mimetype=mimetype) self.assertEqual(rsp['stat'], 'ok') self.assertIn(self.resource.item_result_key, rsp) draft_rsp = rsp[self.resource.item_result_key] self.assertIn('extra_data', draft_rsp) extra_data = draft_rsp['extra_data'] self.assertEqual(draft_rsp['description_text_type'], force_text_type) self.assertEqual(draft_rsp['description'], expected_text) self.assertNotIn('raw_text_fields', draft_rsp) if custom_field_supports_markdown: # Ensure the name of the text_type field has not been # formulated incorrectly, since "text" is a special name, and # thus we expect "text_type" not "text_text_type". self.assertNotIn('text_text_type', extra_data) self.assertEqual(extra_data['text'], expected_text) self.assertEqual(extra_data['text_type'], force_text_type) else: self.assertEqual(extra_data['text'], source_text) self.assertNotIn('text_type', extra_data) # Exercise including multiple text types via a CSV list. rsp = self.api_get( '%s?force-text-type=%s&include-text-types=raw,%s' % (url, force_text_type, force_text_type), expected_mimetype=mimetype) self.assertEqual(rsp['stat'], 'ok') draft_rsp = rsp[self.resource.item_result_key] self.assertIn('raw_text_fields', draft_rsp) raw_text_fields = draft_rsp['raw_text_fields'] self.assertEqual(raw_text_fields['description'], source_text) self.assertEqual(raw_text_fields['description_text_type'], source_text_type) other_field_name = '%s_text_fields' % force_text_type self.assertIn(other_field_name, draft_rsp) other_text_fields = draft_rsp[other_field_name] self.assertEqual(other_text_fields['description'], expected_text) self.assertEqual(other_text_fields['description_text_type'], force_text_type) if custom_field_supports_markdown: self.assertIn('extra_data', raw_text_fields) extra_data_raw = raw_text_fields['extra_data'] self.assertEqual(extra_data_raw['text'], source_text) self.assertEqual(extra_data_raw['text_type'], source_text_type) self.assertIn('extra_data', other_text_fields) extra_data_other = other_text_fields['extra_data'] self.assertEqual(extra_data_other['text'], expected_text) self.assertEqual(extra_data_other['text_type'], force_text_type) else: self.assertNotIn('extra_data', raw_text_fields) self.assertNotIn('extra_data', other_text_fields) finally: fieldset.remove_field(CustomField)
def initialize(self): AuthBackendHook(self, BugzillaBackend) self.original_opcode_generator = get_diff_opcode_generator_class() set_diff_opcode_generator_class(NoFilterDiffOpcodeGenerator) initialize_pulse_handlers(self) URLHook(self, patterns('', url(r'^mozreview/', include('mozreview.urls')))) HeaderDropdownActionHook( self, actions=[{ 'id': 'nav-mozreview-menu', 'label': 'MozReview', 'items': [ { 'label': 'User Guide', 'url': 'https://mozilla-version-control-tools.readthedocs.io/en/latest/mozreview-user.html', }, { 'label': 'Mercurial for Mozillians', 'url': 'https://mozilla-version-control-tools.readthedocs.io/en/latest/hgmozilla/index.html', }, { 'label': 'Hacking MozReview', 'url': 'https://mozilla-version-control-tools.readthedocs.io/en/latest/hacking-mozreview.html', }, { 'label': 'File a Bug', 'url': 'https://bugzilla.mozilla.org/enter_bug.cgi?product=MozReview&component=General', }, ], }]) review_request_dropdown_actions = [ { 'label': 'Automation', 'id': 'automation-menu', 'items': [ { 'id': 'autoland-try-trigger', 'label': 'Trigger a Try Build', 'url': '#', }, { 'id': 'autoland-trigger', 'label': 'Land Commits', 'url': '#', }, ], }, ] ReviewRequestDropdownActionHook( self, actions=review_request_dropdown_actions) DiffViewerDropdownActionHook(self, actions=review_request_dropdown_actions) # Hide fields from all review requests that are not used by Mozilla # developers. main_fieldset = get_review_request_fieldset('main') testing_done_field = get_review_request_field('testing_done') if testing_done_field: main_fieldset.remove_field(testing_done_field) info_fieldset = get_review_request_fieldset('info') for field_name in ('branch', 'depends_on', 'blocks'): field = get_review_request_field(field_name) if field: info_fieldset.remove_field(field) # We "monkey patch" (yes, I feel dirty) the should_render method on # the description field so that it is not rendered description_field = get_review_request_field('description') if description_field: self.old_desc_should_render = description_field.should_render description_field.should_render = lambda self, value: False # All of our review request styling is injected via # review-stylings-css, which in turn loads the review.css static # bundle. TemplateHook(self, 'base-css', 'mozreview/review-stylings-css.html', apply_to=review_request_url_names) TemplateHook(self, 'base-css', 'mozreview/viewdiff-stylings-css.html', apply_to=diffviewer_url_names) TemplateHook( self, 'base-css', 'mozreview/admin-stylings-css.html', apply_to=['reviewboard.extensions.views.configure_extension']) TemplateHook(self, 'base-scripts-post', 'mozreview/review-scripts-js.html', apply_to=review_request_url_names) TemplateHook(self, 'base-extrahead', 'mozreview/base-extrahead-login-form.html', apply_to=['login']) TemplateHook(self, 'before-login-form', 'mozreview/before-login-form.html', apply_to=['login']) TemplateHook(self, 'after-login-form', 'mozreview/after-login-form.html', apply_to=['login']) TemplateHook(self, 'base-after-content', 'mozreview/user-data.html') TemplateHook(self, 'base-after-content', 'mozreview/repository.html') TemplateHook(self, 'base-after-content', 'mozreview/user_review_flag.html', apply_to=review_request_url_names) TemplateHook(self, 'base-after-content', 'mozreview/diff-data.html', apply_to=diffviewer_url_names) TemplateHook(self, 'review-summary-body', 'mozreview/review_summary_flag_info.html') ReviewRequestFieldsHook(self, 'main', [CommitsListField]) ReviewRequestFieldsHook(self, 'main', [CommitDetailField]) CommitContextTemplateHook(self, 'mozreview-pre-review-request-box', 'mozreview/commits.html', apply_to=review_request_url_names) # The above hack forced Commits at the top, but the rest of these # fields are fine below the Description. ReviewRequestFieldsHook(self, 'main', [CombinedReviewersField]) ReviewRequestFieldsHook(self, 'main', [TryField]) ReviewRequestFieldsHook(self, 'main', [BaseCommitField]) ReviewRequestFieldsHook(self, 'main', [FileDiffReviewerField]) ReviewRequestFieldsHook(self, 'info', [CommitAuthorField]) # Use a custom method to calculate a review approval state. MozReviewApprovalHook(self) # Instantiate the various signal handlers initialize_signal_handlers(self) HostingServiceHook(self, HMORepository) HostingServiceHook(self, BMOBugTracker)