Merge pull request #896 from Benbb96/enhance-ticketcc

Improvements in Ticketcc views and templates
This commit is contained in:
Garret Wassermann 2020-10-31 15:27:08 -04:00 committed by GitHub
commit b7070db718
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 189 additions and 120 deletions

View File

@ -10,7 +10,7 @@ models.py - Model (and hence database) definitions. This is the core of the
from django.contrib.auth.models import Permission from django.contrib.auth.models import Permission
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist, ValidationError
from django.db import models from django.db import models
from django.conf import settings from django.conf import settings
from django.utils import timezone from django.utils import timezone
@ -1666,6 +1666,10 @@ class TicketCC(models.Model):
def __str__(self): def __str__(self):
return '%s for %s' % (self.display, self.ticket.title) return '%s for %s' % (self.display, self.ticket.title)
def clean(self):
if self.user and not self.user.email:
raise ValidationError('User has no email address')
class CustomFieldManager(models.Manager): class CustomFieldManager(models.Manager):

View File

@ -1,72 +1,104 @@
{% extends "helpdesk/base.html" %}{% load i18n %} {% extends "helpdesk/base.html" %}
{% load i18n %}
{% block helpdesk_title %}{% trans "Add Ticket CC" %}{% endblock %} {% block helpdesk_title %}{% trans "Add Ticket CC" %}{% endblock %}
{% block helpdesk_breadcrumb %} {% block helpdesk_breadcrumb %}
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'helpdesk:list' %}">{% trans "Tickets" %}</a> <a href="{% url 'helpdesk:list' %}">{% trans "Tickets" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'helpdesk:list' %}{{ ticket.id }}/">{{ ticket.queue.slug }}-{{ ticket.id }}</a> <a href="{% url 'helpdesk:list' %}{{ ticket.id }}/">{{ ticket.queue.slug }}-{{ ticket.id }}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'helpdesk:ticket_cc' ticket.id %}">{% trans "CC Settings" %}</a> <a href="{% url 'helpdesk:ticket_cc' ticket.id %}">{% trans "CC Settings" %}</a>
</li> </li>
<li class="breadcrumb-item active">{% trans "Add CC" %}</li> <li class="breadcrumb-item active">{% trans "Add CC" %}</li>
{% endblock %} {% endblock %}
{% block helpdesk_body %} {% block helpdesk_body %}
<h2>{% trans 'Add Ticket CC' %}</h2> <h2>{% trans 'Add Ticket CC' %}</h2>
<div class="card mb-3"> <div class="card mb-3">
<div class="card-header"> <div class="card-header">
<i class="fas fa-hand-pointer"></i> <i class="fas fa-hand-pointer"></i>
{% trans 'To automatically send an email to a user or e-mail address when this ticket is updated, select the user or enter an e-mail address below.' %} {% trans 'To automatically send an email to a user or e-mail address when this ticket is updated, select the user or enter an e-mail address below.' %}
</div> </div>
<div class="card-body"> <div class="card-body">
<!-- Nav tabs --> <!-- Nav tabs -->
<ul class="nav nav-tabs"> <ul class="nav nav-tabs">
<li class="active"><a href="#EmailCC" data-toggle="tab">{% trans 'Email' %}</a> <li class="nav-item">
</li> <a class="nav-link{% if not form.errors.user %} active{% endif %}" href="#EmailCC" data-toggle="tab">
<li><a href="#UserCC" data-toggle="tab">{% trans 'User' %}</a> {% trans 'Email' %}
</li> </a>
</ul> </li>
<li class="divider"></li>
<li class="nav-item">
<a class="nav-link{% if form.errors.user %} active{% endif %}" href="#UserCC" data-toggle="tab">
{% trans 'User' %}
</a>
</li>
</ul>
<!-- Tab panes --> {% if form.errors %}
<div class="tab-content"> {% include 'helpdesk/include/alert_form_errors.html' %}
<div class="tab-pane in active" id="EmailCC"> <ul>{{ form.non_field_errors }}</ul>
<h4>{% trans 'Add Email' %}</h4> {% endif %}
<form method='post' action='./'>
<fieldset> <!-- Tab panes -->
<dl>{% for field in form_email %} <div class="tab-content">
<dt><label for='id_{{ field.name }}'>{{ field.label }}</label></dt> <div class="tab-pane{% if not form.errors.user %} in active{% endif %}" id="EmailCC">
<dd>{{ field }}</dd> <h4>{% trans 'Add Email' %}</h4>
{% if field.errors %}<dd class='error'>{{ field.errors }}</dd>{% endif %} <form method='post'>
{% if field.help_text %}<dd class='form_help_text'>{{ field.help_text }}</dd>{% endif %} {% csrf_token %}
{% endfor %}</dl> <fieldset>
</fieldset> <dl>
<button class="btn btn-primary" type='submit'>{% trans "Save Ticket CC" %}</button> {% for field in form_email %}
{% csrf_token %}</form> <dt>{{ field.label_tag }}</dt>
</div> <dd>{{ field }}</dd>
<div class="tab-pane fade" id="UserCC"> {% if field.name == 'email' and form.errors.email %}
<h4>{% trans 'Add User' %}</h4> <dd class='error'>{{ form.errors.email }}</dd>
<form method='post' action='./'> {% endif %}
<fieldset> {% if field.help_text %}
<dl>{% for field in form_user %} <dd class='form_help_text'>{{ field.help_text }}</dd>
<dt><label for='id_{{ field.name }}'>{{ field.label }}</label></dt> {% endif %}
<dd>{{ field }}</dd> {% endfor %}
{% if field.errors %}<dd class='error'>{{ field.errors }}</dd>{% endif %} </dl>
{% if field.help_text %}<dd class='form_help_text'>{{ field.help_text }}</dd>{% endif %} </fieldset>
{% endfor %}</dl> <button class="btn btn-primary" type='submit'>{% trans "Save Ticket CC" %}</button>
</fieldset> <a href="{% url 'helpdesk:ticket_cc' ticket.id %}" class="btn btn-secondary">
<button class="btn btn-primary" type='submit'>{% trans "Save Ticket CC" %}</button> {% trans "Cancel" %}
{% csrf_token %}</form> </a>
</form>
</div>
<div class="tab-pane{% if form.errors.user %} in active{% endif %}" id="UserCC">
<h4>{% trans 'Add User' %}</h4>
<form method='post'>
{% csrf_token %}
<fieldset>
<dl>
{% for field in form_user %}
<dt>{{ field.label_tag }}</dt>
<dd>{{ field }}</dd>
{% if field.name == 'user' and form.errors.user %}
<dd class='error'>{{ form.errors.user }}</dd>
{% endif %}
{% if field.help_text %}
<dd class='form_help_text'>{{ field.help_text }}</dd>
{% endif %}
{% endfor %}
</dl>
</fieldset>
<button class="btn btn-primary" type='submit'>{% trans "Save Ticket CC" %}</button>
<a href="{% url 'helpdesk:ticket_cc' ticket.id %}" class="btn btn-secondary">
{% trans "Cancel" %}
</a>
</form>
</div>
</div> </div>
</div> </div>
<!-- /.card-body -->
</div> </div>
<!-- /.card-body --> <!-- /.card -->
</div>
<!-- /.card -->
{% endblock %} {% endblock %}

