Development of an internal social media platform with personalised dashboards for students
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

admin.py 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django import forms
  4. from django.db import models
  5. from django.contrib import admin
  6. from django.conf import settings
  7. from django.forms.widgets import TextInput
  8. from django.utils import six
  9. from django.utils.text import Truncator
  10. from django.utils.translation import ugettext_lazy as _
  11. from .fields import CommaSeparatedEmailField
  12. from .models import Attachment, Log, Email, EmailTemplate, STATUS
  13. def get_message_preview(instance):
  14. return (u'{0}...'.format(instance.message[:25]) if len(instance.message) > 25
  15. else instance.message)
  16. get_message_preview.short_description = 'Message'
  17. class LogInline(admin.StackedInline):
  18. model = Log
  19. extra = 0
  20. class CommaSeparatedEmailWidget(TextInput):
  21. def __init__(self, *args, **kwargs):
  22. super(CommaSeparatedEmailWidget, self).__init__(*args, **kwargs)
  23. self.attrs.update({'class': 'vTextField'})
  24. def _format_value(self, value):
  25. # If the value is a string wrap it in a list so it does not get sliced.
  26. if not value:
  27. return ''
  28. if isinstance(value, six.string_types):
  29. value = [value, ]
  30. return ','.join([item for item in value])
  31. def requeue(modeladmin, request, queryset):
  32. """An admin action to requeue emails."""
  33. queryset.update(status=STATUS.queued)
  34. requeue.short_description = 'Requeue selected emails'
  35. class EmailAdmin(admin.ModelAdmin):
  36. list_display = ('id', 'to_display', 'subject', 'template',
  37. 'status', 'last_updated')
  38. search_fields = ['to', 'subject']
  39. date_hierarchy = 'last_updated'
  40. inlines = [LogInline]
  41. list_filter = ['status']
  42. formfield_overrides = {
  43. CommaSeparatedEmailField: {'widget': CommaSeparatedEmailWidget}
  44. }
  45. actions = [requeue]
  46. def get_queryset(self, request):
  47. return super(EmailAdmin, self).get_queryset(request).select_related('template')
  48. def to_display(self, instance):
  49. return ', '.join(instance.to)
  50. to_display.short_description = 'to'
  51. to_display.admin_order_field = 'to'
  52. class LogAdmin(admin.ModelAdmin):
  53. list_display = ('date', 'email', 'status', get_message_preview)
  54. class SubjectField(TextInput):
  55. def __init__(self, *args, **kwargs):
  56. super(SubjectField, self).__init__(*args, **kwargs)
  57. self.attrs.update({'style': 'width: 610px;'})
  58. class EmailTemplateAdminForm(forms.ModelForm):
  59. language = forms.ChoiceField(choices=settings.LANGUAGES, required=False,
  60. help_text=_("Render template in alternative language"),
  61. label=_("Language"))
  62. class Meta:
  63. model = EmailTemplate
  64. fields = ('name', 'description', 'subject',
  65. 'content', 'html_content', 'language', 'default_template')
  66. class EmailTemplateInline(admin.StackedInline):
  67. form = EmailTemplateAdminForm
  68. model = EmailTemplate
  69. extra = 0
  70. fields = ('language', 'subject', 'content', 'html_content',)
  71. formfield_overrides = {
  72. models.CharField: {'widget': SubjectField}
  73. }
  74. def get_max_num(self, request, obj=None, **kwargs):
  75. return len(settings.LANGUAGES)
  76. class EmailTemplateAdmin(admin.ModelAdmin):
  77. form = EmailTemplateAdminForm
  78. list_display = ('name', 'description_shortened', 'subject', 'languages_compact', 'created')
  79. search_fields = ('name', 'description', 'subject')
  80. fieldsets = [
  81. (None, {
  82. 'fields': ('name', 'description'),
  83. }),
  84. (_("Default Content"), {
  85. 'fields': ('subject', 'content', 'html_content'),
  86. }),
  87. ]
  88. inlines = (EmailTemplateInline,) if settings.USE_I18N else ()
  89. formfield_overrides = {
  90. models.CharField: {'widget': SubjectField}
  91. }
  92. def get_queryset(self, request):
  93. return self.model.objects.filter(default_template__isnull=True)
  94. def description_shortened(self, instance):
  95. return Truncator(instance.description.split('\n')[0]).chars(200)
  96. description_shortened.short_description = _("Description")
  97. description_shortened.admin_order_field = 'description'
  98. def languages_compact(self, instance):
  99. languages = [tt.language for tt in instance.translated_templates.order_by('language')]
  100. return ', '.join(languages)
  101. languages_compact.short_description = _("Languages")
  102. def save_model(self, request, obj, form, change):
  103. obj.save()
  104. # if the name got changed, also change the translated templates to match again
  105. if 'name' in form.changed_data:
  106. obj.translated_templates.update(name=obj.name)
  107. class AttachmentAdmin(admin.ModelAdmin):
  108. list_display = ('name', 'file', )
  109. admin.site.register(Email, EmailAdmin)
  110. admin.site.register(Log, LogAdmin)
  111. admin.site.register(EmailTemplate, EmailTemplateAdmin)
  112. admin.site.register(Attachment, AttachmentAdmin)