• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

APSL / django-yubin / 8927266516

02 May 2024 04:28PM UTC coverage: 76.864%. Remained the same
8927266516

push

github

sastred
Bump version

173 of 225 branches covered (76.89%)

0 of 1 new or added line in 1 file covered. (0.0%)

598 of 778 relevant lines covered (76.86%)

3.07 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

0.0
/django_yubin/admin.py
1
from django.contrib import admin, messages as dj_messages
×
2
from django.http import HttpResponse
×
3
from django.shortcuts import render
×
4
from django.urls import re_path, reverse
×
5
from django.utils.module_loading import import_string
×
6
from django.utils.safestring import mark_safe
×
7
from django.utils.translation import gettext_lazy as _
×
8
from django.views.decorators.clickjacking import xframe_options_sameorigin
×
9

10
from . import mailparser_utils, models, settings
×
11

12

13
class LogInline(admin.TabularInline):
×
14
    model = models.Log
×
15
    readonly_fields = ('action', 'date', 'log_message')
×
16

17
    def has_add_permission(self, request, obj=None):
×
18
        return False
×
19

20
    def has_change_permission(self, request, obj=None):
×
21
        return False
×
22

23
    def has_delete_permission(self, request, obj=None):
×
24
        return False
×
25

26

27
@admin.register(models.Message)
×
28
class MessageAdmin(admin.ModelAdmin):
×
29

30
    @admin.display(description=_('Show'))
×
31
    def message_link(self, instance):
×
32
        url = reverse('admin:mail_detail', args=(instance.id,))
×
33
        return mark_safe(f'<a href="{url}" onclick="return showAddAnotherPopup(this);">Show</a>')
×
34

35
    @admin.display(description=_('Message data'))
×
36
    def message_data(self, instance):
×
37
        backend = import_string(settings.MAILER_STORAGE_BACKEND)
×
38
        return mark_safe(backend.admin_display_message_data(self, instance))
×
39

40
    @admin.display(description=_('Storage'))
×
41
    def storage_class(self, instance):
×
42
        return mark_safe(instance.storage.split('.')[-1])
×
43

44
    list_display = ('from_address', 'to_address', 'subject', 'date_created', 'date_sent',
×
45
                    'date_enqueued', 'status', 'storage_class', 'message_link')
46
    list_filter = ('date_created', 'date_sent', 'date_enqueued', 'status')
×
47
    fields = ('from_address', 'to_address', 'cc_address', 'bcc_address', 'subject', 'message_data',
×
48
              'storage', 'date_sent', 'sent_count', 'date_enqueued', 'enqueued_count', 'status')
49
    readonly_fields = ('to_address', 'cc_address', 'bcc_address', 'from_address', 'subject', 'message_data',
×
50
                       'storage', 'date_created')
51
    search_fields = ('to_address', 'subject', 'from_address')
×
52
    date_hierarchy = 'date_created'
×
53
    ordering = ('-date_created',)
×
54
    actions = ['enqueue_action', 'mark_as_sent_action', 'mark_as_created_action']
×
55
    inlines = [LogInline]
×
56

57
    def enqueue_action(self, request, queryset):
×
58
        failed, queued = [], []
×
59
        for message in queryset:
×
60
            if message.enqueue('Enqueued from the admin.'):
×
61
                queued.append(str(message.pk))
×
62
            else:
63
                failed.append(str(message.pk))
×
64

65
        msg = _("{q_count} emails enqueued: {q} | {f_count} emails failed: {f}".format(
×
66
                    q_count=len(queued), q=','.join(queued),
67
                    f_count=len(failed), f=','.join(failed),
68
                ))
69
        if failed and queued:
×
70
            level = dj_messages.WARNING
×
71
        elif failed:
×
72
            level = dj_messages.ERROR
×
73
        elif queued:
×
74
            level = dj_messages.SUCCESS
×
75
        else:
76
            level = dj_messages.INFO
×
77

78
        self.message_user(request, msg, level)
×
79
    enqueue_action.short_description = _('Enqueue selected messages')
×
80

81
    def mark_as_sent_action(self, request, queryset):
×
82
        for message in queryset:
×
83
            message.mark_as(models.Message.STATUS_SENT, 'Marked as sent from the admin.')
×
84
        self.message_user(request, _("Emails marked as sent."), level=dj_messages.SUCCESS)