View File

@ -1,15 +1,17 @@
{% extends "helpdesk/base.html" %}{% load i18n %} {% extends "helpdesk/base.html" %}
{% load i18n %}
{% block helpdesk_title %}{% trans "Ticket CC Settings" %}{% endblock %} {% block helpdesk_title %}{% trans "Ticket CC Settings" %}{% endblock %}
{% block helpdesk_breadcrumb %} {% block helpdesk_breadcrumb %}
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'helpdesk:list' %}">{% trans "Tickets" %}</a> <a href="{% url 'helpdesk:list' %}">{% trans "Tickets" %}</a>
</li> </li>
<li class="breadcrumb-item"> <li class="breadcrumb-item">
<a href="{% url 'helpdesk:list' %}{{ ticket.id }}/">{{ ticket.queue.slug }}-{{ ticket.id }}</a> <a href="{% url 'helpdesk:list' %}{{ ticket.id }}/">{{ ticket.queue.slug }}-{{ ticket.id }}</a>
</li> </li>
<li class="breadcrumb-item active">{% trans "CC Settings" %}</li> <li class="breadcrumb-item active">{% trans "CC Settings" %}</li>
{% endblock %} {% endblock %}
{% block helpdesk_body %}{% blocktrans with ticket.title as ticket_title and ticket.id as ticket_id %} {% block helpdesk_body %}{% blocktrans with ticket.title as ticket_title and ticket.id as ticket_id %}
@ -19,47 +21,71 @@
<p>You can add a new recipient to the list or delete any of the items below as required.</p>{% endblocktrans %} <p>You can add a new recipient to the list or delete any of the items below as required.</p>{% endblocktrans %}
<div class="row"> <div class="row">
<div class="col-lg-12"> <div class="col-lg-12">
<div class="panel panel-primary"> <div class="panel panel-primary">
<div class="panel-heading"> <div class="panel-heading">
{% trans "Ticket CC List" %} {% trans "Ticket CC List" %}
</div>
<!-- /.panel-heading -->
<div class="panel-body">
<div><a href='add/'><button class="btn btn-success btn-sm"><i class="fa fa-plus-circle"></i>{% trans "Add an Email or Helpdesk User" %}</button></a></div>
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>{% trans "E-Mail Address or Helpdesk User" %}</th>
<th>{% trans "View?" %}</th>
<th>{% trans "Update?" %}</th>
<th>{% trans "Delete" %}</th>
</tr>
</thead>
<tbody>
{% for person in copies_to %}
<tr class='row_{% cycle 'odd' 'even' %}'>
<td>{{ person.display }}</td>
<td>{{ person.can_view }}</td>
<td>{{ person.can_update }}</td>
<td><a href='{% url 'helpdesk:ticket_cc_del' ticket.id person.id %}'><button class="btn btn-danger btn-xs">{% trans "Delete" %}</button></a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.panel-body -->
</div>
<!-- /.panel -->
</div> </div>
<!-- /.col-lg-12 --> <!-- /.panel-heading -->
<div class="panel-body">
<div><a href='add/'><button class="btn btn-success btn-sm"><i class="fa fa-plus-circle"></i>{% trans "Add an Email or Helpdesk User" %}</button></a></div>
<div class="table-responsive">
<table class="table table-striped table-bordered table-hover">
<thead>
<tr>
<th>{% trans "E-Mail Address or Helpdesk User" %}</th>
<th class="text-center">{% trans "View?" %}</th>
<th class="text-center">{% trans "Update?" %}</th>
<th class="text-center">{% trans "Delete" %}</th>
</tr>
</thead>
<tbody>
{% for person in copies_to %}
<tr class='row_{% cycle 'odd' 'even' %}'>
<td>{{ person.display }}</td>
<td class="text-center">
{% if person.can_view %}
<i class="fa fa-2x fa-check text-success"></i>
{% else %}
<i class="fa fa-2x fa-times text-danger"></i>
{% endif %}
</td>
<td class="text-center">
{% if person.can_update %}
<i class="fa fa-2x fa-check text-success"></i>
{% else %}
<i class="fa fa-2x fa-times text-danger"></i>
{% endif %}
</td>
<td class="text-center">
<a href='{% url 'helpdesk:ticket_cc_del' ticket.id person.id %}'>
<button class="btn btn-danger btn-xs">
{% trans "Delete" %}
</button>
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
<!-- /.table-responsive -->
</div>
<!-- /.panel-body -->
</div> </div>
<!-- /.row --> <!-- /.panel -->
</div>
<!-- /.col-lg-12 -->
</div>
<!-- /.row -->
<p><a href='{% url 'helpdesk:view' ticket.id %}'><button class="btn btn-primary btn-lg">{% blocktrans with ticket.title as ticket_title %}Return to <em>{{ ticket_title }}</em>{% endblocktrans %}</button></a></p> <p>
<a href='{% url 'helpdesk:view' ticket.id %}'>
<button class="btn btn-primary btn-lg">
{% blocktrans with ticket.title as ticket_title %}Return to <em>{{ ticket_title }}</em>{% endblocktrans %}
</button>
</a>
</p>
{% endblock %} {% endblock %}

