admin.py 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. from django.contrib import admin
  2. from django.core import urlresolvers
  3. from django.db.models import Q
  4. from relatedwidget import RelatedWidgetWrapperBase
  5. from corpus.models import (
  6. IEDocument, IEDocumentMetadata, Entity, EntityKind, Relation,
  7. EntityOccurrence, GazetteItem
  8. )
  9. admin.site.site_header = 'IEPY administration'
  10. admin.site.site_title = 'IEPY'
  11. admin.site.index_title = 'IEPY'
  12. @admin.register(EntityKind)
  13. class EntityKindAdmin(admin.ModelAdmin):
  14. pass
  15. @admin.register(EntityOccurrence)
  16. class EntityOccurrenceAdmin(admin.ModelAdmin):
  17. pass
  18. @admin.register(Entity)
  19. class EntityAdmin(admin.ModelAdmin):
  20. list_per_page = 20
  21. @admin.register(IEDocumentMetadata)
  22. class IEDocumentMetadataAdmin(admin.ModelAdmin):
  23. def has_delete_permission(self, request, obj=None):
  24. return False
  25. @admin.register(IEDocument)
  26. class IEDocumentAdmin(RelatedWidgetWrapperBase, admin.ModelAdmin):
  27. change_form_template = 'relatives/change_form.html'
  28. list_display = ['id', 'human_identifier', 'link_to_document_navigation']
  29. search_fields = ['text']
  30. fieldsets = [
  31. (None, {'fields': ['human_identifier', 'text', 'metadata']}),
  32. ('Preprocess output',
  33. {'classes': ['collapse'],
  34. 'fields': ['tokens', 'offsets_to_text', 'tokenization_done_at',
  35. 'sentences', 'sentencer_done_at',
  36. 'lemmas', 'lemmatization_done_at',
  37. 'postags', 'tagging_done_at',
  38. 'ner_done_at', 'segmentation_done_at', 'syntactic_parsing_done_at'],
  39. })]
  40. def get_form(self, request, obj=None, **kwargs):
  41. form = super().get_form(request, obj, **kwargs)
  42. metadata_field = form.base_fields['metadata']
  43. if obj is None:
  44. metadata_field.queryset = metadata_field.queryset.filter(
  45. document__isnull=True)
  46. # let's make this field not required during creating.
  47. # This means that on save_model we'll create an empty metadata obj if needed
  48. metadata_field.required = False
  49. else:
  50. metadata_field.queryset = metadata_field.queryset.filter(
  51. Q(document__id=obj.id) | Q(document__isnull=True))
  52. return form
  53. def save_model(self, request, obj, form, change):
  54. if obj.id is None and not change: # ie, creation
  55. try:
  56. obj.metadata
  57. except IEDocumentMetadata.DoesNotExist:
  58. obj.metadata = IEDocumentMetadata.objects.create()
  59. return super().save_model(request, obj, form, change)
  60. def link_to_document_navigation(self, obj):
  61. return '<a href="{0}">Rich View</a>'.format(
  62. urlresolvers.reverse('corpus:navigate_document', args=(obj.id,))
  63. )
  64. link_to_document_navigation.short_description = 'Rich View'
  65. link_to_document_navigation.allow_tags = True
  66. list_per_page = 20
  67. @admin.register(Relation)
  68. class RelationAdmin(admin.ModelAdmin):
  69. list_display = ('name', 'left_entity_kind', 'right_entity_kind', 'link_to_label')
  70. def link_to_label(self, obj):
  71. return '<a href="{0}">Label evidence</a>'.format(
  72. urlresolvers.reverse('corpus:next_document_to_label', args=(obj.id,))
  73. )
  74. link_to_label.short_description = 'Labeling'
  75. link_to_label.allow_tags = True
  76. def get_readonly_fields(self, request, obj=None):
  77. if obj: # editing an existing object
  78. return self.readonly_fields + ('left_entity_kind', 'right_entity_kind')
  79. return self.readonly_fields
  80. @admin.register(GazetteItem)
  81. class GazetteAdmin(admin.ModelAdmin):
  82. search_fields = ['text']
  83. list_display = ('text', 'kind', 'from_freebase',)
  84. list_filter = ('kind', 'from_freebase',)
  85. readonly_fields = ('from_freebase', )