diff --git a/demo/demodesk/config/urls.py b/demo/demodesk/config/urls.py index 52f6f407..22d4f803 100644 --- a/demo/demodesk/config/urls.py +++ b/demo/demodesk/config/urls.py @@ -13,7 +13,7 @@ Including another URLconf 1. Import the include() function: from django.conf.urls import url, include 2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls')) """ -from django.conf.urls import url, include +from django.urls import include, path from django.contrib import admin from django.conf import settings from django.conf.urls.static import static @@ -26,7 +26,7 @@ from django.conf.urls.static import static # https://docs.djangoproject.com/en/1.10/howto/static-files/ urlpatterns = [ - url(r'^admin/', admin.site.urls), - url(r'^', include('helpdesk.urls', namespace='helpdesk')), - url(r'^api/auth/', include('rest_framework.urls', namespace='rest_framework')) + path('admin/', admin.site.urls), + path('', include('helpdesk.urls', namespace='helpdesk')), + path('api/auth/', include('rest_framework.urls', namespace='rest_framework')) ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/helpdesk/admin.py b/helpdesk/admin.py index ad53346a..b074d5ae 100644 --- a/helpdesk/admin.py +++ b/helpdesk/admin.py @@ -1,7 +1,7 @@ from django.contrib import admin -from django.utils.translation import ugettext_lazy as _ -from helpdesk.models import Queue, Ticket, FollowUp, PreSetReply -from helpdesk.models import EscalationExclusion, EmailTemplate +from django.utils.translation import gettext_lazy as _ +from helpdesk.models import Queue, Ticket, FollowUp, PreSetReply, KBCategory +from helpdesk.models import EscalationExclusion, EmailTemplate, KBItem from helpdesk.models import TicketChange, KBIAttachment, FollowUpAttachment, IgnoreEmail from helpdesk.models import CustomField from helpdesk import settings as helpdesk_settings diff --git a/helpdesk/email.py b/helpdesk/email.py index 998ebb96..537f9af4 100644 --- a/helpdesk/email.py +++ b/helpdesk/email.py @@ -27,7 +27,7 @@ from django.core.exceptions import ValidationError from django.core.files.uploadedfile import SimpleUploadedFile from django.db.models import Q from django.utils import encoding, timezone -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from email_reply_parser import EmailReplyParser from helpdesk import settings @@ -129,7 +129,7 @@ def pop3_sync(q, logger, server): if type(raw_content[0]) is bytes: full_message = "\n".join([elm.decode('utf-8') for elm in raw_content]) else: - full_message = encoding.force_text("\n".join(raw_content), errors='replace') + full_message = encoding.force_str("\n".join(raw_content), errors='replace') ticket = object_from_message(message=full_message, queue=q, logger=logger) if ticket: @@ -175,7 +175,7 @@ def imap_sync(q, logger, server): for num in msgnums: logger.info("Processing message %s" % num) status, data = server.fetch(num, '(RFC822)') - full_message = encoding.force_text(data[0][1], errors='replace') + full_message = encoding.force_str(data[0][1], errors='replace') try: ticket = object_from_message(message=full_message, queue=q, logger=logger) except TypeError: @@ -268,7 +268,7 @@ def process_queue(q, logger): for i, m in enumerate(mail, 1): logger.info("Processing message %d" % i) with open(m, 'r') as f: - full_message = encoding.force_text(f.read(), errors='replace') + full_message = encoding.force_str(f.read(), errors='replace') ticket = object_from_message(message=full_message, queue=q, logger=logger) if ticket: logger.info("Successfully processed message %d, ticket/comment created.", i) @@ -579,9 +579,9 @@ def object_from_message(message, queue, logger): logger.debug("Discovered plain text MIME part") else: try: - email_body = encoding.smart_text(part.get_payload(decode=True)) + email_body = encoding.smart_str(part.get_payload(decode=True)) except UnicodeDecodeError: - email_body = encoding.smart_text(part.get_payload(decode=False)) + email_body = encoding.smart_str(part.get_payload(decode=False)) if not body and not full_body: # no text has been parsed so far - try such deep parsing for some messages diff --git a/helpdesk/forms.py b/helpdesk/forms.py index 6b776bfc..4b74aac2 100644 --- a/helpdesk/forms.py +++ b/helpdesk/forms.py @@ -12,7 +12,7 @@ from datetime import datetime, date, time from django.core.exceptions import ObjectDoesNotExist, ValidationError from django import forms from django.conf import settings -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from django.contrib.auth import get_user_model from django.utils import timezone diff --git a/helpdesk/lib.py b/helpdesk/lib.py index f9adb174..78b7f3dd 100644 --- a/helpdesk/lib.py +++ b/helpdesk/lib.py @@ -11,7 +11,7 @@ import mimetypes from datetime import datetime, date, time from django.conf import settings -from django.utils.encoding import smart_text +from django.utils.encoding import smart_str from helpdesk.settings import CUSTOMFIELD_DATETIME_FORMAT, CUSTOMFIELD_DATE_FORMAT, CUSTOMFIELD_TIME_FORMAT @@ -117,13 +117,13 @@ def text_is_spam(text, request): if ak.verify_key(): ak_data = { 'user_ip': request.META.get('REMOTE_ADDR', '127.0.0.1'), - 'user_agent': request.META.get('HTTP_USER_AGENT', ''), - 'referrer': request.META.get('HTTP_REFERER', ''), + 'user_agent': request.headers.get('User-Agent', ''), + 'referrer': request.headers.get('Referer', ''), 'comment_type': 'comment', 'comment_author': '', } - return ak.comment_check(smart_text(text), data=ak_data) + return ak.comment_check(smart_str(text), data=ak_data) return False @@ -135,8 +135,9 @@ def process_attachments(followup, attached_files): for attached in attached_files: if attached.size: - filename = smart_text(attached.name) - att = followup.followupattachment_set.create( + filename = smart_str(attached.name) + att = FollowUpAttachment( + followup=followup, file=attached, filename=filename, mime_type=attached.content_type or diff --git a/helpdesk/management/commands/create_queue_permissions.py b/helpdesk/management/commands/create_queue_permissions.py index 50e980c3..fb72f3fe 100644 --- a/helpdesk/management/commands/create_queue_permissions.py +++ b/helpdesk/management/commands/create_queue_permissions.py @@ -19,7 +19,7 @@ from django.contrib.auth.models import Permission from django.contrib.contenttypes.models import ContentType from django.core.management.base import BaseCommand, CommandError from django.db.utils import IntegrityError -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from helpdesk.models import Queue diff --git a/helpdesk/management/commands/create_usersettings.py b/helpdesk/management/commands/create_usersettings.py index e27cea16..2ed628a1 100644 --- a/helpdesk/management/commands/create_usersettings.py +++ b/helpdesk/management/commands/create_usersettings.py @@ -8,7 +8,7 @@ create_usersettings.py - Easy way to create helpdesk-specific settings for users who don't yet have them. """ -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.core.management.base import BaseCommand from django.contrib.auth import get_user_model diff --git a/helpdesk/management/commands/escalate_tickets.py b/helpdesk/management/commands/escalate_tickets.py index edbf7307..07c9a1c4 100644 --- a/helpdesk/management/commands/escalate_tickets.py +++ b/helpdesk/management/commands/escalate_tickets.py @@ -15,7 +15,7 @@ import sys from django.core.management.base import BaseCommand, CommandError from django.db.models import Q -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.utils import timezone from helpdesk.models import Queue, Ticket, FollowUp, EscalationExclusion, TicketChange diff --git a/helpdesk/migrations/0009_migrate_queuemembership.py b/helpdesk/migrations/0009_migrate_queuemembership.py index 09e2a60f..318b24ab 100644 --- a/helpdesk/migrations/0009_migrate_queuemembership.py +++ b/helpdesk/migrations/0009_migrate_queuemembership.py @@ -2,7 +2,7 @@ from django.core.exceptions import ObjectDoesNotExist from django.db import migrations from django.db.utils import IntegrityError -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ def create_and_assign_permissions(apps, schema_editor): diff --git a/helpdesk/models.py b/helpdesk/models.py index cb3d4149..5e3eaebb 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -14,7 +14,7 @@ from django.core.exceptions import ObjectDoesNotExist, ValidationError from django.db import models from django.conf import settings from django.utils import timezone -from django.utils.translation import ugettext_lazy as _, ugettext +from django.utils.translation import gettext_lazy as _, gettext from io import StringIO import re import os @@ -1031,11 +1031,11 @@ class TicketChange(models.Model): def __str__(self): out = '%s ' % self.field if not self.new_value: - out += ugettext('removed') + out += gettext('removed') elif not self.old_value: - out += ugettext('set to %s') % self.new_value + out += gettext('set to %s') % self.new_value else: - out += ugettext('changed from "%(old_value)s" to "%(new_value)s"') % { + out += gettext('changed from "%(old_value)s" to "%(new_value)s"') % { 'old_value': self.old_value, 'new_value': self.new_value } diff --git a/helpdesk/query.py b/helpdesk/query.py index 36d7eca2..c347c406 100644 --- a/helpdesk/query.py +++ b/helpdesk/query.py @@ -1,7 +1,7 @@ from django.db.models import Q from django.urls import reverse from django.utils.html import escape -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from base64 import b64encode from base64 import b64decode diff --git a/helpdesk/templates/helpdesk/debug.html b/helpdesk/templates/helpdesk/debug.html index e182dcc2..85c19e8c 100644 --- a/helpdesk/templates/helpdesk/debug.html +++ b/helpdesk/templates/helpdesk/debug.html @@ -3,9 +3,9 @@

Queries

{{ sql_queries|length }} Quer{{ sql_queries|pluralize:"y,ies" }} - {% ifnotequal sql_queries|length 0 %} + {% if sql_queries|length != 0 %} (Show) - {% endifnotequal %} + {% endif %}

diff --git a/helpdesk/templates/helpdesk/filters/owner.html b/helpdesk/templates/helpdesk/filters/owner.html index 20ed9446..87e5bfad 100644 --- a/helpdesk/templates/helpdesk/filters/owner.html +++ b/helpdesk/templates/helpdesk/filters/owner.html @@ -14,7 +14,7 @@ {% endwith %} {% for u in user_choices %} {% endfor %} diff --git a/helpdesk/templates/helpdesk/filters/sorting.html b/helpdesk/templates/helpdesk/filters/sorting.html index b9295fad..9115b1ce 100644 --- a/helpdesk/templates/helpdesk/filters/sorting.html +++ b/helpdesk/templates/helpdesk/filters/sorting.html @@ -6,22 +6,22 @@
diff --git a/helpdesk/templates/helpdesk/navigation-header.html b/helpdesk/templates/helpdesk/navigation-header.html index bee20ccf..769f10da 100644 --- a/helpdesk/templates/helpdesk/navigation-header.html +++ b/helpdesk/templates/helpdesk/navigation-header.html @@ -34,7 +34,7 @@ {% for q in user_saved_queries_ %} {{ q.title }} {% if q.shared %} - (Shared{% ifnotequal user q.user %} by {{ q.user.get_username }}{% endifnotequal %}) + (Shared{% if user != q.user %} by {{ q.user.get_username }}{% endif %}) {% endif %} {% endfor %} diff --git a/helpdesk/templates/helpdesk/navigation-sidebar.html b/helpdesk/templates/helpdesk/navigation-sidebar.html index 6d2c7af1..07c062f5 100644 --- a/helpdesk/templates/helpdesk/navigation-sidebar.html +++ b/helpdesk/templates/helpdesk/navigation-sidebar.html @@ -25,7 +25,7 @@ {% for q in user_saved_queries_ %} {{ q.title }} {% if q.shared %} - (Shared{% ifnotequal user q.user %} by {{ q.user.get_username }}{% endifnotequal %}) + (Shared{% if user != q.user %} by {{ q.user.get_username }}{% endif %}) {% endif %} {% endfor %} diff --git a/helpdesk/templates/helpdesk/public_view_ticket.html b/helpdesk/templates/helpdesk/public_view_ticket.html index 2d28c2f9..c293427d 100644 --- a/helpdesk/templates/helpdesk/public_view_ticket.html +++ b/helpdesk/templates/helpdesk/public_view_ticket.html @@ -99,34 +99,34 @@
{% trans "You can insert ticket and queue details in your message. For more information, see the context help page." %}
{% if not ticket.can_be_resolved %}
{% trans "This ticket cannot be resolved or closed until the tickets it depends on are resolved." %}
{% endif %} - {% ifequal ticket.status 1 %} + {% if ticket.status == 1 %} - {% endifequal %} - {% ifequal ticket.status 2 %} + {% endif %} + {% if ticket.status == 2 %}
- {% endifequal %} - {% ifequal ticket.status 3 %} + {% endif %} + {% if ticket.status == 3 %}
- {% endifequal %} - {% ifequal ticket.status 4 %} + {% endif %} + {% if ticket.status == 4 %}
- {% endifequal %} - {% ifequal ticket.status 5 %} + {% endif %} + {% if ticket.status == 5 %}
- {% endifequal %} + {% endif %} diff --git a/helpdesk/templates/helpdesk/report_output.html b/helpdesk/templates/helpdesk/report_output.html index 69497b03..cd50fe0b 100644 --- a/helpdesk/templates/helpdesk/report_output.html +++ b/helpdesk/templates/helpdesk/report_output.html @@ -29,7 +29,7 @@ diff --git a/helpdesk/templates/helpdesk/ticket.html b/helpdesk/templates/helpdesk/ticket.html index ff0a3fa8..265a449d 100644 --- a/helpdesk/templates/helpdesk/ticket.html +++ b/helpdesk/templates/helpdesk/ticket.html @@ -112,39 +112,39 @@
{% if not ticket.can_be_resolved %}
{% trans "This ticket cannot be resolved or closed until the tickets it depends on are resolved." %}
{% endif %} - {% ifequal ticket.status 1 %} + {% if ticket.status == 1 %}
- {% endifequal %} - {% ifequal ticket.status 2 %} + {% endif %} + {% if ticket.status == 2 %}
- {% endifequal %} - {% ifequal ticket.status 3 %} + {% endif %} + {% if ticket.status == 3 %}
- {% endifequal %} - {% ifequal ticket.status 4 %} + {% endif %} + {% if ticket.status == 4 %}
- {% endifequal %} - {% ifequal ticket.status 5 %} + {% endif %} + {% if ticket.status == 5 %}
- {% endifequal %} + {% endif %} {% if helpdesk_settings.HELPDESK_UPDATE_PUBLIC_DEFAULT %} @@ -176,10 +176,10 @@
-
+
-
+
{{ form.due_date }}
diff --git a/helpdesk/tests/test_attachments.py b/helpdesk/tests/test_attachments.py index 82983e68..51b64318 100644 --- a/helpdesk/tests/test_attachments.py +++ b/helpdesk/tests/test_attachments.py @@ -2,7 +2,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.urls import reverse from django.test import override_settings, TestCase -from django.utils.encoding import smart_text +from django.utils.encoding import smart_str from helpdesk import lib, models @@ -78,7 +78,7 @@ class AttachmentIntegrationTests(TestCase): # Ensure attachment is available with correct content att = models.FollowUpAttachment.objects.get(followup__ticket=response.context['ticket']) with open(os.path.join(MEDIA_DIR, att.file.name)) as file_on_disk: - disk_content = smart_text(file_on_disk.read(), 'utf-8') + disk_content = smart_str(file_on_disk.read(), 'utf-8') self.assertEqual(disk_content, 'โจ') diff --git a/helpdesk/tests/urls.py b/helpdesk/tests/urls.py index 640937c2..252441f3 100644 --- a/helpdesk/tests/urls.py +++ b/helpdesk/tests/urls.py @@ -1,7 +1,7 @@ -from django.conf.urls import include, url +from django.urls import include, path from django.contrib import admin urlpatterns = [ - url(r'^helpdesk/', include('helpdesk.urls', namespace='helpdesk')), - url(r'^admin/', admin.site.urls), + path('helpdesk/', include('helpdesk.urls', namespace='helpdesk')), + path('admin/', admin.site.urls), ] diff --git a/helpdesk/urls.py b/helpdesk/urls.py index 711ffa00..5f9ee545 100644 --- a/helpdesk/urls.py +++ b/helpdesk/urls.py @@ -7,7 +7,7 @@ urls.py - Mapping of URL's to our various views. Note we always used NAMED views for simplicity in linking later on. """ -from django.conf.urls import url +from django.urls import path, re_path from django.contrib.auth.decorators import login_required from django.contrib.auth import views as auth_views from django.urls import include @@ -48,115 +48,123 @@ app_name = 'helpdesk' base64_pattern = r'(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$' urlpatterns = [ - url(r'^dashboard/$', + path('dashboard/', staff.dashboard, name='dashboard'), - url(r'^tickets/$', + path('tickets/', staff.ticket_list, name='list'), - url(r'^tickets/update/$', + path('tickets/update/', staff.mass_update, name='mass_update'), - url(r'^tickets/merge$', + path('tickets/merge', staff.merge_tickets, name='merge_tickets'), - url(r'^tickets/(?P[0-9]+)/$', + path('tickets//', staff.view_ticket, name='view'), - url(r'^tickets/(?P[0-9]+)/followup_edit/(?P[0-9]+)/$', + path('tickets//followup_edit//', staff.followup_edit, name='followup_edit'), - url(r'^tickets/(?P[0-9]+)/followup_delete/(?P[0-9]+)/$', + path('tickets//followup_delete//', staff.followup_delete, name='followup_delete'), - url(r'^tickets/(?P[0-9]+)/edit/$', + path('tickets//edit/', staff.edit_ticket, name='edit'), - url(r'^tickets/(?P[0-9]+)/update/$', + path('tickets//update/', staff.update_ticket, name='update'), - url(r'^tickets/(?P[0-9]+)/delete/$', + path('tickets//delete/', staff.delete_ticket, name='delete'), - url(r'^tickets/(?P[0-9]+)/hold/$', + path('tickets//hold/', staff.hold_ticket, name='hold'), - url(r'^tickets/(?P[0-9]+)/unhold/$', + path('tickets//unhold/', staff.unhold_ticket, name='unhold'), - url(r'^tickets/(?P[0-9]+)/cc/$', + path('tickets//cc/', staff.ticket_cc, name='ticket_cc'), - url(r'^tickets/(?P[0-9]+)/cc/add/$', + path('tickets//cc/add/', staff.ticket_cc_add, name='ticket_cc_add'), - url(r'^tickets/(?P[0-9]+)/cc/delete/(?P[0-9]+)/$', + path('tickets//cc/delete//', staff.ticket_cc_del, name='ticket_cc_del'), - url(r'^tickets/(?P[0-9]+)/attachment_delete/(?P[0-9]+)/$', + path('tickets//dependency/add/', + staff.ticket_dependency_add, + name='ticket_dependency_add'), + + path('tickets//dependency/delete//', + staff.ticket_dependency_del, + name='ticket_dependency_del'), + + path('tickets//attachment_delete//', staff.attachment_del, name='attachment_del'), - url(r'^raw/(?P\w+)/$', + re_path(r'^raw/(?P\w+)/$', staff.raw_details, name='raw'), - url(r'^rss/$', + path('rss/', staff.rss_list, name='rss_index'), - url(r'^reports/$', + path('reports/', staff.report_index, name='report_index'), - url(r'^reports/(?P\w+)/$', + re_path(r'^reports/(?P\w+)/$', staff.run_report, name='run_report'), - url(r'^save_query/$', + path('save_query/', staff.save_query, name='savequery'), - url(r'^delete_query/(?P[0-9]+)/$', + path('delete_query//', staff.delete_saved_query, name='delete_query'), - url(r'^settings/$', + path('settings/', staff.EditUserSettingsView.as_view(), name='user_settings'), - url(r'^ignore/$', + path('ignore/', staff.email_ignore, name='email_ignore'), - url(r'^ignore/add/$', + path('ignore/add/', staff.email_ignore_add, name='email_ignore_add'), - url(r'^ignore/delete/(?P[0-9]+)/$', + path('ignore/delete//', staff.email_ignore_del, name='email_ignore_del'), - url(r'^datatables_ticket_list/(?P{})$'.format(base64_pattern), + re_path(r'^datatables_ticket_list/(?P{})$'.format(base64_pattern), staff.datatables_ticket_list, name="datatables_ticket_list"), - url(r'^timeline_ticket_list/(?P{})$'.format(base64_pattern), + re_path(r'^timeline_ticket_list/(?P{})$'.format(base64_pattern), staff.timeline_ticket_list, name="timeline_ticket_list"), @@ -174,49 +182,49 @@ if helpdesk_settings.HELPDESK_ENABLE_DEPENDENCIES_ON_TICKET: ] urlpatterns += [ - url(r'^$', + path('', protect_view(public.Homepage.as_view()), name='home'), - url(r'^tickets/submit/$', + path('tickets/submit/', public.create_ticket, name='submit'), - url(r'^tickets/submit_iframe/$', + path('tickets/submit_iframe/', public.CreateTicketIframeView.as_view(), name='submit_iframe'), - url(r'^tickets/success_iframe/$', # Ticket was submitted successfully + path('tickets/success_iframe/', # Ticket was submitted successfully public.SuccessIframeView.as_view(), name='success_iframe'), - url(r'^view/$', + path('view/', public.view_ticket, name='public_view'), - url(r'^change_language/$', + path('change_language/', public.change_language, name='public_change_language'), ] urlpatterns += [ - url(r'^rss/user/(?P[^/]+)/$', + path('rss/user//', helpdesk_staff_member_required(feeds.OpenTicketsByUser()), name='rss_user'), - url(r'^rss/user/(?P[^/]+)/(?P[A-Za-z0-9_-]+)/$', + re_path(r'^rss/user/(?P[^/]+)/(?P[A-Za-z0-9_-]+)/$', helpdesk_staff_member_required(feeds.OpenTicketsByUser()), name='rss_user_queue'), - url(r'^rss/queue/(?P[A-Za-z0-9_-]+)/$', + re_path(r'^rss/queue/(?P[A-Za-z0-9_-]+)/$', helpdesk_staff_member_required(feeds.OpenTicketsByQueue()), name='rss_queue'), - url(r'^rss/unassigned/$', + path('rss/unassigned/', helpdesk_staff_member_required(feeds.UnassignedTickets()), name='rss_unassigned'), - url(r'^rss/recent_activity/$', + path('rss/recent_activity/', helpdesk_staff_member_required(feeds.RecentFollowUps()), name='rss_activity'), ] @@ -232,23 +240,23 @@ if helpdesk_settings.HELPDESK_ACTIVATE_API_ENDPOINT: urlpatterns += [ - url(r'^login/$', + path('login/', login.login, name='login'), - url(r'^logout/$', + path('logout/', auth_views.LogoutView.as_view( template_name='helpdesk/registration/login.html', next_page='../'), name='logout'), - url(r'^password_change/$', + path('password_change/', auth_views.PasswordChangeView.as_view( template_name='helpdesk/registration/change_password.html', success_url='./done'), name='password_change'), - url(r'^password_change/done$', + path('password_change/done', auth_views.PasswordChangeDoneView.as_view( template_name='helpdesk/registration/change_password_done.html',), name='password_change_done'), @@ -256,29 +264,29 @@ urlpatterns += [ if helpdesk_settings.HELPDESK_KB_ENABLED: urlpatterns += [ - url(r'^kb/$', + path('kb/', kb.index, name='kb_index'), - url(r'^kb/(?P[A-Za-z0-9_-]+)/$', + re_path(r'^kb/(?P[A-Za-z0-9_-]+)/$', kb.category, name='kb_category'), - url(r'^kb/(?P[0-9]+)/vote/$', + path('kb//vote/', kb.vote, name='kb_vote'), - url(r'^kb_iframe/(?P[A-Za-z0-9_-]+)/$', + re_path(r'^kb_iframe/(?P[A-Za-z0-9_-]+)/$', kb.category_iframe, name='kb_category_iframe'), ] urlpatterns += [ - url(r'^help/context/$', + path('help/context/', TemplateView.as_view(template_name='helpdesk/help_context.html'), name='help_context'), - url(r'^system_settings/$', + path('system_settings/', login_required(DirectTemplateView.as_view(template_name='helpdesk/system_settings.html')), name='system_settings'), ] diff --git a/helpdesk/views/feeds.py b/helpdesk/views/feeds.py index aca10630..7ae8ebcb 100644 --- a/helpdesk/views/feeds.py +++ b/helpdesk/views/feeds.py @@ -11,7 +11,7 @@ from django.contrib.auth import get_user_model from django.contrib.syndication.views import Feed from django.urls import reverse from django.db.models import Q -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.shortcuts import get_object_or_404 from helpdesk.models import Ticket, FollowUp, Queue diff --git a/helpdesk/views/public.py b/helpdesk/views/public.py index 779e8d6d..b0c97c24 100644 --- a/helpdesk/views/public.py +++ b/helpdesk/views/public.py @@ -15,8 +15,8 @@ from django.core.exceptions import ( from django.urls import reverse from django.http import HttpResponseRedirect from django.shortcuts import render -from django.utils.http import urlquote -from django.utils.translation import ugettext as _ +from urllib.parse import quote +from django.utils.translation import gettext as _ from django.conf import settings from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.csrf import csrf_exempt @@ -112,7 +112,7 @@ class BaseCreateTicketView(abstract_views.AbstractCreateTicketMixin, FormView): return HttpResponseRedirect('%s?ticket=%s&email=%s&key=%s' % ( reverse('helpdesk:public_view'), ticket.ticket_for_url, - urlquote(ticket.submitter_email), + quote(ticket.submitter_email), ticket.secret_key) ) except ValueError: diff --git a/helpdesk/views/staff.py b/helpdesk/views/staff.py index 82cddfa6..c4f70f6b 100644 --- a/helpdesk/views/staff.py +++ b/helpdesk/views/staff.py @@ -19,7 +19,7 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.db.models import Q from django.http import HttpResponseRedirect, Http404, HttpResponse, JsonResponse from django.shortcuts import render, get_object_or_404, redirect -from django.utils.translation import ugettext as _ +from django.utils.translation import gettext as _ from django.utils.html import escape from django.utils import timezone from django.views.decorators.csrf import requires_csrf_token diff --git a/requirements.txt b/requirements.txt index 2bba41d2..97472289 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,6 @@ -Django>=2.2,<4 +Django>=2.2 django-bootstrap4-form celery -django-celery-beat email-reply-parser akismet markdown diff --git a/setup.py b/setup.py index 896bff35..0e3575a9 100644 --- a/setup.py +++ b/setup.py @@ -8,9 +8,16 @@ version = '0.4.0a1' # Provided as an attribute, so you can append to these instead # of replicating them: -standard_exclude = ('*.py', '*.pyc', '*$py.class', '*~', '.*', '*.bak') -standard_exclude_directories = ('.*', 'CVS', '_darcs', './build', - './dist', 'EGG-INFO', '*.egg-info') +standard_exclude = ("*.py", "*.pyc", "*$py.class", "*~", ".*", "*.bak") +standard_exclude_directories = ( + ".*", + "CVS", + "_darcs", + "./build", + "./dist", + "EGG-INFO", + "*.egg-info", +) # (c) 2005 Ian Bicking and contributors; written for Paste (http://pythonpaste.org) # Licensed under the MIT license: http://www.opensource.org/licenses/mit-license.php @@ -18,11 +25,13 @@ standard_exclude_directories = ('.*', 'CVS', '_darcs', './build', # you can't import this from another package, when you don't know if # that package is installed yet. def find_package_data( - where='.', package='', + where=".", + package="", exclude=standard_exclude, exclude_directories=standard_exclude_directories, only_in_packages=True, - show_ignored=False): + show_ignored=False, +): """ Return a dictionary suitable for use in ``package_data`` in a distutils ``setup.py`` file. @@ -51,7 +60,7 @@ def find_package_data( """ out = {} - stack = [(convert_path(where), '', package, only_in_packages)] + stack = [(convert_path(where), "", package, only_in_packages)] while stack: where, prefix, package, only_in_packages = stack.pop(0) for name in os.listdir(where): @@ -59,43 +68,40 @@ def find_package_data( if os.path.isdir(fn): bad_name = False for pattern in exclude_directories: - if (fnmatchcase(name, pattern) - or fn.lower() == pattern.lower()): + if fnmatchcase(name, pattern) or fn.lower() == pattern.lower(): bad_name = True if show_ignored: print( "Directory %s ignored by pattern %s" % (fn, pattern), - file=sys.stderr + file=sys.stderr, ) break if bad_name: continue - if (os.path.isfile(os.path.join(fn, '__init__.py')) - and not prefix): + if os.path.isfile(os.path.join(fn, "__init__.py")) and not prefix: if not package: new_package = name else: - new_package = package + '.' + name - stack.append((fn, '', new_package, False)) + new_package = package + "." + name + stack.append((fn, "", new_package, False)) else: - stack.append((fn, prefix + name + '/', package, only_in_packages)) + stack.append((fn, prefix + name + "/", package, only_in_packages)) elif package or not only_in_packages: # is a file bad_name = False for pattern in exclude: - if (fnmatchcase(name, pattern) - or fn.lower() == pattern.lower()): + if fnmatchcase(name, pattern) or fn.lower() == pattern.lower(): bad_name = True if show_ignored: print( "File %s ignored by pattern %s" % (fn, pattern), - file=sys.stderr - ) + file=sys.stderr, + ) break if bad_name: continue - out.setdefault(package, []).append(prefix+name) + out.setdefault(package, []).append(prefix + name) return out @@ -116,7 +122,7 @@ def get_long_description(): setup( - name='django-helpdesk', + name="django-helpdesk", version=version, description="Django-powered ticket tracker for your helpdesk", long_description=get_long_description(), @@ -128,6 +134,10 @@ setup( "Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.10", "Framework :: Django", +<<<<<<< HEAD +======= + "Framework :: Django :: 2.2", +>>>>>>> 55c638aeef0b3032eab28bcdc8ee313da9cbf9c0 "Framework :: Django :: 3.2", "Environment :: Web Environment", "Operating System :: OS Independent", @@ -138,18 +148,26 @@ setup( "Topic :: Office/Business", "Natural Language :: English", ], - keywords=['django', 'helpdesk', 'django-helpdesk', 'tickets', 'incidents', - 'cases', 'bugs', 'track', 'support'], - author='Ross Poulton', - author_email='ross@rossp.org', - maintainer='Garret Wassermann', - maintainer_email='gwasser@gmail.com', - url='https://github.com/django-helpdesk/django-helpdesk', - license='BSD', + keywords=[ + "django", + "helpdesk", + "django-helpdesk", + "tickets", + "incidents", + "cases", + "bugs", + "track", + "support", + ], + author="Ross Poulton", + author_email="ross@rossp.org", + maintainer="Garret Wassermann", + maintainer_email="gwasser@gmail.com", + url="https://github.com/django-helpdesk/django-helpdesk", + license="BSD", packages=find_packages(), package_data=find_package_data("helpdesk", only_in_packages=False), include_package_data=True, zip_safe=False, install_requires=get_requirements(), ) -