View File

@ -1508,21 +1508,27 @@ def ticket_cc_add(request, ticket_id):
ticket = get_object_or_404(Ticket, id=ticket_id) ticket = get_object_or_404(Ticket, id=ticket_id)
ticket_perm_check(request, ticket) ticket_perm_check(request, ticket)
form = None
if request.method == 'POST': if request.method == 'POST':
form = TicketCCForm(request.POST) form = TicketCCForm(request.POST)
if form.is_valid(): if form.is_valid():
ticketcc = form.save(commit=False) user = form.cleaned_data.get('user')
ticketcc.ticket = ticket email = form.cleaned_data.get('email')
ticketcc.save() if user and ticket.ticketcc_set.filter(user=user).exists():
return HttpResponseRedirect(reverse('helpdesk:ticket_cc', form.add_error('user', _('Impossible to add twice the same user'))
kwargs={'ticket_id': ticket.id})) elif email and ticket.ticketcc_set.filter(email=email).exists():
else: form.add_error('email', _('Impossible to add twice the same email address'))
form_email = TicketCCEmailForm() else:
form_user = TicketCCUserForm() ticketcc = form.save(commit=False)
ticketcc.ticket = ticket
ticketcc.save()
return HttpResponseRedirect(reverse('helpdesk:ticket_cc', kwargs={'ticket_id': ticket.id}))
return render(request, 'helpdesk/ticket_cc_add.html', { return render(request, 'helpdesk/ticket_cc_add.html', {
'ticket': ticket, 'ticket': ticket,
'form_email': form_email, 'form': form,
'form_user': form_user, 'form_email': TicketCCEmailForm(),
'form_user': TicketCCUserForm(),
}) })
@ -1531,13 +1537,14 @@ ticket_cc_add = staff_member_required(ticket_cc_add)
@helpdesk_staff_member_required @helpdesk_staff_member_required
def ticket_cc_del(request, ticket_id, cc_id): def ticket_cc_del(request, ticket_id, cc_id):
ticket = get_object_or_404(Ticket, id=ticket_id)
cc = get_object_or_404(TicketCC, ticket__id=ticket_id, id=cc_id) cc = get_object_or_404(TicketCC, ticket__id=ticket_id, id=cc_id)
if request.method == 'POST': if request.method == 'POST':
cc.delete() cc.delete()
return HttpResponseRedirect(reverse('helpdesk:ticket_cc', return HttpResponseRedirect(reverse('helpdesk:ticket_cc', kwargs={'ticket_id': cc.ticket.id}))
kwargs={'ticket_id': cc.ticket.id}))
return render(request, 'helpdesk/ticket_cc_del.html', {'cc': cc}) return render(request, 'helpdesk/ticket_cc_del.html', {'ticket': ticket, 'cc': cc})
ticket_cc_del = staff_member_required(ticket_cc_del) ticket_cc_del = staff_member_required(ticket_cc_del)