django-orchestra/orchestra/contrib/issues/actions.py

138 lines
5.1 KiB
Python

import sys
from django.contrib import messages
from django.db import transaction
from django.utils.translation import ngettext, gettext_lazy as _
from orchestra.admin.decorators import action_with_confirmation
from .forms import ChangeReasonForm
from .helpers import markdown_formated_changes
from .models import Queue, Ticket
def change_ticket_state_factory(action, verbose_name, final_state):
context = {
'action': action,
'form': ChangeReasonForm()
}
@transaction.atomic
@action_with_confirmation(action_name=action, extra_context=context)
def change_ticket_state(modeladmin, request, queryset, action=action, final_state=final_state):
form = ChangeReasonForm(request.POST)
if form.is_valid():
reason = form.cleaned_data['reason']
for ticket in queryset:
if ticket.state != final_state:
changes = {
'state': (ticket.state, final_state)
}
is_read = ticket.is_read_by(request.user)
getattr(ticket, action)()
msg = _("Marked as %s") % final_state.lower()
modeladmin.log_change(request, ticket, msg)
content = markdown_formated_changes(changes)
content += reason
ticket.messages.create(content=content, author=request.user)
if is_read and not ticket.is_read_by(request.user):
ticket.mark_as_read_by(request.user)
context = {
'count': queryset.count(),
'state': final_state.lower()
}
msg = _("%(count)s selected tickets are now %(state)s.") % context
modeladmin.message_user(request, msg)
else:
context['form'] = form
# action_with_confirmation must display form validation errors
return True
change_ticket_state.url_name = action
change_ticket_state.tool_description = verbose_name
change_ticket_state.short_description = _('%s selected tickets') % verbose_name
change_ticket_state.help_text = _('Mark ticket as %s.') % final_state.lower()
change_ticket_state.__name__ = action
return change_ticket_state
action_map = {
Ticket.RESOLVED: ('resolve', _("Resolve")),
Ticket.REJECTED: ('reject', _("Reject")),
Ticket.CLOSED: ('close', _("Close")),
}
thismodule = sys.modules[__name__]
for state, names in action_map.items():
name, verbose_name = names
action = change_ticket_state_factory(name, verbose_name, state)
setattr(thismodule, '%s_tickets' % name, action)
@transaction.atomic
def take_tickets(modeladmin, request, queryset):
for ticket in queryset:
if ticket.owner != request.user:
changes = {
'owner': (ticket.owner, request.user)
}
is_read = ticket.is_read_by(request.user)
ticket.take(request.user)
modeladmin.log_change(request, ticket, _("Taken"))
content = markdown_formated_changes(changes)
ticket.messages.create(content=content, author=request.user)
if is_read and not ticket.is_read_by(request.user):
ticket.mark_as_read_by(request.user)
modeladmin.log_change(request, ticket, 'Taken')
context = {
'count': queryset.count(),
'user': request.user
}
msg = _("%(count)s selected tickets are now owned by %(user)s.") % context
modeladmin.message_user(request, msg)
take_tickets.url_name = 'take'
take_tickets.tool_description = _("Take")
take_tickets.short_description = _("Take selected tickets")
take_tickets.help_text = _("Make yourself owner of the ticket.")
@transaction.atomic
def mark_as_unread(modeladmin, request, queryset):
""" Mark a tickets as unread """
for ticket in queryset:
ticket.mark_as_unread_by(request.user)
modeladmin.log_change(request, ticket, 'Marked as unread')
num = len(queryset)
msg = ngettext(
_("Selected ticket has been marked as unread."),
_("%i selected tickets have been marked as unread.") % num,
num)
modeladmin.message_user(request, msg)
@transaction.atomic
def mark_as_read(modeladmin, request, queryset):
""" Mark a tickets as unread """
for ticket in queryset:
ticket.mark_as_read_by(request.user)
modeladmin.log_change(request, ticket, 'Marked as read')
num = len(queryset)
msg = ngettext(
_("Selected ticket has been marked as read."),
_("%i selected tickets have been marked as read.") % num,
num)
modeladmin.message_user(request, msg)
@transaction.atomic
def set_default_queue(modeladmin, request, queryset):
""" Set a queue as default issues queue """
if queryset.count() != 1:
messages.warning(request, _("Please, select only one queue."))
return
Queue.objects.filter(default=True).update(default=False)
queue = queryset.get()
queue.default = True
queue.save(update_fields=['default'])
modeladmin.log_change(request, queue, _("Chosen as default."))
messages.info(request, _("Chosen '%s' as default queue.") % queue)