diff --git a/judge/admin/ticket.py b/judge/admin/ticket.py index 737bee53c..2dcddace9 100644 --- a/judge/admin/ticket.py +++ b/judge/admin/ticket.py @@ -1,9 +1,10 @@ -from django.contrib.admin import ModelAdmin from django.contrib.admin.options import StackedInline from django.forms import ModelForm from django.urls import reverse_lazy +from reversion.admin import VersionAdmin from judge.models import TicketMessage +from judge.utils.views import NoBatchDeleteMixin from judge.widgets import AdminHeavySelect2MultipleWidget, AdminHeavySelect2Widget, AdminMartorWidget @@ -29,7 +30,7 @@ class Meta: } -class TicketAdmin(ModelAdmin): +class TicketAdmin(NoBatchDeleteMixin, VersionAdmin): fields = ('title', 'time', 'user', 'assignees', 'content_type', 'object_id', 'notes') readonly_fields = ('time',) list_display = ('title', 'user', 'time', 'linked_item') diff --git a/judge/models/__init__.py b/judge/models/__init__.py index 8b2828236..1e9db2f79 100644 --- a/judge/models/__init__.py +++ b/judge/models/__init__.py @@ -28,4 +28,5 @@ revisions.register(Comment, fields=['author', 'time', 'page', 'score', 'body', 'hidden', 'parent']) revisions.register(TagProblem) revisions.register(TagData, follow=['problem']) +revisions.register(Ticket) del revisions diff --git a/judge/views/ticket.py b/judge/views/ticket.py index fb42ac595..8847a80fe 100644 --- a/judge/views/ticket.py +++ b/judge/views/ticket.py @@ -17,6 +17,7 @@ from django.views.generic import ListView from django.views.generic.detail import SingleObjectMixin from django.views.generic.edit import FormView +from reversion import revisions from judge import event_poster as event from judge.models import GeneralIssue, Problem, Profile, Ticket, TicketMessage @@ -208,8 +209,11 @@ def post(self, request, *args, **kwargs): raise ImproperlyConfigured('Need to define open or contributive') ticket = self.get_object() if self.open is not None and ticket.is_open != self.open: - ticket.is_open = self.open - ticket.save() + with revisions.create_revision(atomic=True): + revisions.set_comment('Opened' if self.open else 'Closed') + revisions.set_user(self.request.user) + ticket.is_open = self.open + ticket.save() if event.real: event.post('tickets', { 'type': 'ticket-status', 'id': ticket.id, @@ -224,10 +228,13 @@ def post(self, request, *args, **kwargs): if self.contributive is not None and ticket.is_contributive != self.contributive: if not request.user.has_perm('change_ticket') and self.request.profile == ticket.user: return HttpResponseBadRequest(_('You cannot vote your own ticket.'), content_type='text/plain') - ticket.user.update_contribution_points(settings.VNOJ_CP_TICKET * - (self.contributive - ticket.is_contributive)) - ticket.is_contributive = self.contributive - ticket.save() + with revisions.create_revision(atomic=True): + revisions.set_comment('Upvoted' if self.contributive else 'Downvoted') + revisions.set_user(self.request.user) + ticket.user.update_contribution_points(settings.VNOJ_CP_TICKET * + (self.contributive - ticket.is_contributive)) + ticket.is_contributive = self.contributive + ticket.save() return HttpResponse(status=204)