diff --git a/cppquiz/local_settings_example.py b/cppquiz/local_settings_example.py index a908742..ad32701 100644 --- a/cppquiz/local_settings_example.py +++ b/cppquiz/local_settings_example.py @@ -29,3 +29,6 @@ settings.STATIC_URL = '/static/' settings.EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend' + +settings.DEFAULT_FROM_EMAIL = '' +settings.SERVER_EMAIL = '' diff --git a/quiz/admin.py b/quiz/admin.py index d742258..694d99f 100644 --- a/quiz/admin.py +++ b/quiz/admin.py @@ -15,6 +15,18 @@ def result_short(obj): return obj.result +def _is_editor(request): + return not request.user.is_superuser and request.user.groups.filter(name='Editors').exists() + + +def _is_published(obj): + return obj is not None and getattr(obj, "state", None) == "PUB" + + +editor_fields = ['question', 'result', 'answer', 'hint', 'explanation', 'difficulty', + 'state', 'publish_time', 'socials_text', 'author_email', 'retraction_message'] + + class QuestionAdmin(VersionAdmin): list_display = ('pk', 'state', 'author_email', 'reserved', 'reservation_message', question_part, result_short, 'answer', 'difficulty', 'date_time', 'publish_time') @@ -24,17 +36,19 @@ class QuestionAdmin(VersionAdmin): def get_queryset(self, request): qs = super().get_queryset(request) - if not request.user.is_superuser and request.user.groups.filter(name='Editors').exists(): + if _is_editor(request): return qs.exclude(state='DRA') return qs def get_fields(self, request, obj=None): - if not request.user.is_superuser and request.user.groups.filter(name='Editors').exists(): - return ['question', 'result', 'answer', 'hint', 'explanation', 'difficulty', 'state', 'publish_time', 'socials_text', 'author_email', 'retraction_message'] + if _is_editor(request): + return editor_fields return super().get_fields(request, obj) def get_readonly_fields(self, request, obj=None): - if not request.user.is_superuser and request.user.groups.filter(name='Editors').exists(): + if _is_editor(request): + if _is_published(obj): + return editor_fields return ['state', 'publish_time', 'socials_text', 'author_email', 'retraction_message'] return super().get_readonly_fields(request, obj) diff --git a/quiz/views.py b/quiz/views.py index d17123b..ed7165e 100644 --- a/quiz/views.py +++ b/quiz/views.py @@ -2,7 +2,8 @@ import random from django.contrib.admin.views.decorators import staff_member_required -from django.core.mail import mail_admins +from django.contrib.auth.models import Group +from django.core.mail import mail_admins, send_mail from django.db.models import Count, Q from django.http import Http404, HttpResponse, HttpResponseRedirect from django.shortcuts import get_object_or_404, render @@ -70,8 +71,7 @@ def create(request): with reversion.create_revision(): form.save() reversion.set_comment("User contribution") - mail_admins('Someone made a question!', 'https://' + - request.get_host() + '/admin/quiz/question/?state=NEW') + mail_about_new_question(request) return HttpResponseRedirect('/quiz/created') else: form = QuestionForm() @@ -79,6 +79,26 @@ def create(request): {'form': form, 'title': 'Create question'}) +def mail_about_new_question(request): + subject = 'Someone made a question!' + body = 'https://' + request.get_host() + '/admin/quiz/question/?state=NEW' + mail_admins(subject, body) + + try: + editors = Group.objects.get(name='Editors').user_set.all() + except Group.DoesNotExist: + editors = [] + + editor_emails = [u.email for u in editors if u.email] + if editor_emails: + send_mail( + subject, + body, + None, + editor_emails, + ) + + def preview_with_key(request, question_id): key = request.GET.get('preview_key') d = {}