/reviewboard/reviews/admin.py

https://github.com/Terhands/reviewboard · Python · 226 lines · 190 code · 36 blank · 0 comment · 6 complexity · 45bd53a1d44bb83cd3115f9e1f11b92b MD5 · raw file

  1. from django.contrib import admin
  2. from django.utils.translation import ugettext_lazy as _
  3. from reviewboard.reviews.forms import DefaultReviewerForm, GroupForm
  4. from reviewboard.reviews.models import Comment, DefaultReviewer, Group, \
  5. Review, ReviewRequest, \
  6. ReviewRequestDraft, Screenshot, \
  7. ScreenshotComment
  8. class CommentAdmin(admin.ModelAdmin):
  9. list_display = ('truncate_text', 'review_request_id', 'first_line',
  10. 'num_lines', 'timestamp')
  11. search_fields = ['text']
  12. list_filter = ('timestamp',)
  13. raw_id_fields = ('filediff', 'interfilediff', 'reply_to')
  14. ordering = ['-timestamp']
  15. def review_request_id(self, obj):
  16. return obj.review.get().review_request.display_id
  17. review_request_id.short_description = _('Review request ID')
  18. class DefaultReviewerAdmin(admin.ModelAdmin):
  19. form = DefaultReviewerForm
  20. filter_horizontal = ('repository', 'groups', 'people',)
  21. fieldsets = (
  22. (_('General Information'), {
  23. 'fields': ('name', 'file_regex', 'local_site'),
  24. 'classes': ['wide'],
  25. }),
  26. (_('Reviewers'), {
  27. 'fields': ('groups', 'people'),
  28. }),
  29. (_('Repositories'), {
  30. 'description': _('<p>A default reviewer will cover all '
  31. 'repositories, unless assigned one or more '
  32. 'specific repositories below.</p>'),
  33. 'fields': ('repository',),
  34. })
  35. )
  36. list_display = ('name', 'file_regex')
  37. class GroupAdmin(admin.ModelAdmin):
  38. form = GroupForm
  39. list_display = ('name', 'display_name', 'mailing_list', 'invite_only',
  40. 'visible')
  41. filter_horizontal = ('users',)
  42. fieldsets = (
  43. (_('General Information'), {
  44. 'fields': ('name', 'display_name', 'mailing_list',
  45. 'visible'),
  46. }),
  47. (_('Access Control'), {
  48. 'fields': ('invite_only', 'users', 'local_site'),
  49. }),
  50. (_('State'), {
  51. 'fields': ('incoming_request_count',),
  52. 'classes': ('collapse',),
  53. }),
  54. )
  55. class ReviewAdmin(admin.ModelAdmin):
  56. list_display = ('review_request', 'user', 'public', 'ship_it',
  57. 'is_reply', 'timestamp')
  58. list_filter = ('public', 'timestamp')
  59. search_fields = ['review_request__summary']
  60. raw_id_fields = ('review_request', 'user', 'base_reply_to',
  61. 'body_top_reply_to', 'body_bottom_reply_to',
  62. 'comments', 'screenshot_comments',
  63. 'reviewed_diffset')
  64. fieldsets = (
  65. (_('General Information'), {
  66. 'fields': ('user', 'review_request', 'public', 'ship_it',
  67. 'body_top', 'body_bottom'),
  68. }),
  69. (_('Related Objects'), {
  70. 'fields': ('base_reply_to',
  71. 'body_top_reply_to',
  72. 'body_bottom_reply_to',
  73. 'comments',
  74. 'screenshot_comments'),
  75. 'classes': ('collapse',)
  76. }),
  77. (_('State'), {
  78. 'fields': ('email_message_id', 'time_emailed'),
  79. 'classes': ('collapse',)
  80. })
  81. )
  82. class ReviewRequestAdmin(admin.ModelAdmin):
  83. list_display = ('summary', 'submitter', 'status', 'public', 'last_updated')
  84. list_filter = ('public', 'status', 'time_added', 'last_updated',
  85. 'repository')
  86. search_fields = ['summary']
  87. raw_id_fields = ('submitter', 'diffset_history', 'screenshots',
  88. 'inactive_screenshots', 'changedescs')
  89. filter_horizontal = ('target_people', 'target_groups')
  90. fieldsets = (
  91. (_('General Information'), {
  92. 'fields': ('submitter', 'public', 'status',
  93. 'summary', 'description', 'testing_done',
  94. 'bugs_closed', 'repository', 'branch', 'changenum',
  95. 'time_added')
  96. }),
  97. (_('Reviewers'), {
  98. 'fields': ('target_people', 'target_groups'),
  99. }),
  100. (_('Related Objects'), {
  101. 'fields': ('screenshots', 'inactive_screenshots', 'changedescs',
  102. 'diffset_history', 'local_site'),
  103. 'classes': ['collapse'],
  104. }),
  105. (_('State'), {
  106. 'description': _('<p>This is advanced state that should not be '
  107. 'modified unless something is wrong.</p>'),
  108. 'fields': ('email_message_id', 'time_emailed',
  109. 'last_review_timestamp', 'shipit_count', 'local_id'),
  110. 'classes': ['collapse'],
  111. }),
  112. )
  113. actions = [
  114. 'close_submitted',
  115. 'close_discarded',
  116. 'reopen',
  117. ]
  118. def close_submitted(self, request, queryset):
  119. rows_updated = queryset.update(status=ReviewRequest.SUBMITTED)
  120. if rows_updated == 1:
  121. msg = '1 review request was closed as submitted.'
  122. else:
  123. msg = '%s review requests were closed as submitted.' % \
  124. rows_updated
  125. self.message_user(request, msg)
  126. close_submitted.short_description = \
  127. _("Close selected review requests as submitted")
  128. def close_discarded(self, request, queryset):
  129. rows_updated = queryset.update(status=ReviewRequest.DISCARDED)
  130. if rows_updated == 1:
  131. msg = '1 review request was closed as discarded.'
  132. else:
  133. msg = '%s review requests were closed as discarded.' % \
  134. rows_updated
  135. self.message_user(request, msg)
  136. close_discarded.short_description = \
  137. _("Close selected review requests as discarded")
  138. def reopen(self, request, queryset):
  139. rows_updated = queryset.update(status=ReviewRequest.PENDING_REVIEW)
  140. if rows_updated == 1:
  141. msg = '1 review request was reopened.'
  142. else:
  143. msg = '%s review requests were reopened.' % rows_updated
  144. self.message_user(request, msg)
  145. reopen.short_description = _("Reopen selected review requests")
  146. class ReviewRequestDraftAdmin(admin.ModelAdmin):
  147. list_display = ('summary', 'submitter', 'last_updated')
  148. list_filter = ('last_updated',)
  149. search_fields = ['summary']
  150. raw_id_fields = ('review_request', 'diffset', 'screenshots',
  151. 'inactive_screenshots', 'changedesc')
  152. filter_horizontal = ('target_people', 'target_groups')
  153. fieldsets = (
  154. (_('General Information'), {
  155. 'fields': ('review_request',
  156. 'summary', 'description', 'testing_done',
  157. 'bugs_closed', 'branch'),
  158. }),
  159. (_('Reviewers'), {
  160. 'fields': ('target_people', 'target_groups'),
  161. }),
  162. (_('Related Objects'), {
  163. 'fields': ('screenshots', 'inactive_screenshots', 'changedesc',
  164. 'diffset'),
  165. 'classes': ['collapse'],
  166. }),
  167. )
  168. class ScreenshotAdmin(admin.ModelAdmin):
  169. list_display = ('thumb', 'caption', 'image', 'review_request_id')
  170. list_display_links = ('thumb', 'caption')
  171. search_fields = ('caption',)
  172. def review_request_id(self, obj):
  173. return obj.review_request.get().id
  174. review_request_id.short_description = _('Review request ID')
  175. class ScreenshotCommentAdmin(admin.ModelAdmin):
  176. list_display = ('text', 'screenshot', 'review_request_id', 'timestamp')
  177. list_filter = ('timestamp',)
  178. search_fields = ['caption']
  179. raw_id_fields = ('screenshot', 'reply_to')
  180. def review_request_id(self, obj):
  181. return obj.review.get().review_request.id
  182. review_request_id.short_description = _('Review request ID')
  183. admin.site.register(Comment, CommentAdmin)
  184. admin.site.register(DefaultReviewer, DefaultReviewerAdmin)
  185. admin.site.register(Group, GroupAdmin)
  186. admin.site.register(Review, ReviewAdmin)
  187. admin.site.register(ReviewRequest, ReviewRequestAdmin)
  188. admin.site.register(ReviewRequestDraft, ReviewRequestDraftAdmin)
  189. admin.site.register(Screenshot, ScreenshotAdmin)
  190. admin.site.register(ScreenshotComment, ScreenshotCommentAdmin)