mirror of
https://gitea.mueller.network/extern/django-helpdesk.git
synced 2024-12-27 00:59:00 +01:00
Merge pull request #1035 from martin-marty/github-workflow-tools-isort
GitHub workflow tools isort
This commit is contained in:
commit
e29f07ab90
13
.github/workflows/pythonpackage.yml
vendored
13
.github/workflows/pythonpackage.yml
vendored
@ -24,13 +24,16 @@ jobs:
|
|||||||
run: |
|
run: |
|
||||||
pip install autopep8
|
pip install autopep8
|
||||||
autopep8 --exit-code --global-config .flake8 helpdesk
|
autopep8 --exit-code --global-config .flake8 helpdesk
|
||||||
# - name: Lint with flake8
|
- name: Lint with flake8
|
||||||
# run: |
|
run: |
|
||||||
# pip install flake8
|
pip install flake8
|
||||||
# stop the build if there are Python syntax errors or undefined names
|
# stop the build if there are Python syntax errors or undefined names
|
||||||
# flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
|
flake8 helpdesk --count --show-source --statistics --exit-zero
|
||||||
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
# exit-zero treats all errors as warnings. The GitHub editor is 127 chars wide
|
||||||
# flake8 . --count --exit-zero --max-complexity=10 --max-line-length=127 --statistics
|
# flake8 . --count --exit-zero --max-complexity=10 --statistics
|
||||||
|
- name: Sort style check with 'isort'
|
||||||
|
run: |
|
||||||
|
isort --line-length=120 --src helpdesk . --check
|
||||||
- name: Test with pytest
|
- name: Test with pytest
|
||||||
run: |
|
run: |
|
||||||
pip install pytest
|
pip install pytest
|
||||||
|
19
.isort.cfg
Normal file
19
.isort.cfg
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
[settings]
|
||||||
|
src_paths=helpdesk
|
||||||
|
skip_glob=migrations/*
|
||||||
|
skip=migrations
|
||||||
|
multi_line_output=3
|
||||||
|
line_length=120
|
||||||
|
use_parentheses=true
|
||||||
|
sections=FUTURE,STDLIB,THIRDPARTY,FIRSTPARTY,LOCALFOLDER
|
||||||
|
lines_after_imports=2
|
||||||
|
lines_before_imports=1
|
||||||
|
balanced_wrapping=true
|
||||||
|
lines_between_types=1
|
||||||
|
combine_as_imports=true
|
||||||
|
force_alphabetical_sort=true
|
||||||
|
skip_gitignore=true
|
||||||
|
force_sort_within_sections=true
|
||||||
|
group_by_package=false
|
||||||
|
from_first=true
|
||||||
|
|
@ -8,8 +8,10 @@ For the full list of settings and their values, see
|
|||||||
https://docs.djangoproject.com/en/1.11/ref/settings/
|
https://docs.djangoproject.com/en/1.11/ref/settings/
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
|
||||||
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
|
||||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
|
||||||
|
@ -13,10 +13,10 @@ Including another URLconf
|
|||||||
1. Import the include() function: from django.conf.urls import url, include
|
1. Import the include() function: from django.conf.urls import url, include
|
||||||
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
|
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
|
||||||
"""
|
"""
|
||||||
from django.urls import include, path
|
|
||||||
from django.contrib import admin
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls.static import static
|
from django.conf.urls.static import static
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.urls import include, path
|
||||||
|
|
||||||
|
|
||||||
# The following uses the static() helper function,
|
# The following uses the static() helper function,
|
||||||
|
@ -7,9 +7,10 @@ For more information on this file, see
|
|||||||
https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/
|
https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import os
|
|
||||||
|
|
||||||
from django.core.wsgi import get_wsgi_application
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
import os
|
||||||
|
|
||||||
|
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demodesk.config.settings")
|
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "demodesk.config.settings")
|
||||||
|
|
||||||
|
@ -1,10 +1,8 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
"""Python packaging."""
|
"""Python packaging."""
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
|
||||||
|
|
||||||
from setuptools import setup
|
|
||||||
import os
|
import os
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
|
||||||
here = os.path.abspath(os.path.dirname(__file__))
|
here = os.path.abspath(os.path.dirname(__file__))
|
||||||
project_root = os.path.dirname(here)
|
project_root = os.path.dirname(here)
|
||||||
|
@ -11,8 +11,9 @@
|
|||||||
# All configuration values have a default; values that are commented out
|
# All configuration values have a default; values that are commented out
|
||||||
# serve to show the default.
|
# serve to show the default.
|
||||||
|
|
||||||
import sys
|
|
||||||
import os
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
# If extensions (or modules to document with autodoc) are in another directory,
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
# add these directories to sys.path here. If the directory is relative to the
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
@ -1,13 +1,24 @@
|
|||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.utils.translation import gettext_lazy as _
|
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
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
from helpdesk.models import (
|
||||||
|
CustomField,
|
||||||
|
EmailTemplate,
|
||||||
|
EscalationExclusion,
|
||||||
|
FollowUp,
|
||||||
|
FollowUpAttachment,
|
||||||
|
IgnoreEmail,
|
||||||
|
KBIAttachment,
|
||||||
|
PreSetReply,
|
||||||
|
Queue,
|
||||||
|
Ticket,
|
||||||
|
TicketChange
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
from helpdesk.models import KBCategory
|
from helpdesk.models import KBCategory, KBItem
|
||||||
from helpdesk.models import KBItem
|
|
||||||
|
|
||||||
|
|
||||||
@admin.register(Queue)
|
@admin.register(Queue)
|
||||||
@ -82,9 +93,10 @@ if helpdesk_settings.HELPDESK_KB_ENABLED:
|
|||||||
|
|
||||||
list_display_links = ('title',)
|
list_display_links = ('title',)
|
||||||
|
|
||||||
@admin.register(KBCategory)
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
class KBCategoryAdmin(admin.ModelAdmin):
|
@admin.register(KBCategory)
|
||||||
list_display = ('name', 'title', 'slug', 'public')
|
class KBCategoryAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ('name', 'title', 'slug', 'public')
|
||||||
|
|
||||||
|
|
||||||
@admin.register(CustomField)
|
@admin.register(CustomField)
|
||||||
|
@ -1,12 +1,8 @@
|
|||||||
from functools import wraps
|
from django.contrib.auth.decorators import user_passes_test
|
||||||
|
|
||||||
from django.core.exceptions import PermissionDenied
|
from django.core.exceptions import PermissionDenied
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.shortcuts import redirect
|
from django.shortcuts import redirect
|
||||||
|
from functools import wraps
|
||||||
from django.contrib.auth.decorators import user_passes_test
|
|
||||||
|
|
||||||
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
|
||||||
|
|
||||||
|
@ -4,23 +4,11 @@ Django Helpdesk - A Django powered ticket tracker for small enterprise.
|
|||||||
(c) Copyright 2008 Jutda. Copyright 2018 Timothy Hobbs. All Rights Reserved.
|
(c) Copyright 2008 Jutda. Copyright 2018 Timothy Hobbs. All Rights Reserved.
|
||||||
See LICENSE for details.
|
See LICENSE for details.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# import base64
|
# import base64
|
||||||
import email
|
|
||||||
import imaplib
|
|
||||||
import logging
|
|
||||||
import mimetypes
|
|
||||||
import os
|
|
||||||
import poplib
|
|
||||||
import re
|
|
||||||
import socket
|
|
||||||
import ssl
|
|
||||||
import sys
|
|
||||||
from datetime import timedelta
|
|
||||||
from email.utils import getaddresses
|
|
||||||
from os.path import isfile, join
|
|
||||||
from time import ctime
|
|
||||||
|
|
||||||
from bs4 import BeautifulSoup
|
from bs4 import BeautifulSoup
|
||||||
|
from datetime import timedelta
|
||||||
from django.conf import settings as django_settings
|
from django.conf import settings as django_settings
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
@ -28,11 +16,23 @@ from django.core.files.uploadedfile import SimpleUploadedFile
|
|||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.utils import encoding, timezone
|
from django.utils import encoding, timezone
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
|
import email
|
||||||
|
from email.utils import getaddresses
|
||||||
from email_reply_parser import EmailReplyParser
|
from email_reply_parser import EmailReplyParser
|
||||||
|
|
||||||
from helpdesk import settings
|
from helpdesk import settings
|
||||||
from helpdesk.lib import safe_template_context, process_attachments
|
from helpdesk.lib import process_attachments, safe_template_context
|
||||||
from helpdesk.models import Queue, Ticket, TicketCC, FollowUp, IgnoreEmail
|
from helpdesk.models import FollowUp, IgnoreEmail, Queue, Ticket, TicketCC
|
||||||
|
import imaplib
|
||||||
|
import logging
|
||||||
|
import mimetypes
|
||||||
|
import os
|
||||||
|
from os.path import isfile, join
|
||||||
|
import poplib
|
||||||
|
import re
|
||||||
|
import socket
|
||||||
|
import ssl
|
||||||
|
import sys
|
||||||
|
from time import ctime
|
||||||
|
|
||||||
|
|
||||||
# import User model, which may be a custom model
|
# import User model, which may be a custom model
|
||||||
@ -342,7 +342,7 @@ def create_ticket_cc(ticket, cc_list):
|
|||||||
return []
|
return []
|
||||||
|
|
||||||
# Local import to deal with non-defined / circular reference problem
|
# Local import to deal with non-defined / circular reference problem
|
||||||
from helpdesk.views.staff import User, subscribe_to_ticket_updates
|
from helpdesk.views.staff import subscribe_to_ticket_updates, User
|
||||||
|
|
||||||
new_ticket_ccs = []
|
new_ticket_ccs = []
|
||||||
for cced_name, cced_email in cc_list:
|
for cced_name, cced_email in cc_list:
|
||||||
|
@ -6,25 +6,38 @@ django-helpdesk - A Django powered ticket tracker for small enterprise.
|
|||||||
forms.py - Definitions of newforms-based forms for creating and maintaining
|
forms.py - Definitions of newforms-based forms for creating and maintaining
|
||||||
tickets.
|
tickets.
|
||||||
"""
|
"""
|
||||||
import logging
|
|
||||||
from datetime import datetime, date, time
|
|
||||||
|
|
||||||
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
from datetime import datetime
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.translation import gettext_lazy as _
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from django.utils.translation import gettext_lazy as _
|
||||||
from helpdesk.lib import safe_template_context, process_attachments, convert_value
|
|
||||||
from helpdesk.models import (Ticket, Queue, FollowUp, IgnoreEmail, TicketCC,
|
|
||||||
CustomField, TicketCustomFieldValue, TicketDependency, UserSettings)
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
from helpdesk.settings import CUSTOMFIELD_TO_FIELD_DICT, CUSTOMFIELD_DATETIME_FORMAT, \
|
from helpdesk.lib import convert_value, process_attachments, safe_template_context
|
||||||
CUSTOMFIELD_DATE_FORMAT, CUSTOMFIELD_TIME_FORMAT
|
from helpdesk.models import (
|
||||||
|
CustomField,
|
||||||
|
FollowUp,
|
||||||
|
IgnoreEmail,
|
||||||
|
Queue,
|
||||||
|
Ticket,
|
||||||
|
TicketCC,
|
||||||
|
TicketCustomFieldValue,
|
||||||
|
TicketDependency,
|
||||||
|
UserSettings
|
||||||
|
)
|
||||||
|
from helpdesk.settings import (
|
||||||
|
CUSTOMFIELD_DATE_FORMAT,
|
||||||
|
CUSTOMFIELD_DATETIME_FORMAT,
|
||||||
|
CUSTOMFIELD_TIME_FORMAT,
|
||||||
|
CUSTOMFIELD_TO_FIELD_DICT
|
||||||
|
)
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
from helpdesk.models import (KBItem)
|
from helpdesk.models import KBItem
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
@ -226,7 +239,10 @@ class AbstractTicketForm(CustomFieldMixin, forms.Form):
|
|||||||
widget=forms.FileInput(attrs={'class': 'form-control-file'}),
|
widget=forms.FileInput(attrs={'class': 'form-control-file'}),
|
||||||
required=False,
|
required=False,
|
||||||
label=_('Attach File'),
|
label=_('Attach File'),
|
||||||
help_text=_('You can attach a file to this ticket. Only file types such as plain text (.txt), a document (.pdf, .docx, or .odt), or screenshot (.png or .jpg) may be uploaded.'),
|
help_text=_('You can attach a file to this ticket. '
|
||||||
|
'Only file types such as plain text (.txt), '
|
||||||
|
'a document (.pdf, .docx, or .odt), '
|
||||||
|
'or screenshot (.png or .jpg) may be uploaded.'),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Media:
|
class Media:
|
||||||
|
@ -6,14 +6,14 @@ django-helpdesk - A Django powered ticket tracker for small enterprise.
|
|||||||
lib.py - Common functions (eg multipart e-mail)
|
lib.py - Common functions (eg multipart e-mail)
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import logging
|
|
||||||
import mimetypes
|
|
||||||
from datetime import datetime, date, time
|
|
||||||
|
|
||||||
|
from datetime import date, datetime, time
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.encoding import smart_str
|
from django.utils.encoding import smart_str
|
||||||
|
from helpdesk.settings import CUSTOMFIELD_DATE_FORMAT, CUSTOMFIELD_DATETIME_FORMAT, CUSTOMFIELD_TIME_FORMAT
|
||||||
|
import logging
|
||||||
|
import mimetypes
|
||||||
|
|
||||||
from helpdesk.settings import CUSTOMFIELD_DATETIME_FORMAT, CUSTOMFIELD_DATE_FORMAT, CUSTOMFIELD_TIME_FORMAT
|
|
||||||
|
|
||||||
logger = logging.getLogger('helpdesk')
|
logger = logging.getLogger('helpdesk')
|
||||||
|
|
||||||
|
@ -8,12 +8,11 @@ scripts/create_escalation_exclusion.py - Easy way to routinely add particular
|
|||||||
days to the list of days on which no
|
days to the list of days on which no
|
||||||
escalation should take place.
|
escalation should take place.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from datetime import date, timedelta
|
||||||
from django.core.management.base import BaseCommand, CommandError
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
|
|
||||||
from helpdesk.models import EscalationExclusion, Queue
|
|
||||||
|
|
||||||
from datetime import timedelta, date
|
|
||||||
import getopt
|
import getopt
|
||||||
|
from helpdesk.models import EscalationExclusion, Queue
|
||||||
from optparse import make_option
|
from optparse import make_option
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
@ -13,15 +13,13 @@ scripts/create_queue_permissions.py -
|
|||||||
existing permissions.
|
existing permissions.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from optparse import make_option
|
|
||||||
|
|
||||||
from django.contrib.auth.models import Permission
|
from django.contrib.auth.models import Permission
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.core.management.base import BaseCommand, CommandError
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
from django.db.utils import IntegrityError
|
from django.db.utils import IntegrityError
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
|
|
||||||
from helpdesk.models import Queue
|
from helpdesk.models import Queue
|
||||||
|
from optparse import make_option
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
|
@ -8,12 +8,12 @@ create_usersettings.py - Easy way to create helpdesk-specific settings for
|
|||||||
users who don't yet have them.
|
users who don't yet have them.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django.utils.translation import gettext as _
|
|
||||||
from django.core.management.base import BaseCommand
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.core.management.base import BaseCommand
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
from helpdesk.models import UserSettings
|
from helpdesk.models import UserSettings
|
||||||
|
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
|
||||||
|
@ -8,18 +8,17 @@ scripts/escalate_tickets.py - Easy way to escalate tickets based on their age,
|
|||||||
designed to be run from Cron or similar.
|
designed to be run from Cron or similar.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from datetime import timedelta, date
|
|
||||||
import getopt
|
|
||||||
from optparse import make_option
|
|
||||||
import sys
|
|
||||||
|
|
||||||
|
from datetime import date, timedelta
|
||||||
from django.core.management.base import BaseCommand, CommandError
|
from django.core.management.base import BaseCommand, CommandError
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.utils.translation import gettext as _
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
from helpdesk.models import Queue, Ticket, FollowUp, EscalationExclusion, TicketChange
|
import getopt
|
||||||
from helpdesk.lib import safe_template_context
|
from helpdesk.lib import safe_template_context
|
||||||
|
from helpdesk.models import EscalationExclusion, FollowUp, Queue, Ticket, TicketChange
|
||||||
|
from optparse import make_option
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
|
@ -11,7 +11,6 @@ scripts/get_email.py - Designed to be run from cron, this script checks the
|
|||||||
adding to existing tickets if needed)
|
adding to existing tickets if needed)
|
||||||
"""
|
"""
|
||||||
from django.core.management.base import BaseCommand
|
from django.core.management.base import BaseCommand
|
||||||
|
|
||||||
from helpdesk.email import process_email
|
from helpdesk.email import process_email
|
||||||
|
|
||||||
|
|
||||||
|
@ -7,35 +7,29 @@ models.py - Model (and hence database) definitions. This is the core of the
|
|||||||
helpdesk structure.
|
helpdesk structure.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django.contrib.auth.models import Permission
|
|
||||||
|
from .lib import convert_value
|
||||||
|
from .templated_email import send_templated_mail
|
||||||
|
from .validators import validate_file_extension
|
||||||
|
import datetime
|
||||||
|
from django.conf import settings
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.contrib.auth.models import Permission
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
from django.core.exceptions import ObjectDoesNotExist, ValidationError
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.conf import settings
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
from django.utils.translation import gettext_lazy as _, gettext
|
|
||||||
from io import StringIO
|
|
||||||
import re
|
|
||||||
import os
|
|
||||||
import mimetypes
|
|
||||||
import datetime
|
|
||||||
|
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
from django.utils.translation import gettext, gettext_lazy as _
|
||||||
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
from io import StringIO
|
||||||
from markdown import markdown
|
from markdown import markdown
|
||||||
from markdown.extensions import Extension
|
from markdown.extensions import Extension
|
||||||
|
import mimetypes
|
||||||
|
import os
|
||||||
import uuid
|
import re
|
||||||
|
|
||||||
from rest_framework import serializers
|
from rest_framework import serializers
|
||||||
|
import uuid
|
||||||
from helpdesk import settings as helpdesk_settings
|
|
||||||
from .lib import convert_value
|
|
||||||
|
|
||||||
from .validators import validate_file_extension
|
|
||||||
|
|
||||||
from .templated_email import send_templated_mail
|
|
||||||
|
|
||||||
|
|
||||||
def format_time_spent(time_spent):
|
def format_time_spent(time_spent):
|
||||||
@ -60,7 +54,7 @@ def get_markdown(text):
|
|||||||
if not text:
|
if not text:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
pattern = fr'([\[\s\S\]]*?)\(([\s\S]*?):([\s\S]*?)\)'
|
pattern = r'([\[\s\S\]]*?)\(([\s\S]*?):([\s\S]*?)\)'
|
||||||
# Regex check
|
# Regex check
|
||||||
if re.match(pattern, text):
|
if re.match(pattern, text):
|
||||||
# get get value of group regex
|
# get get value of group regex
|
||||||
|
@ -1,15 +1,12 @@
|
|||||||
|
|
||||||
|
from base64 import b64decode, b64encode
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.html import escape
|
from django.utils.html import escape
|
||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
|
|
||||||
from base64 import b64encode
|
|
||||||
from base64 import b64decode
|
|
||||||
import json
|
|
||||||
|
|
||||||
from model_utils import Choices
|
|
||||||
|
|
||||||
from helpdesk.serializers import DatatablesTicketSerializer
|
from helpdesk.serializers import DatatablesTicketSerializer
|
||||||
|
import json
|
||||||
|
from model_utils import Choices
|
||||||
|
|
||||||
|
|
||||||
def query_to_base64(query):
|
def query_to_base64(query):
|
||||||
|
@ -1,13 +1,12 @@
|
|||||||
from rest_framework import serializers
|
from .forms import TicketForm
|
||||||
|
from .lib import format_time_spent, process_attachments
|
||||||
|
from .models import CustomField, FollowUp, FollowUpAttachment, Ticket
|
||||||
|
from .user import HelpdeskUser
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.humanize.templatetags import humanize
|
from django.contrib.humanize.templatetags import humanize
|
||||||
|
from rest_framework import serializers
|
||||||
from rest_framework.exceptions import ValidationError
|
from rest_framework.exceptions import ValidationError
|
||||||
|
|
||||||
from .forms import TicketForm
|
|
||||||
from .models import Ticket, CustomField, FollowUp, FollowUpAttachment
|
|
||||||
from .lib import format_time_spent, process_attachments
|
|
||||||
from .user import HelpdeskUser
|
|
||||||
|
|
||||||
|
|
||||||
class DatatablesTicketSerializer(serializers.ModelSerializer):
|
class DatatablesTicketSerializer(serializers.ModelSerializer):
|
||||||
"""
|
"""
|
||||||
|
@ -2,12 +2,13 @@
|
|||||||
Default settings for django-helpdesk.
|
Default settings for django-helpdesk.
|
||||||
|
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
import warnings
|
|
||||||
|
|
||||||
from django import forms
|
from django import forms
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
|
import os
|
||||||
|
import warnings
|
||||||
|
|
||||||
|
|
||||||
DEFAULT_USER_SETTINGS = {
|
DEFAULT_USER_SETTINGS = {
|
||||||
'login_view_ticketlist': True,
|
'login_view_ticketlist': True,
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
from celery import shared_task
|
|
||||||
|
|
||||||
from .email import process_email
|
from .email import process_email
|
||||||
|
from celery import shared_task
|
||||||
|
|
||||||
|
|
||||||
@shared_task
|
@shared_task
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
import os
|
|
||||||
import logging
|
|
||||||
from smtplib import SMTPException
|
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
import logging
|
||||||
|
import os
|
||||||
|
from smtplib import SMTPException
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('helpdesk')
|
logger = logging.getLogger('helpdesk')
|
||||||
|
|
||||||
@ -50,8 +51,7 @@ def send_templated_mail(template_name,
|
|||||||
from_string = engines['django'].from_string
|
from_string = engines['django'].from_string
|
||||||
|
|
||||||
from helpdesk.models import EmailTemplate
|
from helpdesk.models import EmailTemplate
|
||||||
from helpdesk.settings import HELPDESK_EMAIL_SUBJECT_TEMPLATE, \
|
from helpdesk.settings import HELPDESK_EMAIL_FALLBACK_LOCALE, HELPDESK_EMAIL_SUBJECT_TEMPLATE
|
||||||
HELPDESK_EMAIL_FALLBACK_LOCALE
|
|
||||||
|
|
||||||
headers = extra_headers or {}
|
headers = extra_headers or {}
|
||||||
|
|
||||||
|
@ -4,10 +4,10 @@ django-helpdesk - A Django powered ticket tracker for small enterprise.
|
|||||||
The is_helpdesk_staff template filter returns True if the user qualifies as Helpdesk staff.
|
The is_helpdesk_staff template filter returns True if the user qualifies as Helpdesk staff.
|
||||||
templatetags/helpdesk_staff.py
|
templatetags/helpdesk_staff.py
|
||||||
"""
|
"""
|
||||||
import logging
|
|
||||||
from django.template import Library
|
|
||||||
|
|
||||||
|
from django.template import Library
|
||||||
from helpdesk.decorators import is_helpdesk_staff
|
from helpdesk.decorators import is_helpdesk_staff
|
||||||
|
import logging
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
|
from datetime import datetime
|
||||||
|
from django.conf import settings
|
||||||
from django.template import Library
|
from django.template import Library
|
||||||
from django.template.defaultfilters import date as date_filter
|
from django.template.defaultfilters import date as date_filter
|
||||||
from django.conf import settings
|
from helpdesk.forms import CUSTOMFIELD_DATE_FORMAT, CUSTOMFIELD_DATETIME_FORMAT, CUSTOMFIELD_TIME_FORMAT
|
||||||
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
from helpdesk.forms import CUSTOMFIELD_DATE_FORMAT, CUSTOMFIELD_TIME_FORMAT, CUSTOMFIELD_DATETIME_FORMAT
|
|
||||||
|
|
||||||
register = Library()
|
register = Library()
|
||||||
|
|
||||||
|
@ -7,7 +7,6 @@ templatetags/saved_queries.py - This template tag returns previously saved
|
|||||||
"""
|
"""
|
||||||
from django import template
|
from django import template
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
|
|
||||||
from helpdesk.models import SavedSearch
|
from helpdesk.models import SavedSearch
|
||||||
|
|
||||||
|
|
||||||
|
@ -10,12 +10,11 @@ templatetags/ticket_to_link.py - Used in ticket comments to allow wiki-style
|
|||||||
to show the status of that ticket (eg a closed
|
to show the status of that ticket (eg a closed
|
||||||
ticket would have a strikethrough).
|
ticket would have a strikethrough).
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django import template
|
from django import template
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
|
|
||||||
from helpdesk.models import Ticket
|
from helpdesk.models import Ticket
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,8 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import sys
|
|
||||||
from django.contrib.auth import get_user_model
|
|
||||||
|
|
||||||
from helpdesk.models import Ticket, Queue, UserSettings
|
from django.contrib.auth import get_user_model
|
||||||
|
from helpdesk.models import Queue, Ticket, UserSettings
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
@ -1,18 +1,22 @@
|
|||||||
|
|
||||||
import base64
|
import base64
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
|
from django.contrib.auth.models import User
|
||||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
from freezegun import freeze_time
|
from freezegun import freeze_time
|
||||||
|
from helpdesk.models import CustomField, Queue, Ticket
|
||||||
from django.contrib.auth.models import User
|
|
||||||
from rest_framework import HTTP_HEADER_ENCODING
|
from rest_framework import HTTP_HEADER_ENCODING
|
||||||
from rest_framework.exceptions import ErrorDetail
|
from rest_framework.exceptions import ErrorDetail
|
||||||
from rest_framework.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_204_NO_CONTENT, HTTP_400_BAD_REQUEST, HTTP_403_FORBIDDEN
|
from rest_framework.status import (
|
||||||
|
HTTP_200_OK,
|
||||||
|
HTTP_201_CREATED,
|
||||||
|
HTTP_204_NO_CONTENT,
|
||||||
|
HTTP_400_BAD_REQUEST,
|
||||||
|
HTTP_403_FORBIDDEN
|
||||||
|
)
|
||||||
from rest_framework.test import APITestCase
|
from rest_framework.test import APITestCase
|
||||||
|
|
||||||
from helpdesk.models import Queue, Ticket, CustomField
|
|
||||||
|
|
||||||
|
|
||||||
class TicketTest(APITestCase):
|
class TicketTest(APITestCase):
|
||||||
due_date = datetime(2022, 4, 10, 15, 6)
|
due_date = datetime(2022, 4, 10, 15, 6)
|
||||||
|
@ -1,15 +1,13 @@
|
|||||||
# vim: set fileencoding=utf-8 :
|
# vim: set fileencoding=utf-8 :
|
||||||
|
|
||||||
from django.core.files.uploadedfile import SimpleUploadedFile
|
from django.core.files.uploadedfile import SimpleUploadedFile
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import override_settings, TestCase
|
from django.test import override_settings, TestCase
|
||||||
|
from django.urls import reverse
|
||||||
from django.utils.encoding import smart_str
|
from django.utils.encoding import smart_str
|
||||||
|
|
||||||
from helpdesk import lib, models
|
from helpdesk import lib, models
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import shutil
|
import shutil
|
||||||
from tempfile import gettempdir
|
from tempfile import gettempdir
|
||||||
|
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
from unittest.case import skip
|
from unittest.case import skip
|
||||||
|
|
||||||
|
@ -1,24 +1,23 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.test import TestCase, override_settings
|
|
||||||
|
from django.contrib.auth.hashers import make_password
|
||||||
|
from django.contrib.auth.models import User
|
||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
from django.contrib.auth.models import User
|
from django.test import override_settings, TestCase
|
||||||
from django.contrib.auth.hashers import make_password
|
|
||||||
|
|
||||||
from helpdesk.models import Queue, Ticket, TicketCC, FollowUp, FollowUpAttachment
|
|
||||||
from helpdesk.management.commands.get_email import Command
|
|
||||||
import helpdesk.email
|
import helpdesk.email
|
||||||
|
from helpdesk.management.commands.get_email import Command
|
||||||
import six
|
from helpdesk.models import FollowUp, FollowUpAttachment, Queue, Ticket, TicketCC
|
||||||
import itertools
|
import itertools
|
||||||
from shutil import rmtree
|
|
||||||
import sys
|
|
||||||
import os
|
|
||||||
from tempfile import mkdtemp
|
|
||||||
import logging
|
import logging
|
||||||
|
import os
|
||||||
|
from shutil import rmtree
|
||||||
|
import six
|
||||||
|
import sys
|
||||||
|
from tempfile import mkdtemp
|
||||||
from unittest import mock
|
from unittest import mock
|
||||||
|
|
||||||
|
|
||||||
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
THIS_DIR = os.path.dirname(os.path.abspath(__file__))
|
||||||
|
|
||||||
# class A addresses can't have first octet of 0
|
# class A addresses can't have first octet of 0
|
||||||
|
@ -1,11 +1,8 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.urls import reverse
|
||||||
from helpdesk.models import KBCategory, KBItem, Queue, Ticket
|
from helpdesk.models import KBCategory, KBItem, Queue, Ticket
|
||||||
|
from helpdesk.tests.helpers import create_ticket, get_staff_user, print_response, reload_urlconf, User
|
||||||
from helpdesk.tests.helpers import (
|
|
||||||
get_staff_user, reload_urlconf, User, create_ticket, print_response)
|
|
||||||
|
|
||||||
|
|
||||||
class KBTests(TestCase):
|
class KBTests(TestCase):
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
from django.test import TestCase, override_settings
|
from django.test import override_settings, TestCase
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
import sys
|
|
||||||
from importlib import reload
|
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
|
|
||||||
|
from django.test import TestCase
|
||||||
|
from django.test.utils import override_settings
|
||||||
|
from django.urls import reverse
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
from helpdesk.models import Queue
|
from helpdesk.models import Queue
|
||||||
from helpdesk.tests.helpers import (
|
from helpdesk.tests.helpers import create_ticket, get_staff_user, print_response, reload_urlconf, User
|
||||||
get_staff_user, reload_urlconf, User, create_ticket, print_response)
|
from importlib import reload
|
||||||
from django.test.utils import override_settings
|
import sys
|
||||||
|
|
||||||
|
|
||||||
class KBDisabledTestCase(TestCase):
|
class KBDisabledTestCase(TestCase):
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.auth.models import Permission
|
from django.contrib.auth.models import Permission
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
|
from django.urls import reverse
|
||||||
from helpdesk.models import Queue, Ticket
|
|
||||||
from helpdesk import settings
|
from helpdesk import settings
|
||||||
|
from helpdesk.models import Queue, Ticket
|
||||||
from helpdesk.query import __Query__
|
from helpdesk.query import __Query__
|
||||||
from helpdesk.user import HelpdeskUser
|
from helpdesk.user import HelpdeskUser
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
from helpdesk.models import Queue, Ticket
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
from helpdesk.models import Queue, Ticket
|
||||||
|
|
||||||
|
|
||||||
class PublicActionsTestCase(TestCase):
|
class PublicActionsTestCase(TestCase):
|
||||||
|
@ -1,12 +1,9 @@
|
|||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
|
||||||
from helpdesk.models import KBCategory, KBItem, Queue, Ticket
|
from helpdesk.models import KBCategory, KBItem, Queue, Ticket
|
||||||
from helpdesk.query import query_to_base64
|
from helpdesk.query import query_to_base64
|
||||||
|
from helpdesk.tests.helpers import create_ticket, get_staff_user, print_response, reload_urlconf, User
|
||||||
from helpdesk.tests.helpers import (
|
|
||||||
get_staff_user, reload_urlconf, User, create_ticket, print_response)
|
|
||||||
|
|
||||||
|
|
||||||
class QueryTests(TestCase):
|
class QueryTests(TestCase):
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from django.urls import reverse
|
||||||
from helpdesk.models import Queue
|
from helpdesk.models import Queue
|
||||||
from helpdesk.tests.helpers import get_user
|
from helpdesk.tests.helpers import get_user
|
||||||
|
|
||||||
|
@ -1,22 +1,21 @@
|
|||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
|
from django.urls import reverse
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
|
||||||
from helpdesk.models import CustomField, Queue, Ticket
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
from helpdesk.models import CustomField, Queue, Ticket
|
||||||
|
from helpdesk.templatetags.ticket_to_link import num_to_link
|
||||||
|
from helpdesk.user import HelpdeskUser
|
||||||
|
|
||||||
|
|
||||||
try: # python 3
|
try: # python 3
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
except ImportError: # python 2
|
except ImportError: # python 2
|
||||||
from urlparse import urlparse
|
from urlparse import urlparse
|
||||||
|
|
||||||
from helpdesk.templatetags.ticket_to_link import num_to_link
|
|
||||||
from helpdesk.user import HelpdeskUser
|
|
||||||
|
|
||||||
|
|
||||||
class TicketActionsTestCase(TestCase):
|
class TicketActionsTestCase(TestCase):
|
||||||
fixtures = ['emailtemplate.json']
|
fixtures = ['emailtemplate.json']
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from helpdesk.models import Ticket, Queue
|
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
|
from django.urls import reverse
|
||||||
|
from helpdesk.models import Queue, Ticket
|
||||||
|
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
@ -1,22 +1,19 @@
|
|||||||
|
|
||||||
import email
|
|
||||||
import uuid
|
|
||||||
|
|
||||||
from helpdesk.models import Queue, CustomField, FollowUp, Ticket, TicketCC, KBCategory, KBItem
|
|
||||||
from django.test import TestCase
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.forms import ValidationError
|
from django.forms import ValidationError
|
||||||
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
|
import email
|
||||||
from helpdesk.email import object_from_message, create_ticket_cc
|
from helpdesk.email import create_ticket_cc, object_from_message
|
||||||
|
from helpdesk.models import CustomField, FollowUp, KBCategory, KBItem, Queue, Ticket, TicketCC
|
||||||
from helpdesk.tests.helpers import print_response
|
from helpdesk.tests.helpers import print_response
|
||||||
|
|
||||||
from urllib.parse import urlparse
|
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
from urllib.parse import urlparse
|
||||||
|
import uuid
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger('helpdesk')
|
logger = logging.getLogger('helpdesk')
|
||||||
|
@ -1,23 +1,24 @@
|
|||||||
|
|
||||||
|
import datetime
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.contrib.auth.hashers import make_password
|
||||||
|
from django.contrib.auth.models import User
|
||||||
from django.contrib.sites.models import Site
|
from django.contrib.sites.models import Site
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
from helpdesk.models import Queue, Ticket, FollowUp
|
from django.urls import reverse
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
from django.contrib.auth.models import User
|
from helpdesk.models import FollowUp, Queue, Ticket
|
||||||
from django.contrib.auth.hashers import make_password
|
from helpdesk.templatetags.ticket_to_link import num_to_link
|
||||||
import uuid
|
import uuid
|
||||||
import datetime
|
|
||||||
|
|
||||||
try: # python 3
|
try: # python 3
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
except ImportError: # python 2
|
except ImportError: # python 2
|
||||||
from urlparse import urlparse
|
from urlparse import urlparse
|
||||||
|
|
||||||
from helpdesk.templatetags.ticket_to_link import num_to_link
|
|
||||||
|
|
||||||
|
|
||||||
class TimeSpentTestCase(TestCase):
|
class TimeSpentTestCase(TestCase):
|
||||||
|
|
||||||
|
@ -1,10 +1,11 @@
|
|||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.core import mail
|
from django.core import mail
|
||||||
from django.urls import reverse
|
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.client import Client
|
from django.test.client import Client
|
||||||
|
from django.urls import reverse
|
||||||
from helpdesk.models import CustomField, Queue, Ticket
|
from helpdesk.models import CustomField, Queue, Ticket
|
||||||
|
|
||||||
|
|
||||||
try: # python 3
|
try: # python 3
|
||||||
from urllib.parse import urlparse
|
from urllib.parse import urlparse
|
||||||
except ImportError: # python 2
|
except ImportError: # python 2
|
||||||
|
@ -1,5 +1,6 @@
|
|||||||
from django.urls import include, path
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from django.urls import include, path
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', include('helpdesk.urls', namespace='helpdesk')),
|
path('', include('helpdesk.urls', namespace='helpdesk')),
|
||||||
|
@ -7,17 +7,16 @@ urls.py - Mapping of URL's to our various views. Note we always used NAMED
|
|||||||
views for simplicity in linking later on.
|
views for simplicity in linking later on.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
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.contrib.auth import views as auth_views
|
||||||
from django.urls import include
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.urls import include, path, re_path
|
||||||
from django.views.generic import TemplateView
|
from django.views.generic import TemplateView
|
||||||
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
from helpdesk.decorators import helpdesk_staff_member_required, protect_view
|
||||||
|
from helpdesk.views import feeds, login, public, staff
|
||||||
|
from helpdesk.views.api import CreateUserView, FollowUpAttachmentViewSet, FollowUpViewSet, TicketViewSet
|
||||||
from rest_framework.routers import DefaultRouter
|
from rest_framework.routers import DefaultRouter
|
||||||
|
|
||||||
from helpdesk.decorators import helpdesk_staff_member_required, protect_view
|
|
||||||
from helpdesk.views import feeds, staff, public, login
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
|
||||||
from helpdesk.views.api import TicketViewSet, CreateUserView, FollowUpViewSet, FollowUpAttachmentViewSet
|
|
||||||
|
|
||||||
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
from helpdesk.views import kb
|
from helpdesk.views import kb
|
||||||
|
@ -1,15 +1,10 @@
|
|||||||
from helpdesk.models import (
|
|
||||||
Ticket,
|
|
||||||
Queue
|
|
||||||
)
|
|
||||||
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
|
from helpdesk.models import Queue, Ticket
|
||||||
|
|
||||||
|
|
||||||
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
from helpdesk.models import (
|
from helpdesk.models import KBCategory, KBItem
|
||||||
KBCategory,
|
|
||||||
KBItem
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def huser_from_request(req):
|
def huser_from_request(req):
|
||||||
|
@ -2,16 +2,18 @@
|
|||||||
#
|
#
|
||||||
# validators for file uploads, etc.
|
# validators for file uploads, etc.
|
||||||
|
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
# TODO: can we use the builtin Django validator instead?
|
# TODO: can we use the builtin Django validator instead?
|
||||||
# see:
|
# see:
|
||||||
# https://docs.djangoproject.com/en/4.0/ref/validators/#fileextensionvalidator
|
# https://docs.djangoproject.com/en/4.0/ref/validators/#fileextensionvalidator
|
||||||
|
|
||||||
|
|
||||||
def validate_file_extension(value):
|
def validate_file_extension(value):
|
||||||
import os
|
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
|
import os
|
||||||
ext = os.path.splitext(value.name)[1] # [0] returns path+filename
|
ext = os.path.splitext(value.name)[1] # [0] returns path+filename
|
||||||
# TODO: we might improve this with more thorough checks of file types
|
# TODO: we might improve this with more thorough checks of file types
|
||||||
# rather than just the extensions.
|
# rather than just the extensions.
|
||||||
|
@ -1,11 +1,10 @@
|
|||||||
|
from django.contrib.auth import get_user_model
|
||||||
|
from helpdesk.models import FollowUp, FollowUpAttachment, Ticket
|
||||||
|
from helpdesk.serializers import FollowUpAttachmentSerializer, FollowUpSerializer, TicketSerializer, UserSerializer
|
||||||
from rest_framework import viewsets
|
from rest_framework import viewsets
|
||||||
|
from rest_framework.mixins import CreateModelMixin
|
||||||
from rest_framework.permissions import IsAdminUser
|
from rest_framework.permissions import IsAdminUser
|
||||||
from rest_framework.viewsets import GenericViewSet
|
from rest_framework.viewsets import GenericViewSet
|
||||||
from rest_framework.mixins import CreateModelMixin
|
|
||||||
from django.contrib.auth import get_user_model
|
|
||||||
|
|
||||||
from helpdesk.models import Ticket, FollowUp, FollowUpAttachment
|
|
||||||
from helpdesk.serializers import TicketSerializer, UserSerializer, FollowUpSerializer, FollowUpAttachmentSerializer
|
|
||||||
|
|
||||||
|
|
||||||
class TicketViewSet(viewsets.ModelViewSet):
|
class TicketViewSet(viewsets.ModelViewSet):
|
||||||
|
@ -9,12 +9,12 @@ views/feeds.py - A handful of staff-only RSS feeds to provide ticket details
|
|||||||
|
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.syndication.views import Feed
|
from django.contrib.syndication.views import Feed
|
||||||
from django.urls import reverse
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.utils.translation import gettext as _
|
|
||||||
from django.shortcuts import get_object_or_404
|
from django.shortcuts import get_object_or_404
|
||||||
|
from django.urls import reverse
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
|
from helpdesk.models import FollowUp, Queue, Ticket
|
||||||
|
|
||||||
from helpdesk.models import Ticket, FollowUp, Queue
|
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
|
|
||||||
|
@ -8,12 +8,10 @@ views/kb.py - Public-facing knowledgebase views. The knowledgebase is a
|
|||||||
resolutions to common problems.
|
resolutions to common problems.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from django.http import HttpResponseRedirect, Http404
|
from django.http import Http404, HttpResponseRedirect
|
||||||
from django.shortcuts import render, get_object_or_404
|
from django.shortcuts import get_object_or_404, render
|
||||||
from django.views.decorators.clickjacking import xframe_options_exempt
|
from django.views.decorators.clickjacking import xframe_options_exempt
|
||||||
|
from helpdesk import settings as helpdesk_settings, user
|
||||||
from helpdesk import settings as helpdesk_settings
|
|
||||||
from helpdesk import user
|
|
||||||
from helpdesk.models import KBCategory, KBItem
|
from helpdesk.models import KBCategory, KBItem
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
|
||||||
|
|
||||||
from helpdesk.decorators import is_helpdesk_staff
|
from helpdesk.decorators import is_helpdesk_staff
|
||||||
|
|
||||||
|
|
||||||
|
@ -6,30 +6,29 @@ django-helpdesk - A Django powered ticket tracker for small enterprise.
|
|||||||
views/public.py - All public facing views, eg non-staff (no authentication
|
views/public.py - All public facing views, eg non-staff (no authentication
|
||||||
required) views.
|
required) views.
|
||||||
"""
|
"""
|
||||||
import logging
|
|
||||||
from importlib import import_module
|
|
||||||
|
|
||||||
from django.core.exceptions import (
|
|
||||||
ObjectDoesNotExist, PermissionDenied, ImproperlyConfigured,
|
from django.conf import settings
|
||||||
)
|
from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist, PermissionDenied
|
||||||
from django.urls import reverse
|
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from urllib.parse import quote
|
from django.urls import reverse
|
||||||
from django.utils.translation import gettext as _
|
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.clickjacking import xframe_options_exempt
|
||||||
from django.views.decorators.csrf import csrf_exempt
|
from django.views.decorators.csrf import csrf_exempt
|
||||||
from django.views.generic.base import TemplateView
|
from django.views.generic.base import TemplateView
|
||||||
from django.views.generic.edit import FormView
|
from django.views.generic.edit import FormView
|
||||||
|
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk import settings as helpdesk_settings
|
||||||
from helpdesk.decorators import protect_view, is_helpdesk_staff
|
from helpdesk.decorators import is_helpdesk_staff, protect_view
|
||||||
import helpdesk.views.staff as staff
|
|
||||||
import helpdesk.views.abstract_views as abstract_views
|
|
||||||
from helpdesk.lib import text_is_spam
|
from helpdesk.lib import text_is_spam
|
||||||
from helpdesk.models import Ticket, Queue, UserSettings
|
from helpdesk.models import Queue, Ticket, UserSettings
|
||||||
from helpdesk.user import huser_from_request
|
from helpdesk.user import huser_from_request
|
||||||
|
import helpdesk.views.abstract_views as abstract_views
|
||||||
|
import helpdesk.views.staff as staff
|
||||||
|
from importlib import import_module
|
||||||
|
import logging
|
||||||
|
from urllib.parse import quote
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -212,6 +211,7 @@ def view_ticket(request):
|
|||||||
|
|
||||||
if 'close' in request.GET and ticket.status == Ticket.RESOLVED_STATUS:
|
if 'close' in request.GET and ticket.status == Ticket.RESOLVED_STATUS:
|
||||||
from helpdesk.views.staff import update_ticket
|
from helpdesk.views.staff import update_ticket
|
||||||
|
|
||||||
# Trick the update_ticket() view into thinking it's being called with
|
# Trick the update_ticket() view into thinking it's being called with
|
||||||
# a valid POST.
|
# a valid POST.
|
||||||
request.POST = {
|
request.POST = {
|
||||||
|
@ -6,67 +6,75 @@ django-helpdesk - A Django powered ticket tracker for small enterprise.
|
|||||||
views/staff.py - The bulk of the application - provides most business logic and
|
views/staff.py - The bulk of the application - provides most business logic and
|
||||||
renders all staff-facing views.
|
renders all staff-facing views.
|
||||||
"""
|
"""
|
||||||
from copy import deepcopy
|
|
||||||
import json
|
|
||||||
|
|
||||||
|
from ..lib import format_time_spent
|
||||||
|
from ..templated_email import send_templated_mail
|
||||||
|
from copy import deepcopy
|
||||||
|
from datetime import date, datetime, timedelta
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
from django.contrib.auth.decorators import user_passes_test
|
from django.contrib.auth.decorators import user_passes_test
|
||||||
from django.contrib.contenttypes.models import ContentType
|
from django.contrib.contenttypes.models import ContentType
|
||||||
from django.urls import reverse, reverse_lazy
|
from django.core.exceptions import PermissionDenied, ValidationError
|
||||||
from django.core.exceptions import ValidationError, PermissionDenied
|
from django.core.paginator import EmptyPage, PageNotAnInteger, Paginator
|
||||||
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
|
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from django.http import HttpResponseRedirect, Http404, HttpResponse, JsonResponse
|
from django.http import Http404, HttpResponse, HttpResponseRedirect, JsonResponse
|
||||||
from django.shortcuts import render, get_object_or_404, redirect
|
from django.shortcuts import get_object_or_404, redirect, render
|
||||||
from django.utils.translation import gettext as _
|
from django.urls import reverse, reverse_lazy
|
||||||
from django.utils.html import escape
|
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from django.utils.html import escape
|
||||||
|
from django.utils.translation import gettext as _
|
||||||
from django.views.decorators.csrf import requires_csrf_token
|
from django.views.decorators.csrf import requires_csrf_token
|
||||||
from django.views.generic.edit import FormView, UpdateView
|
from django.views.generic.edit import FormView, UpdateView
|
||||||
|
from helpdesk import settings as helpdesk_settings
|
||||||
from helpdesk.forms import CUSTOMFIELD_DATE_FORMAT
|
|
||||||
from helpdesk.query import (
|
|
||||||
get_query_class,
|
|
||||||
query_to_base64,
|
|
||||||
query_from_base64,
|
|
||||||
)
|
|
||||||
|
|
||||||
from helpdesk.user import HelpdeskUser
|
|
||||||
|
|
||||||
from helpdesk.decorators import (
|
from helpdesk.decorators import (
|
||||||
helpdesk_staff_member_required, helpdesk_superuser_required,
|
helpdesk_staff_member_required,
|
||||||
is_helpdesk_staff
|
helpdesk_superuser_required,
|
||||||
|
is_helpdesk_staff,
|
||||||
|
superuser_required
|
||||||
)
|
)
|
||||||
from helpdesk.forms import (
|
from helpdesk.forms import (
|
||||||
TicketForm, UserSettingsForm, EmailIgnoreForm, EditTicketForm, TicketCCForm,
|
CUSTOMFIELD_DATE_FORMAT,
|
||||||
TicketCCEmailForm, TicketCCUserForm, EditFollowUpForm, TicketDependencyForm, MultipleTicketSelectForm
|
EditFollowUpForm,
|
||||||
)
|
EditTicketForm,
|
||||||
from helpdesk.decorators import superuser_required
|
EmailIgnoreForm,
|
||||||
from helpdesk.lib import (
|
MultipleTicketSelectForm,
|
||||||
safe_template_context,
|
TicketCCEmailForm,
|
||||||
process_attachments,
|
TicketCCForm,
|
||||||
queue_template_context,
|
TicketCCUserForm,
|
||||||
|
TicketDependencyForm,
|
||||||
|
TicketForm,
|
||||||
|
UserSettingsForm
|
||||||
)
|
)
|
||||||
|
from helpdesk.lib import process_attachments, queue_template_context, safe_template_context
|
||||||
from helpdesk.models import (
|
from helpdesk.models import (
|
||||||
Ticket, Queue, FollowUp, TicketChange, PreSetReply, FollowUpAttachment, SavedSearch,
|
CustomField,
|
||||||
IgnoreEmail, TicketCC, TicketDependency, UserSettings, CustomField, TicketCustomFieldValue,
|
FollowUp,
|
||||||
|
FollowUpAttachment,
|
||||||
|
IgnoreEmail,
|
||||||
|
PreSetReply,
|
||||||
|
Queue,
|
||||||
|
SavedSearch,
|
||||||
|
Ticket,
|
||||||
|
TicketCC,
|
||||||
|
TicketChange,
|
||||||
|
TicketCustomFieldValue,
|
||||||
|
TicketDependency,
|
||||||
|
UserSettings
|
||||||
)
|
)
|
||||||
from helpdesk import settings as helpdesk_settings
|
from helpdesk.query import get_query_class, query_from_base64, query_to_base64
|
||||||
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
from helpdesk.user import HelpdeskUser
|
||||||
from helpdesk.models import (KBItem)
|
|
||||||
|
|
||||||
import helpdesk.views.abstract_views as abstract_views
|
import helpdesk.views.abstract_views as abstract_views
|
||||||
from helpdesk.views.permissions import MustBeStaffMixin
|
from helpdesk.views.permissions import MustBeStaffMixin
|
||||||
from ..lib import format_time_spent
|
import json
|
||||||
|
import re
|
||||||
from rest_framework import status
|
from rest_framework import status
|
||||||
from rest_framework.decorators import api_view
|
from rest_framework.decorators import api_view
|
||||||
|
|
||||||
from datetime import date, datetime, timedelta
|
|
||||||
import re
|
|
||||||
|
|
||||||
from ..templated_email import send_templated_mail
|
if helpdesk_settings.HELPDESK_KB_ENABLED:
|
||||||
|
from helpdesk.models import KBItem
|
||||||
|
|
||||||
|
|
||||||
User = get_user_model()
|
User = get_user_model()
|
||||||
Query = get_query_class()
|
Query = get_query_class()
|
||||||
|
18
quicktest.py
18
quicktest.py
@ -6,12 +6,12 @@ $ source .venv/bin/activate
|
|||||||
$ pip install -r requirements-testing.txt -r requirements.txt
|
$ pip install -r requirements-testing.txt -r requirements.txt
|
||||||
$ python ./quicktest.py
|
$ python ./quicktest.py
|
||||||
"""
|
"""
|
||||||
import os
|
|
||||||
import sys
|
|
||||||
import argparse
|
|
||||||
|
|
||||||
|
import argparse
|
||||||
import django
|
import django
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
class QuickDjangoTest(object):
|
class QuickDjangoTest(object):
|
||||||
@ -36,14 +36,14 @@ class QuickDjangoTest(object):
|
|||||||
'django.contrib.sites',
|
'django.contrib.sites',
|
||||||
'django.contrib.staticfiles',
|
'django.contrib.staticfiles',
|
||||||
'bootstrap4form',
|
'bootstrap4form',
|
||||||
# The following commented apps are optional,
|
# The following commented apps are optional,
|
||||||
# related to teams functionalities
|
# related to teams functionalities
|
||||||
#'account',
|
# 'account',
|
||||||
#'pinax.invitations',
|
# 'pinax.invitations',
|
||||||
#'pinax.teams',
|
# 'pinax.teams',
|
||||||
'rest_framework',
|
'rest_framework',
|
||||||
'helpdesk',
|
'helpdesk',
|
||||||
#'reversion',
|
# 'reversion',
|
||||||
)
|
)
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
'django.middleware.security.SecurityMiddleware',
|
'django.middleware.security.SecurityMiddleware',
|
||||||
|
@ -6,3 +6,4 @@ argparse
|
|||||||
pbr
|
pbr
|
||||||
mock
|
mock
|
||||||
freezegun
|
freezegun
|
||||||
|
isort
|
||||||
|
9
setup.py
9
setup.py
@ -1,11 +1,14 @@
|
|||||||
import os
|
"""django-helpdesk setup"""
|
||||||
import sys
|
|
||||||
from distutils.util import convert_path
|
from distutils.util import convert_path
|
||||||
from fnmatch import fnmatchcase
|
from fnmatch import fnmatchcase
|
||||||
from setuptools import setup, find_packages
|
import os
|
||||||
|
from setuptools import find_packages, setup
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
version = '0.5.0a1'
|
version = '0.5.0a1'
|
||||||
|
|
||||||
|
|
||||||
# Provided as an attribute, so you can append to these instead
|
# Provided as an attribute, so you can append to these instead
|
||||||
# of replicating them:
|
# of replicating them:
|
||||||
standard_exclude = ("*.py", "*.pyc", "*$py.class", "*~", ".*", "*.bak")
|
standard_exclude = ("*.py", "*.pyc", "*$py.class", "*~", ".*", "*.bak")
|
||||||
|
Loading…
Reference in New Issue
Block a user