×
85
    mark_as_sent_action.short_description = _('Mark as sent selected messages')
×
86

87
    def mark_as_created_action(self, request, queryset):
×
88
        for message in queryset:
×
89
            message.mark_as(models.Message.STATUS_CREATED, 'Marked as created from the admin.')
×
90
        self.message_user(request, _("Emails marked as created."), level=dj_messages.SUCCESS)
×
91
    mark_as_created_action.short_description = _('Mark as created selected messages')
×
92

93
    def get_urls(self):
×
94
        urls = super(MessageAdmin, self).get_urls()
×
95
        custom_urls = [
×
96
            re_path(r'^mail/(?P<pk>\d+)/$',
97
                    self.admin_site.admin_view(self.detail_view),
98
                    name='mail_detail'),
99
            re_path(r'^mail/attachment/(?P<pk>\d+)/(?P<signature>[0-9a-f]{32})/$',
100
                    self.admin_site.admin_view(self.download_view),
101
                    name="mail_download"),
102
            re_path(r'^mail/html/(?P<pk>\d+)/$',
103
                    self.admin_site.admin_view(self.html_view),
104
                    name="mail_html"),
105
        ]
106
        return custom_urls + urls
×
107

108
    def detail_view(self, request, pk):
×
109
        instance = models.Message.objects.get(pk=pk)
×
110
        msg = instance.get_message_parser()
×
111
        context = {
×
112
            "subject": msg.subject,
113
            "from": mailparser_utils.get_address(msg.from_),
114
            "to": mailparser_utils.get_addresses(msg.to),
115
            "cc": mailparser_utils.get_addresses(msg.cc),
116
            "msg_text": "\n".join(msg.text_plain),
117
            "msg_html": "</br>".join(msg.text_html),
118
            "attachments": [
119
                {
120
                    'filename': attachment['filename'],
121
                    'content_type': attachment['mail_content_type'],
122
                    'size': len(mailparser_utils.get_content(attachment)),
123
                    'signature': mailparser_utils.get_signature(attachment),
124
                }
125
                for attachment in msg.attachments
126
            ],
127
            "is_popup": True,
128
            "object": instance,
129
        }
130
        return render(request, "django_yubin/message_detail.html", context)
×
131

132
    def download_view(self, request, pk, signature):
×
133
        instance = models.Message.objects.get(pk=pk)
×
134
        msg = instance.get_message_parser()
×
135
        attachment = mailparser_utils.get_attachment(msg, signature)
×
136
        response = HttpResponse(content_type=attachment['mail_content_type'])
×
137
        response['Content-Disposition'] = str(attachment['content-disposition'])
×
138
        response.write(mailparser_utils.get_content(attachment))
×
139
        return response
×
140

141
    @xframe_options_sameorigin
×
142
    def html_view(self, request, pk):
×
143
        instance = models.Message.objects.get(pk=pk)
×
144
        msg = instance.get_message_parser()
×
145
        context = {"msg_html": "</br>".join(msg.text_html)}
×
146
        return render(request, "django_yubin/html_detail.html", context)
×
147

148

149
@admin.register(models.Blacklist)
×
150
class BlacklistAdmin(admin.ModelAdmin):
×
151
    list_display = ('email', 'date_added')
×
152

153

154
@admin.register(models.Log)
×
155
class LogAdmin(admin.ModelAdmin):
×
156
    def message_link(self, obj):
×
157
        url = reverse('admin:mail_detail', args=(obj.message.id,))
×
158
        return mark_safe("""<a href="%s" onclick="return showAddAnotherPopup(this);">show</a>""" % url)
×
159
    message_link.allow_tags = True
×
160
    message_link.short_description = _('Message')
×
161

162
    def message__to_address(self, obj):
×
163
        return obj.message.to_address
×
164
    message__to_address.admin_order_field = 'message__to_address'
×
165

166
    def message__subject(self, obj):
×
167
        return obj.message.subject
×
168
    message__subject.admin_order_field = 'message__subject'
×
169

170
    list_select_related = True
×
171
    list_display = ('id', 'date', 'action', 'log_message', 'message__to_address', 'message__subject', 'message_link')
×
172
    list_filter = ('action', 'date')
×
173
    list_display_links = ('id',)
×
174
    date_hierarchy = 'date'
×
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc