Merge from origin repo

This commit is contained in:
Tony Zhu 2014-10-20 14:12:40 -04:00
commit af1a297460
146 changed files with 17012 additions and 9189 deletions

View File

@ -1,12 +1,12 @@
language: python
python:
- "2.6"
- "2.7"
env:
- DJANGO=1.4.3
- DJANGO=1.3.5
- DJANGO=1.5.0
- DJANGO=1.5.10
- DJANGO=1.6.7
- DJANGO=1.7
install:
- pip install argparse --use-mirrors
- pip install -q Django==$DJANGO --use-mirrors
- pip install argparse
- pip install -q Django==$DJANGO
- pip install -q -r requirements.txt
script: python quicktest.py helpdesk

View File

@ -1,5 +1,5 @@
[main]
host = http://www.transifex.net
host = https://www.transifex.com
[django-helpdesk.core]
file_filter = helpdesk/locale/<lang>/LC_MESSAGES/django.po

View File

@ -1,6 +1,9 @@
django-helpdesk - A Django powered ticket tracker for small enterprise.
=======================================================================
.. image:: https://travis-ci.org/rossp/django-helpdesk.png?branch=master
:target: https://travis-ci.org/rossp/django-helpdesk
Copyright 2009-11 Jutda and Ross Poulton. All Rights Reserved. See LICENSE for details.
django-helpdesk was formerly known as Jutda Helpdesk, named after the
@ -22,12 +25,14 @@ LICENSE.3RDPARTY for license terms for included packages.
Dependencies (pre-flight checklist)
-----------------------------------
1. Python 2.5+
2. Django (1.3 or newer)
1. Python 2.6+
2. Django (1.4 or newer)
3. South for database migrations (highly recommended, but not required). Download from http://south.aeracode.org/
4. An existing WORKING Django project with database etc. If you
cannot log into the Admin, you won't get this product working.
5. You must have ``django.contrib.markup`` in your ``settings.INSTALLED_APPS`` setting.
5. `pip install django-bootstrap-form` and add `bootstrapform` to `settings.INSTALLED_APPS`
6. `pip install django-markdown-deux` and add `markdown_deux` to `settings.INSTALLED_APPS`
7. `pip install email-reply-parser` to get smart email reply handling
**NOTE REGARDING SQLITE AND SEARCHING:**
If you use sqlite as your database, the search function will not work as
@ -52,13 +57,6 @@ If you do NOT do this step, and you only want to use English-language templates,
you can continue however you will receive a warning when running the 'migrate'
commands.
Tagging
-------
If you use Django-tagging and want to tag your Helpdesk tickets, ensure that
django-tagging is installed and you have done a ``syncdb`` **before** you
add ``helpdesk`` to your ``INSTALLED_APPS``.
Fresh Django Installations
--------------------------
@ -110,3 +108,4 @@ Feel free to request access to contribute your translations.
Pull requests for all other changes are welcome. We're currently trying to add test cases wherever possible, so please continue to include tests with pull requests.
.. image:: https://secure.travis-ci.org/rossp/django-helpdesk.png?branch=master
:target: https://travis-ci.org/rossp/django-helpdesk

View File

@ -38,7 +38,9 @@ Adding To Your Django Project
'django.contrib.sites',
'django.contrib.admin', # Required for helpdesk admin/maintenance
'django.contrib.markup', # Required for helpdesk text display
'django.contrib.humanize', # Required for elapsed time formatting
'south', # Highly recommended to make database migrations simpler.
'markdown_deux', # Required for Knowledgebase item formatting
'helpdesk', # This is new!
)
@ -87,9 +89,9 @@ Adding To Your Django Project
Ideally, accessing http://MEDIA_URL/helpdesk/attachments/ will give you a 403 access denied error.
7. If it's not already installed, install ``python-markdown``::
7. If it's not already installed, install ``django-markdown-deux`` and ensure it's in your ``INSTALLED_APPS``::
pip install Markdown
pip install django-markdown-deux
8. If you already have a view handling your logins, then great! If not, add the following to ``settings.py`` to get your Django installation to use the login view included in ``django-helpdesk``::

View File

@ -36,32 +36,14 @@ These changes are visible throughout django-helpdesk
**Default:** ``HELPDESK_REDIRECT_TO_LOGIN_BY_DEFAULT = False``
- **HELPDESK_PREPEND_ORG_NAME** Customize helpdesk name on a few pages, i.e., your organization.
**Default:** ``HELPDESK_PREPEND_ORG_NAME = False``
- **HELPDESK_KB_ENABLED** show knowledgebase links?
**Default:** ``HELPDESK_KB_ENABLED = True``
- **HELDPESK_KB_ENABLED_STAFF** Show knowledgebase links for staff users?
**Default:** ``HELPDESK_KB_ENABLED_STAFF = False``
- **HELPDESK_NAVIGATION_ENABLED** Show extended navigation by default, to all users, irrespective of staff status?
**Default:** ``HELPDESK_NAVIGATION_ENABLED = False``
- **HELPDESK_NAVIGATION_STATS_ENABLED** Show 'stats' link in navigation bar for staff users?
**Default:** ``HELPDESK_NAVIGATION_STATS_ENABLED = True``
- **HELPDESK_SUPPORT_PERSON** Set this to an email address inside your organization and a footer below
the 'Powered by django-helpdesk' will be shown, telling the user whom to contact
in case they have technical problems.
**Default:** ``HELPDESK_SUPPORT_PERSON = ""``
- **HELPDESK_TRANSLATE_TICKET_COMMENTS** Show dropdown list of languages that ticket comments can be translated into via Google Translate?
**Default:** ``HELPDESK_TRANSLATE_TICKET_COMMENTS = False``
@ -78,14 +60,14 @@ These changes are visible throughout django-helpdesk
**Default:** ``HELPDESK_FOLLOWUP_MOD = False``
- **HELPDESK_CUSTOM_WELCOME** Show custom welcome message in dashboard?
**Default:** ``HELPDESK_CUSTOM_WELCOME = False``
- **HELPDESK_AUTO_SUBSCRIBE_ON_TICKET_RESPONSE** Auto-subscribe user to ticket as a 'CC' if (s)he responds to a ticket?
**Default:** ``HELPDESK_AUTO_SUBSCRIBE_ON_TICKET_RESPONSE = False``
- **HELPDESK_EMAIL_SUBJECT_TEMPLATE** Subject template for templated emails. ``%(subject)s`` represents the subject wording from the email template (e.g. "(Closed)").
**Default:** ``HELPDESK_EMAIL_SUBJECT_TEMPLATE = "{{ ticket.ticket }} {{ ticket.title|safe }} %(subject)s"``
Options shown on public pages
-----------------------------
@ -100,10 +82,6 @@ These options only change display of items on public-facing pages, not staff pag
**Default:** ``HELPDESK_SUBMIT_A_TICKET_PUBLIC = True``
- **HELPDESK_SHOW_KB_ON_HOMEPAGE** Should we should the KB categories on the homepage?
**Default:** ``HELPDESK_SHOW_KB_ON_HOMEPAGE = False``
Options that change ticket updates
----------------------------------
@ -121,21 +99,9 @@ Options that change ticket updates
**Default:** ``HELPDESK_SHOW_DELETE_BUTTON_SUPERUSER_FOLLOW_UP = False``
- **HELPDESK_SHOW_EDIT_BUTTON_TICKET_TOP** Show ticket edit button on top of ticket description?
**Default:** ``HELPDESK_SHOW_EDIT_BUTTON_TICKET_TOP = True``
- **HELPDESK_SHOW_DELETE_BUTTON_TICKET_TOP** Show ticket delete button on top of ticket description?
**Default:** ``HELPDESK_SHOW_DELETE_BUTTON_TICKET_TOP = True``
- **HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP** Show hold / unhold button on top of ticket description?
**Default:** ``HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP = True``
- **HELPDESK_UPDATE_PUBLIC_DEFAULT** Make all updates public by default? This will hide the 'is this update public' checkbox.
**Default:** ``HELPDESK_UPDATE_PUBLIC_DEFAULT = True``
**Default:** ``HELPDESK_UPDATE_PUBLIC_DEFAULT = False``
- **HELPDESK_STAFF_ONLY_TICKET_OWNERS** Only show staff users in ticket owner drop-downs?
@ -154,34 +120,6 @@ Staff Ticket Creation Settings
**Default:** ``HELPDESK_CREATE_TICKET_HIDE_ASSIGNED_TO = False``
Dashboard Settings
------------------
These will change the way the *dashboard* is displayed to staff users when they login.
- **HELPDESK_DASHBOARD_SHOW_DELETE_UNASSIGNED** Show delete button next to unassigned tickets?
**Default:** ``HELPDESK_DASHBOARD_SHOW_DELETE_UNASSIGNED = True``
- **HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES** Hide empty queues in dashboard overview?
**Default:** ``HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES = True``
- **HELPDESK_DASHBOARD_BASIC_TICKET_STATS** Show basic ticket stats on dashboard? This may have performance implications for busy helpdesks.
**Default:** ``HELPDESK_DASHBOARD_BASIC_TICKET_STATS = False``
Footer Display Settings
-----------------------
- **HELPDESK_FOOTER_SHOW_API_LINK** Show link to API documentation at bottom of page?
**Default:** ``HELPDESK_FOOTER_SHOW_API_LINK = True``
- **HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK** Show the 'change language' link at bottom of page? Useful if you have a multilingual helpdesk.
**Default:** ``HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK = False``
Default E-Mail Settings
-----------------------
@ -193,3 +131,37 @@ The following settings default to ``None`` but can be set as defaults, rather th
- ``QUEUE_EMAIL_BOX_HOST````
- ``QUEUE_EMAIL_BOX_USER``
- ``QUEUE_EMAIL_BOX_PASSWORD``
Discontinued Settings
---------------------
The following settings were defined in previous versions and are no longer supported.
- **HELPDESK_CUSTOM_WELCOME**
- **HELDPESK_KB_ENABLED_STAFF** Now always True
- **HELPDESK_NAVIGATION_STATS_ENABLED** Now always True
- **HELPDESK_PREPEND_ORG_NAME** Please customise your local `helpdesk/base.html` template if needed
- **HELPDESK_SHOW_DELETE_BUTTON_TICKET_TOP** Button is always shown
- **HELPDESK_SHOW_EDIT_BUTTON_TICKET_TOP** Button is always shown
- **HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP** Button is always shown
- **HELPDESK_SHOW_KB_ON_HOMEPAGE** KB categories are always shown on the homepage
- **HELPDESK_SUPPORT_PERSON** Please customise your local `helpdesk/attribution.html` template if needed
- **HELPDESK_DASHBOARD_SHOW_DELETE_UNASSIGNED** Button is always shown
- **HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES** Empty queues are always hidden
- **HELPDESK_DASHBOARD_BASIC_TICKET_STATS** Stats are always shown
- **HELPDESK_FOOTER_SHOW_API_LINK** Link to API documentation is always shown. Edit your local `helpdesk/base.html` template if needed.
- **HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK** Is never shown. Use your own template if required.

6
helpdesk/apps.py Normal file
View File

@ -0,0 +1,6 @@
from django.apps import AppConfig
class HelpdeskConfig(AppConfig):
name = 'helpdesk'
verbose_name = "Helpdesk"

View File

@ -13,8 +13,12 @@ from django import forms
from django.forms import extras
from django.core.files.storage import default_storage
from django.conf import settings
from django.contrib.auth.models import User
from django.utils.translation import ugettext as _
try:
from django.contrib.auth import get_user_model
User = get_user_model()
except ImportError:
from django.contrib.auth.models import User
try:
from django.utils import timezone
except ImportError:
@ -22,32 +26,13 @@ except ImportError:
from helpdesk.lib import send_templated_mail, safe_template_context
from helpdesk.models import Ticket, Queue, FollowUp, Attachment, IgnoreEmail, TicketCC, CustomField, TicketCustomFieldValue, TicketDependency
from helpdesk.settings import HAS_TAG_SUPPORT
from helpdesk import settings as helpdesk_settings
class EditTicketForm(forms.ModelForm):
class Meta:
model = Ticket
exclude = ('created', 'modified', 'status', 'on_hold', 'resolution', 'last_escalation', 'assigned_to')
def __init__(self, *args, **kwargs):
class CustomFieldMixin(object):
"""
Add any custom fields that are defined to the form
Mixin that provides a method to turn CustomFields into an actual field
"""
super(EditTicketForm, self).__init__(*args, **kwargs)
for field in CustomField.objects.all():
try:
current_value = TicketCustomFieldValue.objects.get(ticket=self.instance, field=field)
initial_value = current_value.value
except TicketCustomFieldValue.DoesNotExist:
initial_value = None
instanceargs = {
'label': field.label,
'help_text': field.help_text,
'required': field.required,
'initial': initial_value,
}
def customfield_to_field(self, field, instanceargs):
if field.data_type == 'varchar':
fieldclass = forms.CharField
instanceargs['max_length'] = field.max_length
@ -86,6 +71,32 @@ class EditTicketForm(forms.ModelForm):
self.fields['custom_%s' % field.name] = fieldclass(**instanceargs)
class EditTicketForm(CustomFieldMixin, forms.ModelForm):
class Meta:
model = Ticket
exclude = ('created', 'modified', 'status', 'on_hold', 'resolution', 'last_escalation', 'assigned_to')
def __init__(self, *args, **kwargs):
"""
Add any custom fields that are defined to the form
"""
super(EditTicketForm, self).__init__(*args, **kwargs)
for field in CustomField.objects.all():
try:
current_value = TicketCustomFieldValue.objects.get(ticket=self.instance, field=field)
initial_value = current_value.value
except TicketCustomFieldValue.DoesNotExist:
initial_value = None
instanceargs = {
'label': field.label,
'help_text': field.help_text,
'required': field.required,
'initial': initial_value,
}
self.customfield_to_field(field, instanceargs)
def save(self, *args, **kwargs):
@ -112,7 +123,7 @@ class EditFollowUpForm(forms.ModelForm):
model = FollowUp
exclude = ('date', 'user',)
class TicketForm(forms.Form):
class TicketForm(CustomFieldMixin, forms.Form):
queue = forms.ChoiceField(
label=_('Queue'),
required=True,
@ -176,17 +187,6 @@ class TicketForm(forms.Form):
help_text=_('You can attach a file such as a document or screenshot to this ticket.'),
)
if HAS_TAG_SUPPORT:
tags = forms.CharField(
max_length=255,
required=False,
widget=forms.TextInput(),
label=_('Tags'),
help_text=_('Words, separated by spaces, or phrases separated by commas. '
'These should communicate significant characteristics of this '
'ticket'),
)
def __init__(self, *args, **kwargs):
"""
Add any custom fields that are defined to the form
@ -198,44 +198,8 @@ class TicketForm(forms.Form):
'help_text': field.help_text,
'required': field.required,
}
if field.data_type == 'varchar':
fieldclass = forms.CharField
instanceargs['max_length'] = field.max_length
elif field.data_type == 'text':
fieldclass = forms.CharField
instanceargs['widget'] = forms.Textarea
instanceargs['max_length'] = field.max_length
elif field.data_type == 'integer':
fieldclass = forms.IntegerField
elif field.data_type == 'decimal':
fieldclass = forms.DecimalField
instanceargs['decimal_places'] = field.decimal_places
instanceargs['max_digits'] = field.max_length
elif field.data_type == 'list':
fieldclass = forms.ChoiceField
choices = field.choices_as_array
if field.empty_selection_list:
choices.insert(0, ('','---------' ) )
instanceargs['choices'] = choices
elif field.data_type == 'boolean':
fieldclass = forms.BooleanField
elif field.data_type == 'date':
fieldclass = forms.DateField
instanceargs['widget'] = extras.SelectDateWidget
elif field.data_type == 'time':
fieldclass = forms.TimeField
elif field.data_type == 'datetime':
fieldclass = forms.DateTimeField
elif field.data_type == 'email':
fieldclass = forms.EmailField
elif field.data_type == 'url':
fieldclass = forms.URLField
elif field.data_type == 'ipaddress':
fieldclass = forms.IPAddressField
elif field.data_type == 'slug':
fieldclass = forms.SlugField
self.fields['custom_%s' % field.name] = fieldclass(**instanceargs)
self.customfield_to_field(field, instanceargs)
def save(self, user):
@ -255,9 +219,6 @@ class TicketForm(forms.Form):
due_date = self.cleaned_data['due_date'],
)
if HAS_TAG_SUPPORT:
t.tags = self.cleaned_data['tags']
if self.cleaned_data['assigned_to']:
try:
u = User.objects.get(id=self.cleaned_data['assigned_to'])
@ -307,7 +268,7 @@ class TicketForm(forms.Form):
# Only files smaller than 512kb (or as defined in
# settings.MAX_EMAIL_ATTACHMENT_SIZE) are sent via email.
try:
files.append(a.file.path)
files.append([a.filename, a.file])
except NotImplementedError:
pass
@ -362,7 +323,7 @@ class TicketForm(forms.Form):
return t
class PublicTicketForm(forms.Form):
class PublicTicketForm(CustomFieldMixin, forms.Form):
queue = forms.ChoiceField(
label=_('Queue'),
required=True,
@ -421,43 +382,8 @@ class PublicTicketForm(forms.Form):
'help_text': field.help_text,
'required': field.required,
}
if field.data_type == 'varchar':
fieldclass = forms.CharField
instanceargs['max_length'] = field.max_length
elif field.data_type == 'text':
fieldclass = forms.CharField
instanceargs['widget'] = forms.Textarea
instanceargs['max_length'] = field.max_length
elif field.data_type == 'integer':
fieldclass = forms.IntegerField
elif field.data_type == 'decimal':
fieldclass = forms.DecimalField
instanceargs['decimal_places'] = field.decimal_places
instanceargs['max_digits'] = field.max_length
elif field.data_type == 'list':
fieldclass = forms.ChoiceField
choices = field.choices_as_array
if field.empty_selection_list:
choices.insert(0, ('','---------' ) )
instanceargs['choices'] = choices
elif field.data_type == 'boolean':
fieldclass = forms.BooleanField
elif field.data_type == 'date':
fieldclass = forms.DateField
elif field.data_type == 'time':
fieldclass = forms.TimeField
elif field.data_type == 'datetime':
fieldclass = forms.DateTimeField
elif field.data_type == 'email':
fieldclass = forms.EmailField
elif field.data_type == 'url':
fieldclass = forms.URLField
elif field.data_type == 'ipaddress':
fieldclass = forms.IPAddressField
elif field.data_type == 'slug':
fieldclass = forms.SlugField
self.fields['custom_%s' % field.name] = fieldclass(**instanceargs)
self.customfield_to_field(field, instanceargs)
def save(self):
"""
@ -515,7 +441,7 @@ class PublicTicketForm(forms.Form):
if file.size < getattr(settings, 'MAX_EMAIL_ATTACHMENT_SIZE', 512000):
# Only files smaller than 512kb (or as defined in
# settings.MAX_EMAIL_ATTACHMENT_SIZE) are sent via email.
files.append(a.file.path)
files.append([a.filename, a.file])
context = safe_template_context(t)
@ -597,6 +523,7 @@ class UserSettingsForm(forms.Form):
class EmailIgnoreForm(forms.ModelForm):
class Meta:
model = IgnoreEmail
exclude = []
class TicketCCForm(forms.ModelForm):
def __init__(self, *args, **kwargs):

View File

@ -45,8 +45,8 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b
fail_silently is passed to Django's mail routine. Set to 'True' to ignore
any errors at send time.
files can be a list of file paths to be attached, or it can be left blank.
eg ('/tmp/file1.txt', '/tmp/image.png')
files can be a list of tuple. Each tuple should be a filename to attach,
along with the File objects to be read. files can be blank.
"""
from django.conf import settings
@ -54,6 +54,7 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b
from django.template import loader, Context
from helpdesk.models import EmailTemplate
from helpdesk.settings import HELPDESK_EMAIL_SUBJECT_TEMPLATE
import os
context = Context(email_context)
@ -104,8 +105,9 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b
).render(context)
subject_part = loader.get_template_from_string(
"{{ ticket.ticket }} {{ ticket.title|safe }} %s" % t.subject
).render(context)
HELPDESK_EMAIL_SUBJECT_TEMPLATE % {
"subject": t.subject,
}).render(context)
if isinstance(recipients,(str,unicode)):
if recipients.find(','):
@ -113,7 +115,7 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b
elif type(recipients) != list:
recipients = [recipients,]
msg = EmailMultiAlternatives( subject_part,
msg = EmailMultiAlternatives( subject_part.replace('\n', ''),
text_part,
sender,
recipients,
@ -121,11 +123,11 @@ def send_templated_mail(template_name, email_context, recipients, sender=None, b
msg.attach_alternative(html_part, "text/html")
if files:
if type(files) != list:
files = [files,]
for file in files:
msg.attach_file(file)
for attachment in files:
file_to_attach = attachment[1]
file_to_attach.open()
msg.attach(filename=attachment[0], content=file_to_attach.read())
file_to_attach.close()
return msg.send(fail_silently)

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,7 @@
#
# Translators:
# Alberto Gaona <gaona_consulting@yahoo.com>, 2011
# anto987 <anto987@gmail.com>, 2012
# Antonio Storni <anto987@gmail.com>, 2012
# Erik Rivera <erik.river@gmail.com>, 2011
# Ross Poulton <ross@rossp.org>, 2011
msgid ""
@ -1072,12 +1072,18 @@ msgstr "Si - Eliminar"
msgid "Create Ticket"
msgstr "Crear Ticket"
#: templates/helpdesk/create_ticket.html:6
msgid ""
"<h2>Submit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>"
msgstr "<h2>Enviar nuevo ticket</h2>⏎ ⏎ <p>Salvo los indicados, todos los campos son obligatorios. Por favor ingrese la información y el título de la forma más descriptiva posible</p>"
#: templates/helpdesk/create_ticket.html:10
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Enviar un Ticket"
#: templates/helpdesk/create_ticket.html:11
msgid "Unless otherwise stated, all fields are required."
msgstr "Salvo los indicados, todos los campos son obligatorios."
#: templates/helpdesk/create_ticket.html:11
msgid "Please provide as descriptive a title and description as possible."
msgstr "Por favor ingrese la información y el título de la forma más descriptiva posible."
#: templates/helpdesk/create_ticket.html:17
#: templates/helpdesk/edit_ticket.html:19
@ -1179,13 +1185,16 @@ msgid "Edit Ticket"
msgstr "Editar Ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid ""
"<h2>Edit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>\n"
"\n"
"<p><strong>Note:</strong> Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.</p>"
msgstr "<h2>Editar ticket</h2>⏎ ⏎ <p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>⏎ ⏎ <p><strong>Note:</strong> Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.</p>"
msgid "Edit a Ticket"
msgstr "Editar ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid "Note"
msgstr ""
#: templates/helpdesk/edit_ticket.html:6
msgid "Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission."
msgstr ""
#: templates/helpdesk/edit_ticket.html:28
msgid "Save Changes"
@ -1437,15 +1446,9 @@ msgstr "Su Direcciójn de E-Mail"
msgid "View Ticket"
msgstr "Ver Ticket"
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Enviar Ticket"
#: templates/helpdesk/public_homepage.html:41
msgid ""
"All fields are required. Please provide as descriptive a title and "
"description as possible."
msgstr "Todos los campos son requeridos. Por favor ingrese un título y descripción."
msgid "All fields are required."
msgstr "Todos los campos son requeridos."
#: templates/helpdesk/public_homepage.html:67
msgid "Please use button at upper right to login first."

File diff suppressed because it is too large Load Diff

View File

@ -4,8 +4,8 @@
#
# Translators:
# Alberto Gaona <gaona_consulting@yahoo.com>, 2011
# apizano <apizano@gdl.cinvestav.mx>, 2013
# apizano <apizano@gdl.cinvestav.mx>, 2012
# Apizano <apizano@gdl.cinvestav.mx>, 2013
# Apizano <apizano@gdl.cinvestav.mx>, 2012
# Erik Rivera <erik.river@gmail.com>, 2011,2013
# Ross Poulton <ross@rossp.org>, 2011
msgid ""
@ -1054,10 +1054,8 @@ msgid ""
msgstr "\n<h2>Eliminar Consulta</h2>\n\n<p>¿Esta seguro de eliminar el filtro guardado (<em>%(query_title)s</em>)? Para recrearlo, necesita volver a filtrar manualmente su lista de tickets.</p>\n"
#: templates/helpdesk/confirm_delete_saved_query.html:11
msgid ""
"\n"
"<p>You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.</p>\n"
msgstr "\n<p>Has compartido esta consulta, entonces otros usuarios podrían estar usandola, si tu la eliminas ellos tienen que crear manualmente su propia consulta</p>\n"
msgid "You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query."
msgstr "Has compartido esta consulta, entonces otros usuarios podrían estar usandola, si tu la eliminas ellos tienen que crear manualmente su propia consulta"
#: templates/helpdesk/confirm_delete_saved_query.html:15
#: templates/helpdesk/delete_ticket.html:11
@ -1073,12 +1071,18 @@ msgstr "Sí, borrarlo"
msgid "Create Ticket"
msgstr "Crear Ticket"
#: templates/helpdesk/create_ticket.html:6
msgid ""
"<h2>Submit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>"
msgstr "<h2>Enviar un Ticket</h2>\n\n<p></p>"
#: templates/helpdesk/create_ticket.html:10
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Enviar un Ticket"
#: templates/helpdesk/create_ticket.html:11
msgid "Unless otherwise stated, all fields are required."
msgstr "A menos que se indique lo contrario, todos los campos son obligatorios."
#: templates/helpdesk/create_ticket.html:11
msgid "Please provide as descriptive a title and description as possible."
msgstr "Por favor use un título y descripción lo más claro posible."
#: templates/helpdesk/create_ticket.html:17
#: templates/helpdesk/edit_ticket.html:19
@ -1166,27 +1170,26 @@ msgstr "Tickets cerrados y resueltos en los que usted trabajó"
msgid "Delete Ticket"
msgstr "Borrar Ticket"
#: templates/helpdesk/delete_ticket.html:5
#: templates/helpdesk/delete_ticket.html:8
#, python-format
msgid ""
"\n"
"<h2>Delete Ticket</h2>\n"
"\n"
"<p>Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversably removed.</p>\n"
msgstr "\n<h2> Eliminar ticket </h2><p> ¿Está seguro que desea eliminar esta entrada <em>( %(ticket_title)s )?</em> Todos los rastros del ticket, incluyendo comentarios, archivos adjuntos y actualizaciones serán eliminados de forma irreversible. </p>\n"
msgid "Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversibly removed."
msgstr "¿Está seguro que desea eliminar esta entrada (<em>%(ticket_title)s</em>)? Todos los rastros del ticket, incluyendo comentarios, archivos adjuntos y actualizaciones serán eliminados de forma irreversible."
#: templates/helpdesk/edit_ticket.html:3
msgid "Edit Ticket"
msgstr "Editar Ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid ""
"<h2>Edit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>\n"
"\n"
"<p><strong>Note:</strong> Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.</p>"
msgstr "<h2> Editar un Ticket</h2>\n\n<p> A menos que se indique lo contrario, todos los campos son obligatorios. Por favor use un título y descripción lo más claro posible. </p>\n<p> <strong>Nota:</strong> La edición de un ticket <em>no</em> envía un correo electrónico al propietario del ticket o remitente. Este formato no es para añadir nuevos datos, sólo se debe utilizar para arreglar datos incorrectos o limpiar el ticket. </p>"
msgid "Edit a Ticket"
msgstr "Editar un Ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid "Note"
msgstr "Nota"
#: templates/helpdesk/edit_ticket.html:6
msgid "Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission."
msgstr "La edición de un ticket <em>no</em> envía un correo electrónico al propietario del ticket o remitente. Este formato no es para añadir nuevos datos, sólo se debe utilizar para arreglar datos incorrectos o limpiar el ticket."
#: templates/helpdesk/edit_ticket.html:28
msgid "Save Changes"
@ -1198,27 +1201,23 @@ msgid "Ignore E-Mail Address"
msgstr "Ignorar Dirección de E-mail"
#: templates/helpdesk/email_ignore_add.html:5
msgid ""
"\n"
"<h2>Ignore E-Mail Address</h2>\n"
"\n"
"<p>To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below.</p>\n"
"\n"
"<p>You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>.</p>"
msgstr "\n<h2>Ignorar dirección de E-Mail</h2>\n\n<p>Para ignorar una dirección e-mail y evitar que se creen tickets automáticos desde la misma, introduzca la dirección de e-mail abajo.</p>\n\n<p>Puede especificar tanto una dirección de correo completo, por ejemplo <em>email@dominio.com</em> o solo una parte de la dirección con un wildcard, como por ejemplo <em>*@dominio.com</em> o <em>usuario@*</em>.</p>"
msgid "To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below."
msgstr "Para ignorar una dirección e-mail y evitar que se creen tickets automáticos desde la misma, introduzca la dirección de e-mail abajo."
msgid "You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>."
msgstr "Puede especificar tanto una dirección de correo completo, por ejemplo <em>email@dominio.com</em> o solo una parte de la dirección con un wildcard, como por ejemplo <em>*@dominio.com</em> o <em>usuario@*</em>."
#: templates/helpdesk/email_ignore_del.html:3
msgid "Delete Ignored E-Mail Address"
msgstr "Borrar dirección de E-Mail Ignorada"
#: templates/helpdesk/email_ignore_del.html:5
msgid "Un-Ignore E-Mail Address"
msgstr "Readmitir dirección E-Mail"
#, python-format
msgid ""
"\n"
"<h2>Un-Ignore E-Mail Address</h2>\n"
"\n"
"<p>Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time.</p>\n"
msgstr "\n<h2>Readmitir dirección E-Mail</h2>\n\n<p>¿Está seguro de que quiere dejar de bloquear esta dirección de correo (<em>%(email_address)s</em>) y permitir que los correos de esta dirección creen tickets en el sistema? Puede añadir esta dirección e-mail en cualquier momento. </p>\n"
msgid "Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time."
msgstr "¿Está seguro de que quiere dejar de bloquear esta dirección de correo (<em>%(email_address)s</em>) y permitir que los correos de esta dirección creen tickets en el sistema? Puede añadir esta dirección e-mail en cualquier momento."
#: templates/helpdesk/email_ignore_del.html:11
msgid "Keep Ignoring It"
@ -1438,15 +1437,9 @@ msgstr "Su dirección de correo electrénico"
msgid "View Ticket"
msgstr "Ver Ticket"
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Enviar un Ticket"
#: templates/helpdesk/public_homepage.html:41
msgid ""
"All fields are required. Please provide as descriptive a title and "
"description as possible."
msgstr "Todos los campos son requeridos. Por favor incluya un título y una descripción tan explícitas como sea posible."
msgid "All fields are required."
msgstr "Todos los campos son requeridos."
#: templates/helpdesk/public_homepage.html:67
msgid "Please use button at upper right to login first."
@ -1457,13 +1450,14 @@ msgid "Unable To Open Ticket"
msgstr "No es posible abrir el Ticket"
#: templates/helpdesk/public_spam.html:6
msgid ""
"<p>Sorry, but there has been an error trying to submit your ticket.</p>\n"
"\n"
"<p>Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible.</p>\n"
"\n"
"<p>We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers.</p>\n"
msgstr "<p>Lo sentimos, pero se generó un error al tratar de ingresar su ticket.</p>\n\n<p>Nuestro sistema ha catalogado su envío como <strong>spam</strong>, por lo que no podemos guardarlo. Si no es spam, por favor presione atrás y reingrese su mensaje. Intente no ingresar palabras que puedan sonar a spam, y si tiene ligas en su mensaje trate de eliminarlas si es posible.</p>\n\n<p>Sentimos el inconveniente, pero necesitamos verificar el correo contra spam para evitar que nuestros recursos de helpdesk sean bloqueados por spammers.</p>\n"
msgid "Sorry, but there has been an error trying to submit your ticket."
msgstr "Lo sentimos, pero se generó un error al tratar de ingresar su ticket."
msgid "Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible."
msgstr "Nuestro sistema ha catalogado su envío como <strong>spam</strong>, por lo que no podemos guardarlo. Si no es spam, por favor presione atrás y reingrese su mensaje. Intente no ingresar palabras que puedan sonar a spam, y si tiene ligas en su mensaje trate de eliminarlas si es posible."
msgid "We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers."
msgstr "Sentimos el inconveniente, pero necesitamos verificar el correo contra spam para evitar que nuestros recursos de helpdesk sean bloqueados por spammers."
#: templates/helpdesk/public_view_form.html:8
msgid "Error:"

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

Binary file not shown.

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -3,14 +3,15 @@
# This file is distributed under the same license as the django-helpdesk package.
#
# Translators:
# brente <sbrentegani@gmail.com>, 2011, 2012
# Stefano Brentegani <sbrentegani@gmail.com>, 2013
# Stefano Brentegani <sbrentegani@gmail.com>, 2011, 2012
msgid ""
msgstr ""
"Project-Id-Version: django-helpdesk\n"
"Report-Msgid-Bugs-To: http://github.com/RossP/django-helpdesk/issues\n"
"POT-Creation-Date: 2012-08-07 20:40+1000\n"
"PO-Revision-Date: 2013-04-29 09:18+0000\n"
"Last-Translator: Ross Poulton <ross@rossp.org>\n"
"PO-Revision-Date: 2013-11-20 11:07+0000\n"
"Last-Translator: Stefano Brentegani <sbrentegani@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/projects/p/django-helpdesk/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -76,11 +77,11 @@ msgstr "Scadenza"
#: forms.py:171 forms.py:402
msgid "Attach File"
msgstr "Allega File"
msgstr "Allega un file"
#: forms.py:172 forms.py:403
msgid "You can attach a file such as a document or screenshot to this ticket."
msgstr "Puoi allegare al ticket un file, come un documento o una schermata."
msgstr "Puoi allegare al ticket un file, per esempio un documento o una schermata."
#: forms.py:180 templates/helpdesk/public_view_ticket.html:33
#: templates/helpdesk/ticket.html:182
@ -145,7 +146,7 @@ msgstr "Mostrare l'elenco dei ticket dopo il login?"
#: forms.py:554
msgid "Display the ticket list upon login? Otherwise, the dashboard is shown."
msgstr "Mostrare l'elenco dei ticket dopo il login? In caso contrario sarà visibile la dashboard."
msgstr "Mostrare l'elenco dei ticket dopo il login? In caso contrario sarà aperta la dashboard."
#: forms.py:559
msgid "E-mail me on ticket change?"
@ -159,7 +160,7 @@ msgstr "Se il ticket è assegnato a te, vuoi ricevere un'e-mail quando altri lo
#: forms.py:565
msgid "E-mail me when assigned a ticket?"
msgstr "Inviare un'e-mail quando viene assegnato un ticket?"
msgstr "Inviare un'e-mail quando ti viene assegnato un ticket?"
#: forms.py:566
msgid ""
@ -191,7 +192,7 @@ msgid ""
"When you submit a ticket, do you want to automatically use your e-mail "
"address as the submitter address? You can type a different e-mail address "
"when entering the ticket if needed, this option only changes the default."
msgstr "Quando crei un nuovo ticket, vuoi impostare automaticamente il tuo indirizzo e-mail come autore? Se necessario, puoi modificare l'indirizzo e-mail nel momento in cui crei il ticket: questa opzione definisce solo il default."
msgstr "Quando crei un nuovo ticket, vuoi impostare automaticamente il tuo indirizzo e-mail come autore? Se necessario, puoi modificare l'indirizzo e-mail nel momento in cui crei il ticket: questa opzione definisce solo il valore predefinito."
#: models.py:32 models.py:256 models.py:490 models.py:787 models.py:821
#: templates/helpdesk/dashboard.html:37 templates/helpdesk/dashboard.html:57
@ -209,7 +210,7 @@ msgstr "Slug"
msgid ""
"This slug is used when building ticket ID's. Once set, try not to change it "
"or e-mailing may get messy."
msgstr "Questo slug viene utilizzato per costruire gli ID dei ticket. Una volta impostato, cerca di non cambiarlo, o potrebbero verificarsi problemi con le e-mail."
msgstr "Lo slug viene utilizzato per costruire gli ID dei ticket. Una volta impostato, cerca di non cambiarlo, o potrebbero verificarsi problemi con le e-mail."
#: models.py:43 models.py:1015 models.py:1085 models.py:1159
#: templates/helpdesk/email_ignore_list.html:13
@ -221,7 +222,7 @@ msgstr "Indirizzo e-mail"
msgid ""
"All outgoing e-mails for this queue will use this e-mail address. If you use"
" IMAP or POP3, this should be the e-mail address for that mailbox."
msgstr "Tutti i messaggi inviati per questa coda useranno questo indirizzo e-mail. Se usi IMAP o POP3, questo dovrebbe essere l'indirizzo della casella postale."
msgstr "Tutti i messaggi inviati relativi a questa coda useranno questo indirizzo e-mail. Se usi IMAP o POP3, questo dovrebbe essere l'indirizzo della casella postale."
#: models.py:52 models.py:766
msgid "Locale"
@ -283,7 +284,7 @@ msgstr "Se definito, a questo indirizzo e-mail saranno inviate le notifiche di t
#: models.py:105
msgid "E-Mail Box Type"
msgstr "Tipo casella e-mail"
msgstr "Tipo di casella e-mail"
#: models.py:107
msgid "POP 3"
@ -328,7 +329,7 @@ msgstr "Usare SSL per l'e-mail?"
msgid ""
"Whether to use SSL for IMAP or POP3 - the default ports when using SSL are "
"993 for IMAP and 995 for POP3."
msgstr "Richiede di usare SSL per IMAP o POP3: quando si usa SSL, le porte di default sono 993 per IMAP e 995 per POP3."
msgstr "Attiva l'uso di SSL per IMAP o POP3: quando si usa SSL, le porte di default sono 993 per IMAP e 995 per POP3."
#: models.py:141
msgid "E-Mail Username"
@ -590,7 +591,7 @@ msgstr "Dimensione del file in byte"
msgid ""
"Leave blank to allow this reply to be used for all queues, or select those "
"queues you wish to limit this reply to."
msgstr "Se vuoto, questa risposta potrà essere utilizzata per qualsiasi coda, altrimenti seleziona le code a cui limitarne l'uso."
msgstr "Lascia vuoto se questa risposta potrà essere utilizzata per qualsiasi coda, altrimenti seleziona le code a cui limitarne l'uso."
#: models.py:668 models.py:709 models.py:1003
#: templates/helpdesk/email_ignore_list.html:13
@ -610,13 +611,13 @@ msgstr "Corpo"
msgid ""
"Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); {{ "
"queue }} - The queue; and {{ user }} - the current user."
msgstr "Contesto disponibile: {{ ticket }} - oggetto ticket (e.g. {{ ticket.title }}); {{ queue }} - La coda; e {{ user }} - l'utente attuale."
msgstr "Contesto disponibile: {{ ticket }} - oggetto ticket (e.g. {{ ticket.title }}); {{ queue }} - la coda; e {{ user }} - l'utente attuale."
#: models.py:703
msgid ""
"Leave blank for this exclusion to be applied to all queues, or select those "
"queues you wish to exclude with this entry."
msgstr "Se vuoto, questa esclusione sarà applicata a tutte le code, altrimenti seleziona le code interessate da questa esclusione."
msgstr "Lascia vuoto per applicare questa esclusione a tutte le code, altrimenti seleziona le code interessate da questa esclusione."
#: models.py:715
msgid "Date on which escalation should not happen"
@ -758,7 +759,7 @@ msgstr "Data in cui è stato aggiunto questo indirizzo e-mail"
msgid ""
"Enter a full e-mail address, or portions with wildcards, eg *@domain.com or "
"postmaster@*."
msgstr "Puoi specificare un indirizzo e-mail completo, o parti utilizzando caratteri speciali, per esempio *@domain.com o postmaster@*."
msgstr "Puoi specificare un indirizzo e-mail completo, o parziale utilizzando caratteri speciali, per esempio *@domain.com o postmaster@*."
#: models.py:1022
msgid "Save Emails in Mailbox?"
@ -896,7 +897,7 @@ msgstr "Valori dell'elenco"
#: models.py:1192
msgid "For list fields only. Enter one option per line."
msgstr "Solo per campi Elenco"
msgstr "Solo per campi Elenco. Una opzione per riga."
#: models.py:1198
msgid "Ordering"
@ -1050,10 +1051,8 @@ msgid ""
msgstr "\n<h2>Elimina ricerca</h2>\n\n<p>Confermi la cancellazione di questo filtro salvato (<em>%(query_title)s</em>)? Per ricrearlo dovrai filtrare nuovamente a mano l'elenco dei ticket.</p>\n"
#: templates/helpdesk/confirm_delete_saved_query.html:11
msgid ""
"\n"
"<p>You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.</p>\n"
msgstr "\n<p>Questa ricerca è condivisa, e altri utenti potrebbero usarla. Se la elimini dovranno creare manualmente un filtro equivalente.</p>\n"
msgid "You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query."
msgstr "Questa ricerca è condivisa, e altri utenti potrebbero usarla. Se la elimini dovranno creare manualmente un filtro equivalente."
#: templates/helpdesk/confirm_delete_saved_query.html:15
#: templates/helpdesk/delete_ticket.html:11
@ -1069,18 +1068,24 @@ msgstr "Sì, elimina"
msgid "Create Ticket"
msgstr "Crea ticket"
#: templates/helpdesk/create_ticket.html:6
msgid ""
"<h2>Submit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>"
msgstr "<h2>Crea un Ticket</h2>\n\n<p>Se non specificato altrimenti, tutti i campi sono obbligatori. Cerca di fornire un titolo e una descrizione il più significativi possibile.</p>"
#: templates/helpdesk/create_ticket.html:10
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Crea un Ticket"
#: templates/helpdesk/create_ticket.html:11
msgid "Unless otherwise stated, all fields are required."
msgstr "Se non specificato altrimenti, tutti i campi sono obbligatori."
#: templates/helpdesk/create_ticket.html:11
msgid "Please provide as descriptive a title and description as possible."
msgstr "Cerca di fornire un titolo e una descrizione il più significativi possibile."
#: templates/helpdesk/create_ticket.html:17
#: templates/helpdesk/edit_ticket.html:19
#: templates/helpdesk/public_homepage.html:50
msgid "(Optional)"
msgstr "(Opzionale)"
msgstr "(Facoltativo)"
#: templates/helpdesk/create_ticket.html:26
#: templates/helpdesk/public_homepage.html:59
@ -1159,30 +1164,30 @@ msgid "Closed & resolved Tickets you used to work on"
msgstr "Ticket chiusi e risolti su cui hai lavorato"
#: templates/helpdesk/delete_ticket.html:3
#: templates/helpdesk/delete_ticket.html:6
msgid "Delete Ticket"
msgstr "Elimina ticket"
#: templates/helpdesk/delete_ticket.html:5
#: templates/helpdesk/delete_ticket.html:8
#, python-format
msgid ""
"\n"
"<h2>Delete Ticket</h2>\n"
"\n"
"<p>Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversably removed.</p>\n"
msgstr "\n<h2>Elimina Ticket</h2>\n\n<p>Confermi di voler cancellare questo ticket (<em>%(ticket_title)s</em>)? Ogni traccia del ticket, incluse risposte, allegati, e aggiornamenti saranno irrimediabilmente eliminati.</p>\n"
msgid "Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversibly removed."
msgstr "Confermi la cancellazione di questo ticket (<em>%(ticket_title)s</em>)? Ogni traccia del ticket, incluse risposte, allegati, e aggiornamenti sarà irrimediabilmente eliminata."
#: templates/helpdesk/edit_ticket.html:3
msgid "Edit Ticket"
msgstr "Modifica ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid ""
"<h2>Edit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>\n"
"\n"
"<p><strong>Note:</strong> Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.</p>"
msgstr "<h2>Modifica un Ticket</h2>\n\n<p>Se non specificato altrimenti, tutti i campi sono obbligatori. Cerca di fornire un titolo e una descrizione il più significativi possibile.</p>\n\n<p><strong>Nota:</strong> La modifica di un ticket <em>non</em> comporta l'invio di un'e-mail all'assegnatario o all'autore. Evita di aggiungere nuovi dettagli: questo modulo dovrebbe essere utilizzato solo per correggere dettagli errati o ripulire la segnalazione.</p>"
msgid "Edit a Ticket"
msgstr "Modifica un Ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid "Note"
msgstr "Nota"
#: templates/helpdesk/edit_ticket.html:6
msgid "Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission."
msgstr "La modifica di un ticket <em>non</em> comporta l'invio di un'e-mail all'assegnatario o all'autore. Evita di aggiungere nuovi dettagli: questo modulo dovrebbe essere utilizzato solo per correggere dettagli errati o ripulire la segnalazione."
#: templates/helpdesk/edit_ticket.html:28
msgid "Save Changes"
@ -1194,27 +1199,23 @@ msgid "Ignore E-Mail Address"
msgstr "Ignora indirizzo e-mail"
#: templates/helpdesk/email_ignore_add.html:5
msgid ""
"\n"
"<h2>Ignore E-Mail Address</h2>\n"
"\n"
"<p>To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below.</p>\n"
"\n"
"<p>You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>.</p>"
msgstr "\n<h2>Ignora indirizzo e-mail</h2>\n\n<p>Inserisci un indirizzo e-mail da ignorare per evitare che per i messaggi ricevuti da esso vengano creati automaticamente dei ticket.</p>\n\n<p>Puoi specificare un indirizzo e-mail completo, come <em>email@dominio.com</em>, oppure uno parziale usando un carattere jolly, come <em>*@dominio.com</em> o <em>utente@*</em>.</p>"
msgid "To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below."
msgstr "Inserisci un indirizzo e-mail da ignorare per evitare che per i messaggi ricevuti da esso vengano creati automaticamente dei ticket."
msgid "You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>."
msgstr "Puoi specificare un indirizzo e-mail completo, come <em>email@dominio.com</em>, oppure uno parziale usando un carattere jolly, come <em>*@dominio.com</em> o <em>utente@*</em>."
#: templates/helpdesk/email_ignore_del.html:3
msgid "Delete Ignored E-Mail Address"
msgstr "Elimina indirizzo e-mail ignorato"
#: templates/helpdesk/email_ignore_del.html:5
msgid "Un-Ignore E-Mail Address"
msgstr "Ripristina indirizzo e-mail"
#, python-format
msgid ""
"\n"
"<h2>Un-Ignore E-Mail Address</h2>\n"
"\n"
"<p>Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time.</p>\n"
msgstr "\n<h2>Ripristina indirizzo e-mail</h2>\n\n<p>Confermi di non voler più ignorare questo indirizzo e-mail (<em>%(email_address)s</em>) e consentire che crei automaticamente ticket net tuo sistema? Potrai aggiungerlo nuovamente in qualsiasi momento.</p>\n"
msgid "Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time."
msgstr "Confermi di non voler più ignorare questo indirizzo e-mail (<em>%(email_address)s</em>) e consentire che crei automaticamente ticket net tuo sistema? Potrai aggiungerlo nuovamente in qualsiasi momento."
#: templates/helpdesk/email_ignore_del.html:11
msgid "Keep Ignoring It"
@ -1434,15 +1435,9 @@ msgstr "Il tuo indirizzo e-mail"
msgid "View Ticket"
msgstr "Vedi ticket"
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Crea un ticket"
#: templates/helpdesk/public_homepage.html:41
msgid ""
"All fields are required. Please provide as descriptive a title and "
"description as possible."
msgstr "Tutti i campi sono obbligatori. Cerca di fornire un titolo e una descrizione il più significativi possibile."
msgid "All fields are required."
msgstr "Tutti i campi sono obbligatori."
#: templates/helpdesk/public_homepage.html:67
msgid "Please use button at upper right to login first."
@ -1453,13 +1448,14 @@ msgid "Unable To Open Ticket"
msgstr "Impossibile aprire il ticket"
#: templates/helpdesk/public_spam.html:6
msgid ""
"<p>Sorry, but there has been an error trying to submit your ticket.</p>\n"
"\n"
"<p>Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible.</p>\n"
"\n"
"<p>We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers.</p>\n"
msgstr "<p>Ci dispiace, ma si è verificato un errore durante il salvataggio del tuo ticket.</p>\n\n<p>Il nostro sistema ha identificato la tua richiesta come <strong>spam</strong>, quindi non siamo in grado di elaborarla. Se non si tratta di spam, ti preghiamo di premere il tasto Indietro del browser e digitare nuovamente il testo. Se possibile, cerca di evitare termini che potrebbero essere scambiati per spam, e limita al massimo l'uso di link nel testo.</p>\n\n<p>Siamo spiacenti per il disagio, ma questo controllo è necessario per evitare che le risorse del nostro helpdesk finiscano oberate nella gestione dello spam.</p>\n"
msgid "Sorry, but there has been an error trying to submit your ticket."
msgstr "Ci dispiace, ma si è verificato un errore durante il salvataggio del tuo ticket."
msgid "Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible."
msgstr "Il nostro sistema ha identificato la tua richiesta come <strong>spam</strong>, quindi non siamo in grado di elaborarla. Se non si tratta di spam, ti preghiamo di premere il tasto Indietro del browser e digitare nuovamente il testo. Se possibile, cerca di evitare termini che potrebbero essere scambiati per spam, e limita al massimo l'uso di link nel testo."
msgid "We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers."
msgstr "Siamo spiacenti per il disagio, ma questo controllo è necessario per evitare che le risorse del nostro helpdesk finiscano oberate nella gestione dello spam."
#: templates/helpdesk/public_view_form.html:8
msgid "Error:"
@ -1607,13 +1603,8 @@ msgstr "Ticket aperti"
msgid "Change System Settings"
msgstr "Modifica le impostazioni di sistema"
#: templates/helpdesk/system_settings.html:5
msgid ""
"\n"
"<h2>System Settings</h2>\n"
"\n"
"<p>The following items can be maintained by you or other superusers:</p>"
msgstr "\n<h2>Impostazioni di sistema</h2>\n\n<p>Le seguenti impostazioni possono essere modificate da te o altri super-utenti:</p>"
msgid "The following items can be maintained by you or other superusers:"
msgstr "Le seguenti impostazioni possono essere modificate da te o altri super-utenti:"
#: templates/helpdesk/system_settings.html:11
msgid "E-Mail Ignore list"
@ -2089,12 +2080,8 @@ msgid "Change User Settings"
msgstr "Modifica preferenze utente"
#: templates/helpdesk/user_settings.html:14
msgid ""
"\n"
"<h2>User Settings</h2>\n"
"\n"
"<p>Use the following options to change the way your helpdesk system works for you. These settings do not impact any other user.</p>\n"
msgstr "\n<h2>Preferenze utente</h2>\n\n<p>Le seguenti impostazioni permettono di personalizzare il funzionamento del sistema di helpdesk. La loro modifica non ha effetto sugli altri utenti.</p>\n"
msgid "Use the following options to change the way your helpdesk system works for you. These settings do not impact any other user."
msgstr "Le seguenti impostazioni permettono di personalizzare il funzionamento del sistema di helpdesk. La loro modifica non ha effetto sugli altri utenti."
#: templates/helpdesk/user_settings.html:29
msgid "Save Options"
@ -2143,7 +2130,7 @@ msgstr "Password"
#: views/feeds.py:35
#, python-format
msgid "Helpdesk: Open Tickets in queue %(queue)s for %(username)s"
msgstr "Helpdesk: Ticket aperti per la coda %(queue)s per %(username)s"
msgstr "Helpdesk: Ticket aperti nella coda %(queue)s per %(username)s"
#: views/feeds.py:40
#, python-format
@ -2153,7 +2140,7 @@ msgstr "Helpdesk: Ticket aperti per %(username)s"
#: views/feeds.py:46
#, python-format
msgid "Open and Reopened Tickets in queue %(queue)s for %(username)s"
msgstr "Ticket aperti e riaperti per la coda %(queue)s per %(username)s"
msgstr "Ticket aperti e riaperti nella coda %(queue)s per %(username)s"
#: views/feeds.py:51
#, python-format
@ -2234,7 +2221,7 @@ msgid ""
"For more information, read the <a "
"href=\"http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-"
"matching\">Django Documentation on string matching in SQLite</a>."
msgstr "<p><strong>Attenzione</strong>: La tua ricerca per parole chiave distingue lettere maiuscole e minuscole per via del database. Questo significa che la ricerca <strong>non</strong> sarà accurata. Il passaggio a un sistema di database differente migliorerà la qualità delle ricerche! Per maggiori informazioni leggi la <a href=\"http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching\">documentazione di Django sulla ricerca testuale con SQLite</a> (in lingua inglese)."
msgstr "<p><strong>Attenzione</strong>: La tua ricerca per parole chiave distingue lettere maiuscole e minuscole per via del tipo di database utilizzato. Questo significa che la ricerca <strong>non</strong> sarà accurata. Il passaggio a un sistema di database differente migliorerebbe la qualità delle ricerche! Per maggiori informazioni leggi la <a href=\"http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching\">documentazione di Django sulla ricerca testuale con SQLite</a> (in lingua inglese)."
#: views/staff.py:843
msgid "Ticket taken off hold"

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
# This file is distributed under the same license as the django-helpdesk package.
#
# Translators:
# mpasternak <michal.dtz@gmail.com>, 2011
# Michał Pasternak <michal.dtz@gmail.com>, 2011
# Ross Poulton <ross@rossp.org>, 2011
# Tomasz Sanecki <tomasz@sanecki.net>, 2012
msgid ""
@ -1052,10 +1052,8 @@ msgid ""
msgstr "\n<h2>Usuń zapytanie</h2>\n\n<p>Czy rzeczywiście chcesz usunąć zapisany filtr (<em>%(query_title)s</em>)? Aby go ponownie utworzyć, musisz ponownie ręcznie przefiltrować listę zgłoszeń.</p>\n"
#: templates/helpdesk/confirm_delete_saved_query.html:11
msgid ""
"\n"
"<p>You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.</p>\n"
msgstr "\n<p>Udostępniłeś to zapytanie więc inni użytkownicy mogą go używać. Jeśli je usuniesz, będą musieli sami odtworzyć to zapytanie.</p>\n"
msgid "You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query."
msgstr "Udostępniłeś to zapytanie więc inni użytkownicy mogą go używać. Jeśli je usuniesz, będą musieli sami odtworzyć to zapytanie."
#: templates/helpdesk/confirm_delete_saved_query.html:15
#: templates/helpdesk/delete_ticket.html:11
@ -1071,12 +1069,18 @@ msgstr "Tak, usuń to"
msgid "Create Ticket"
msgstr "Utwórz zgłoszenie"
#: templates/helpdesk/create_ticket.html:6
msgid ""
"<h2>Submit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>"
msgstr "<h2>Utwórz zgłoszenie</h2>\n\n<p>Jeżeli nie zaznaczono inaczej, wszystkie pola są wymagane. Postaraj się aby tytuł i opis dostarczały jak najwięcej informacji.</p>"
#: templates/helpdesk/create_ticket.html:10
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Utwórz zgłoszenie"
#: templates/helpdesk/create_ticket.html:11
msgid "Unless otherwise stated, all fields are required."
msgstr "Jeżeli nie zaznaczono inaczej, wszystkie pola są wymagane."
#: templates/helpdesk/create_ticket.html:11
msgid "Please provide as descriptive a title and description as possible."
msgstr "Postaraj się aby tytuł i opis dostarczały jak najwięcej informacji."
#: templates/helpdesk/create_ticket.html:17
#: templates/helpdesk/edit_ticket.html:19
@ -1164,27 +1168,26 @@ msgstr "Zamknięte i rozwiązane zgłoszenia nad którymi pracowałeś"
msgid "Delete Ticket"
msgstr "Usuń zgłoszenie"
#: templates/helpdesk/delete_ticket.html:5
#: templates/helpdesk/delete_ticket.html:8
#, python-format
msgid ""
"\n"
"<h2>Delete Ticket</h2>\n"
"\n"
"<p>Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversably removed.</p>\n"
msgstr "\n<h2>Usuń zgłoszenie</h2>\n\n<p>Czy rzeczywiście chcesz usunąć zgłoszenie (<em>%(ticket_title)s</em>)? Wszelkie ślady po tym zgłoszeniu, wliczając kontynuacje, załączniki i aktualizacje, będą bezpowrotnie usunięte</p>\n"
msgid "Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversibly removed."
msgstr "Czy rzeczywiście chcesz usunąć zgłoszenie (<em>%(ticket_title)s</em>)? Wszelkie ślady po tym zgłoszeniu, wliczając kontynuacje, załączniki i aktualizacje, będą bezpowrotnie usunięte"
#: templates/helpdesk/edit_ticket.html:3
msgid "Edit Ticket"
msgstr "Edytuj zgłoszenie"
#: templates/helpdesk/edit_ticket.html:6
msgid ""
"<h2>Edit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>\n"
"\n"
"<p><strong>Note:</strong> Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.</p>"
msgstr "<h2>Edytuj zgłoszenie</h2>\n\n<p>Jeżeli nie zaznaczono inaczej, wszystkie pola są wymagane. Postaraj się aby tytuł i opis zawierały możliwie jak najwięcej informacji.</p>\n\n<p><strong>Uwaga:</strong> Edycja zgłoszenia <em>nie powoduje</em> wysłania e-maila do właściciela lub zgłaszającego. Nie podawaj żadnych nowych szczegółów - formularz ten służy jedynie do poprawki detali i oczyszczania zgłoszenia.</p>"
msgid "Edit a Ticket"
msgstr "Edytuj zgłoszenie"
#: templates/helpdesk/edit_ticket.html:6
msgid "Note"
msgstr "Uwaga"
#: templates/helpdesk/edit_ticket.html:6
msgid "Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission."
msgstr "Edycja zgłoszenia <em>nie powoduje</em> wysłania e-maila do właściciela lub zgłaszającego. Nie podawaj żadnych nowych szczegółów - formularz ten służy jedynie do poprawki detali i oczyszczania zgłoszenia."
#: templates/helpdesk/edit_ticket.html:28
msgid "Save Changes"
@ -1436,14 +1439,8 @@ msgstr "Twój adres e-mail"
msgid "View Ticket"
msgstr "Wyświetl zgłoszenie"
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Utwórz zgłoszenie"
#: templates/helpdesk/public_homepage.html:41
msgid ""
"All fields are required. Please provide as descriptive a title and "
"description as possible."
msgid "All fields are required."
msgstr ""
#: templates/helpdesk/public_homepage.html:67
@ -1609,13 +1606,8 @@ msgstr "Otwarte zgłoszenia"
msgid "Change System Settings"
msgstr "Zmień ustawienia systemu"
#: templates/helpdesk/system_settings.html:5
msgid ""
"\n"
"<h2>System Settings</h2>\n"
"\n"
"<p>The following items can be maintained by you or other superusers:</p>"
msgstr "\n<h2>Ustawienia systemu</h2>\n\n<p>Poniższe pozycje mogą być zarządzane przez ciebie oraz innych uprawnionych użytkowników:</p>"
msgid "The following items can be maintained by you or other superusers:"
msgstr "Poniższe pozycje mogą być zarządzane przez ciebie oraz innych uprawnionych użytkowników:"
#: templates/helpdesk/system_settings.html:11
msgid "E-Mail Ignore list"

View File

@ -3,19 +3,19 @@
# This file is distributed under the same license as the django-helpdesk package.
#
# Translators:
# alemp <alemp@alemp.com.br>, 2013
# macaba <lixo@macaba.com.br>, 2013
# Alessandro Pinto <alemp@alemp.com.br>, 2013
# Daniel de Abreu Mendes <lixo@macaba.com.br>, 2013
# Gabriel Galiaso <gabrielgaliaso@gmail.com>, 2012-2013
# Gabriel Galiaso <gabrielgaliaso@gmail.com>, 2011
# rafaelcapucho <rafael.capucho@gmail.com>, 2013
# Rafael Capucho <rafael.capucho@gmail.com>, 2013
# Ross Poulton <ross@rossp.org>, 2011
msgid ""
msgstr ""
"Project-Id-Version: django-helpdesk\n"
"Report-Msgid-Bugs-To: http://github.com/RossP/django-helpdesk/issues\n"
"POT-Creation-Date: 2012-08-07 20:40+1000\n"
"PO-Revision-Date: 2013-08-22 02:49+0000\n"
"Last-Translator: alemp <alemp@alemp.com.br>\n"
"PO-Revision-Date: 2013-11-20 11:07+0000\n"
"Last-Translator: Alessandro Pinto <alemp@alemp.com.br>\n"
"Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/django-helpdesk/language/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@ -1055,10 +1055,8 @@ msgid ""
msgstr "\n⏎<h2>Apagar Consulta</h2>⏎ ⏎ <p>Você tem certeza que quer apagar este filtro salvo (<em>%(query_title)s</em>)? Para recria-lo, você precisará refiltrar manualmente a sua lista de ticket.</p>⏎\n"
#: templates/helpdesk/confirm_delete_saved_query.html:11
msgid ""
"\n"
"<p>You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.</p>\n"
msgstr "\n⏎ <p>Você compartilhou esta consulta para que outros usuários possam usar. Se você apaga-la, eles terão que criar manualmente sua própria consulta.</p>⏎\n"
msgid "You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query."
msgstr "Você compartilhou esta consulta para que outros usuários possam usar. Se você apaga-la, eles terão que criar manualmente sua própria consulta."
#: templates/helpdesk/confirm_delete_saved_query.html:15
#: templates/helpdesk/delete_ticket.html:11
@ -1074,12 +1072,18 @@ msgstr "Sim - Delete Isso"
msgid "Create Ticket"
msgstr "Criar Ticket"
#: templates/helpdesk/create_ticket.html:6
msgid ""
"<h2>Submit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>"
msgstr "<h2>Enviar Ticket</h2>⏎ ⏎ <p>Todos os campos são obrigatórios, até aviso contrário. Por favor, descreva tudo o que for possível nos campos de título e descrição.</p>"
#: templates/helpdesk/create_ticket.html:10
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Enviar Ticket"
#: templates/helpdesk/create_ticket.html:11
msgid "Unless otherwise stated, all fields are required."
msgstr "Todos os campos são obrigatórios, até aviso contrário."
#: templates/helpdesk/create_ticket.html:11
msgid "Please provide as descriptive a title and description as possible."
msgstr "Por favor, descreva tudo o que for possível nos campos de título e descrição."
#: templates/helpdesk/create_ticket.html:17
#: templates/helpdesk/edit_ticket.html:19
@ -1164,30 +1168,30 @@ msgid "Closed & resolved Tickets you used to work on"
msgstr "Tickets Fechados & Resolvidos por você"
#: templates/helpdesk/delete_ticket.html:3
#: templates/helpdesk/delete_ticket.html:6
msgid "Delete Ticket"
msgstr "Deletar Ticket"
#: templates/helpdesk/delete_ticket.html:5
#: templates/helpdesk/delete_ticket.html:8
#, python-format
msgid ""
"\n"
"<h2>Delete Ticket</h2>\n"
"\n"
"<p>Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversably removed.</p>\n"
msgstr "\n<h2>Apagar Ticket</h2>\n\n<p>Tem certeza de que deseja excluir este bilhete (<em>%(ticket_title)s</ em>)? Todos os históricos do ticket, incluindo follow-ups, anexos e atualizações serão irreversivelmente removidos. </p>\n"
msgid "Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversibly removed."
msgstr "Tem certeza de que deseja excluir este bilhete (<em>%(ticket_title)s</ em>)? Todos os históricos do ticket, incluindo follow-ups, anexos e atualizações serão irreversivelmente removidos."
#: templates/helpdesk/edit_ticket.html:3
msgid "Edit Ticket"
msgstr "Editar Ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid ""
"<h2>Edit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>\n"
"\n"
"<p><strong>Note:</strong> Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.</p>"
msgstr "<h2>Editar Ticket</h2>\n\n<p>Salvo disposição em contrário, todos os campos são obrigatórios. Por favor, forneça o mais descritivo um título e uma descrição possível.</p>\n\n<p><strong>Nota:</strong> Edição de um ticket <em>não</ em> envia um e-mail para o dono do ticket ou solicitante. Novos detalhes devem ser inseridos, este formulário deve ser usado apenas para corrigir dados incorretos ou limpar a sua apresentação.</p>"
msgid "Edit a Ticket"
msgstr "Editar Ticket"
#: templates/helpdesk/edit_ticket.html:6
msgid "Note"
msgstr "Nota"
#: templates/helpdesk/edit_ticket.html:6
msgid "Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission."
msgstr "Edição de um ticket <em>não</em> envia um e-mail para o dono do ticket ou solicitante. Novos detalhes devem ser inseridos, este formulário deve ser usado apenas para corrigir dados incorretos ou limpar a sua apresentação."
#: templates/helpdesk/edit_ticket.html:28
msgid "Save Changes"
@ -1199,27 +1203,23 @@ msgid "Ignore E-Mail Address"
msgstr "Ignorar Endereço de E-Mail"
#: templates/helpdesk/email_ignore_add.html:5
msgid ""
"\n"
"<h2>Ignore E-Mail Address</h2>\n"
"\n"
"<p>To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below.</p>\n"
"\n"
"<p>You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>.</p>"
msgstr "\n<h2>Ignorar E-Mail</h2>\n\n<p>Para ignorar um endereço de e-mail e evitar e-mails daquele endereço criando bilhetes automaticamente, insira o endereço de e-mail abaixo.</p>\n\n<p>Você pode digitar um endereço de e-mail inteiro, como <em>email@domain.com</em> ou umpedaço de um e-mail com um curinga, como <em>*@domain.com</em > ou <em>user@* </em>. </p>"
msgid "To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below."
msgstr "Para ignorar um endereço de e-mail e evitar e-mails daquele endereço criando bilhetes automaticamente, insira o endereço de e-mail abaixo."
msgid "You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>."
msgstr "Você pode digitar um endereço de e-mail inteiro, como <em>email@domain.com</em> ou umpedaço de um e-mail com um curinga, como <em>*@domain.com</em > ou <em>user@*</em>."
#: templates/helpdesk/email_ignore_del.html:3
msgid "Delete Ignored E-Mail Address"
msgstr "Deletar Endereços de E-Mail Ignorados"
#: templates/helpdesk/email_ignore_del.html:5
msgid "Un-Ignore E-Mail Address"
msgstr "Voltar E-Mail"
#, python-format
msgid ""
"\n"
"<h2>Un-Ignore E-Mail Address</h2>\n"
"\n"
"<p>Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time.</p>\n"
msgstr "\n<h2>Voltar E-Mail</h2>\n\n<p>Tem certeza de que deseja parar de remover este endereço de e-mail (<em>%(email_address)s</em>) e permitir que seus e-mails criem automaticamente tickets em seu sistema? Você pode voltar a adicionar este endereço de e-mail a qualquer momento. </p>\n"
msgid "Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time."
msgstr "Tem certeza de que deseja parar de remover este endereço de e-mail (<em>%(email_address)s</em>) e permitir que seus e-mails criem automaticamente tickets em seu sistema? Você pode voltar a adicionar este endereço de e-mail a qualquer momento."
#: templates/helpdesk/email_ignore_del.html:11
msgid "Keep Ignoring It"
@ -1439,15 +1439,9 @@ msgstr "Seu Endereço de E-Mail"
msgid "View Ticket"
msgstr "Ver Ticket"
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Enviar um Ticket"
#: templates/helpdesk/public_homepage.html:41
msgid ""
"All fields are required. Please provide as descriptive a title and "
"description as possible."
msgstr "Todos os campos são obrigatórios. Por favor, providencie o mais detalhadamente possível as informações sobre Título e Descrição."
msgid "All fields are required."
msgstr "Todos os campos são obrigatórios."
#: templates/helpdesk/public_homepage.html:67
msgid "Please use button at upper right to login first."
@ -1458,13 +1452,14 @@ msgid "Unable To Open Ticket"
msgstr "Impossível Abrir o Ticket"
#: templates/helpdesk/public_spam.html:6
msgid ""
"<p>Sorry, but there has been an error trying to submit your ticket.</p>\n"
"\n"
"<p>Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible.</p>\n"
"\n"
"<p>We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers.</p>\n"
msgstr "<p>Desculpe, mas houve um erro ao tentar enviar o seu ticket.</p>\n\n<p>Nosso sistema tem marcado a sua apresentação como <strong>spam</strong>, de modo que não são capazes de salvá-lo. Se isso não é spam, por favor, pressione voltar e re-digite sua mensagem. Tenha cuidado para evitar 'spam'.</p>\n\n<p>Lamentamos por qualquer inconveniente, porém essa verificação é necessária para evitar que nossos recursos de suporte técnico esteja sendo sobrecarregado por spammers.</p>\n"
msgid "Sorry, but there has been an error trying to submit your ticket."
msgstr "Desculpe, mas houve um erro ao tentar enviar o seu ticket."
msgid "Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible."
msgstr "Nosso sistema tem marcado a sua apresentação como <strong>spam</strong>, de modo que não são capazes de salvá-lo. Se isso não é spam, por favor, pressione voltar e re-digite sua mensagem. Tenha cuidado para evitar 'spam'."
msgid "We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers."
msgstr "Lamentamos por qualquer inconveniente, porém essa verificação é necessária para evitar que nossos recursos de suporte técnico esteja sendo sobrecarregado por spammers."
#: templates/helpdesk/public_view_form.html:8
msgid "Error:"
@ -1612,13 +1607,8 @@ msgstr "Tickets Abertos"
msgid "Change System Settings"
msgstr "Alterar Configuração do Sistema"
#: templates/helpdesk/system_settings.html:5
msgid ""
"\n"
"<h2>System Settings</h2>\n"
"\n"
"<p>The following items can be maintained by you or other superusers:</p>"
msgstr "\n<h2>Configurações do Sistema</h2>\n\n<p>Os itens a seguir podem ser mantidos por você ou outros super-usuários:</p>"
msgid "The following items can be maintained by you or other superusers:"
msgstr "Os itens a seguir podem ser mantidos por você ou outros super-usuários:"
#: templates/helpdesk/system_settings.html:11
msgid "E-Mail Ignore list"
@ -2094,12 +2084,8 @@ msgid "Change User Settings"
msgstr "Alterar Configuração de Usuário"
#: templates/helpdesk/user_settings.html:14
msgid ""
"\n"
"<h2>User Settings</h2>\n"
"\n"
"<p>Use the following options to change the way your helpdesk system works for you. These settings do not impact any other user.</p>\n"
msgstr "\n<h2>Configuração de Usuário</h2>\n\n<p>Utilize as seguintes opções para alterar a forma como o sistema funciona para você. Essas configurações não afetam qualquer outro usuário.</p>\n"
msgid "Use the following options to change the way your helpdesk system works for you. These settings do not impact any other user."
msgstr "Utilize as seguintes opções para alterar a forma como o sistema funciona para você. Essas configurações não afetam qualquer outro usuário."
#: templates/helpdesk/user_settings.html:29
msgid "Save Options"

View File

@ -1053,10 +1053,8 @@ msgid ""
msgstr "\n<h2>Удалить запрос</h2>\n\n<p>Вы уверены что вы хотите удалить сохранённый фильтр (<em>%(query_title)s</em>)? Что бы пересоздать его, вам придётся заново перефильтровать ваши тикеты из списка.</p>\n"
#: templates/helpdesk/confirm_delete_saved_query.html:11
msgid ""
"\n"
"<p>You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.</p>\n"
msgstr "\n<p>Вы поделились запросом, теперь остальные пользователи могут его использовать. Если вы удалите его, им придётся сделать себе собственный запрос.</p>\n"
msgid "You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query."
msgstr "Вы поделились запросом, теперь остальные пользователи могут его использовать. Если вы удалите его, им придётся сделать себе собственный запрос."
#: templates/helpdesk/confirm_delete_saved_query.html:15
#: templates/helpdesk/delete_ticket.html:11
@ -1072,12 +1070,18 @@ msgstr "Удалить"
msgid "Create Ticket"
msgstr "Создать тикет"
#: templates/helpdesk/create_ticket.html:6
msgid ""
"<h2>Submit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>"
msgstr "<h2>Отправить тикет</h2>\n\n<p>Все поля обязательны для заполнения пока не сказано обратное. Пожалуйста, напишите заголовок и описание как можно более точно отображающими суть проблемы.</p>"
#: templates/helpdesk/create_ticket.html:10
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Отправить тикет"
#: templates/helpdesk/create_ticket.html:11
msgid "Unless otherwise stated, all fields are required."
msgstr "Все поля обязательны для заполнения пока не сказано обратное."
#: templates/helpdesk/create_ticket.html:11
msgid "Please provide as descriptive a title and description as possible."
msgstr "Пожалуйста, напишите заголовок и описание как можно более точно отображающими суть проблемы."
#: templates/helpdesk/create_ticket.html:17
#: templates/helpdesk/edit_ticket.html:19
@ -1165,27 +1169,26 @@ msgstr "Закрыт и решены тикеты, связанные с вам
msgid "Delete Ticket"
msgstr "Удалить тикет"
#: templates/helpdesk/delete_ticket.html:5
#: templates/helpdesk/delete_ticket.html:8
#, python-format
msgid ""
"\n"
"<h2>Delete Ticket</h2>\n"
"\n"
"<p>Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversably removed.</p>\n"
msgstr "\n<h2>Удалить тикет</h2>\n\n<p>Вы уверены что хотите удалить этот тикет (<em>%(ticket_title)s</em>)? Все следы тикета, включая наблюдения, вложенные файлы и обновления будут безвозвратно удалены.</p>\n"
msgid "Are you sure you want to delete this ticket (<em>%(ticket_title)s</em>)? All traces of the ticket, including followups, attachments, and updates will be irreversibly removed."
msgstr "Вы уверены что хотите удалить этот тикет (<em>%(ticket_title)s</em>)? Все следы тикета, включая наблюдения, вложенные файлы и обновления будут безвозвратно удалены."
#: templates/helpdesk/edit_ticket.html:3
msgid "Edit Ticket"
msgstr "Редактировать тикет"
#: templates/helpdesk/edit_ticket.html:6
msgid ""
"<h2>Edit a Ticket</h2>\n"
"\n"
"<p>Unless otherwise stated, all fields are required. Please provide as descriptive a title and description as possible.</p>\n"
"\n"
"<p><strong>Note:</strong> Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission.</p>"
msgstr "<h2>Редактирование Тикета</h2>\n\n<p>Если не указано иное, все поля обязательны для заполнения. Пожалуйста, по возможности, дайте понятный заголовок и описание.</p>\n\n<p><strong>Замечание:</strong> Редактирование тикета <em>не отправляет</em> сообщение по электронной почте владельцу или отправителю талона. Не добавляйте новых подробностей в талон. Эта форма только для исправления или уточнения проблемы.</p>"
msgid "Edit a Ticket"
msgstr "Редактирование Тикета"
#: templates/helpdesk/edit_ticket.html:6
msgid "Note"
msgstr "Замечание"
#: templates/helpdesk/edit_ticket.html:6
msgid "Editing a ticket does <em>not</em> send an e-mail to the ticket owner or submitter. No new details should be entered, this form should only be used to fix incorrect details or clean up the submission."
msgstr "Редактирование тикета <em>не отправляет</em> сообщение по электронной почте владельцу или отправителю талона. Не добавляйте новых подробностей в талон. Эта форма только для исправления или уточнения проблемы."
#: templates/helpdesk/edit_ticket.html:28
msgid "Save Changes"
@ -1197,27 +1200,23 @@ msgid "Ignore E-Mail Address"
msgstr "Игнорировать адрес электронной почты"
#: templates/helpdesk/email_ignore_add.html:5
msgid ""
"\n"
"<h2>Ignore E-Mail Address</h2>\n"
"\n"
"<p>To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below.</p>\n"
"\n"
"<p>You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>.</p>"
msgstr "\n<h2>Игнорировать адрес электронной почты</h2>\n\n<p>Чтобы игнорировать адрес электронной почты, предотвратить автоматическое создание тикетов письмами с него, укажите его ниже.</p>\n\n<p>Вы можете указать как полный адрес, например, <em>email@domain.com</em>, так и его часть - с подстановочным знаком, например, <em>*@domain.com</em> или <em>user@*</em>.</p>"
msgid "To ignore an e-mail address and prevent any emails from that address creating tickets automatically, enter the e-mail address below."
msgstr "Чтобы игнорировать адрес электронной почты, предотвратить автоматическое создание тикетов письмами с него, укажите его ниже."
msgid "You can either enter a whole e-mail address such as <em>email@domain.com</em> or a portion of an e-mail address with a wildcard, such as <em>*@domain.com</em> or <em>user@*</em>."
msgstr "Вы можете указать как полный адрес, например, <em>email@domain.com</em>, так и его часть - с подстановочным знаком, например, <em>*@domain.com</em> или <em>user@*</em>."
#: templates/helpdesk/email_ignore_del.html:3
msgid "Delete Ignored E-Mail Address"
msgstr "Удалить игнорируемый адрес электронной почты"
#: templates/helpdesk/email_ignore_del.html:5
msgid "Un-Ignore E-Mail Address"
msgstr "Разблокировать адрес электронной почты"
#, python-format
msgid ""
"\n"
"<h2>Un-Ignore E-Mail Address</h2>\n"
"\n"
"<p>Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time.</p>\n"
msgstr "\n<h2>Разблокировать адрес электронной почты</h2>\n\n<p>Вы уверены что хотите разблокировать этот адрес электронной почты (<em>%(email_address)s</em>) и позволить сообщениям с этого адреса автоматически создавать тикеты в вашей системе? Вы можете добавить этот адрес электронной почты в любое время.</p>\n"
msgid "Are you sure you wish to stop removing this email address (<em>%(email_address)s</em>) and allow their e-mails to automatically create tickets in your system? You can re-add this e-mail address at any time."
msgstr "Вы уверены что хотите разблокировать этот адрес электронной почты (<em>%(email_address)s</em>) и позволить сообщениям с этого адреса автоматически создавать тикеты в вашей системе? Вы можете добавить этот адрес электронной почты в любое время."
#: templates/helpdesk/email_ignore_del.html:11
msgid "Keep Ignoring It"
@ -1437,15 +1436,9 @@ msgstr "Ваш адрес электронной почты"
msgid "View Ticket"
msgstr "Просмотреть талон"
#: templates/helpdesk/public_homepage.html:39
msgid "Submit a Ticket"
msgstr "Отправить талон"
#: templates/helpdesk/public_homepage.html:41
msgid ""
"All fields are required. Please provide as descriptive a title and "
"description as possible."
msgstr "Все поля являются обязательными для заполнения. Пожалуйста, представьте, заголовок и описание, настолько подробными насколько это возможно."
msgid "All fields are required."
msgstr "Все поля являются обязательными для заполнения."
#: templates/helpdesk/public_homepage.html:67
msgid "Please use button at upper right to login first."
@ -1456,13 +1449,14 @@ msgid "Unable To Open Ticket"
msgstr "Невозможно открыть тикет"
#: templates/helpdesk/public_spam.html:6
msgid ""
"<p>Sorry, but there has been an error trying to submit your ticket.</p>\n"
"\n"
"<p>Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible.</p>\n"
"\n"
"<p>We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers.</p>\n"
msgstr "<p>Извините, но произошла ошибка при попытке сохранить тикет.</p>\n\n<p>Наша система отметила ваше сообщение как <strong>спам</strong>, так что мы не можем его сохранить. Если это не спам, пожалуйста вернитесь назад и введите свое сообщение еще раз. Будьте осторожны, чтобы избежать похожести на \"спам\", и если у вас есть очень много ссылок, пожалуйста, попробуйте по возможности удалить их.</p>\n\n<p>Мы приносим извинения за возможные неудобства, однако эта проверка необходима, чтобы избежать растраты ресурсов на спамеров.</p>\n"
msgid "Sorry, but there has been an error trying to submit your ticket."
msgstr "Извините, но произошла ошибка при попытке сохранить тикет."
msgid "Our system has marked your submission as <strong>spam</strong>, so we are unable to save it. If this is not spam, please press back and re-type your message. Be careful to avoid sounding 'spammy', and if you have heaps of links please try removing them if possible."
msgstr "Наша система отметила ваше сообщение как <strong>спам</strong>, так что мы не можем его сохранить. Если это не спам, пожалуйста вернитесь назад и введите свое сообщение еще раз. Будьте осторожны, чтобы избежать похожести на \"спам\", и если у вас есть очень много ссылок, пожалуйста, попробуйте по возможности удалить их."
msgid "We are sorry for any inconvenience, however this check is required to avoid our helpdesk resources being overloaded by spammers."
msgstr "Мы приносим извинения за возможные неудобства, однако эта проверка необходима, чтобы избежать растраты ресурсов на спамеров."
#: templates/helpdesk/public_view_form.html:8
msgid "Error:"
@ -1610,13 +1604,8 @@ msgstr "Открытые Тикеты"
msgid "Change System Settings"
msgstr "Изменить системные настройки"
#: templates/helpdesk/system_settings.html:5
msgid ""
"\n"
"<h2>System Settings</h2>\n"
"\n"
"<p>The following items can be maintained by you or other superusers:</p>"
msgstr "\n<h2>Системные настройки</h2>\n\n<p>Следующие задачи можете выполнить вы и другие суперпользователи:</p>"
msgid "The following items can be maintained by you or other superusers:"
msgstr "Следующие задачи можете выполнить вы и другие суперпользователи:"
#: templates/helpdesk/system_settings.html:11
msgid "E-Mail Ignore list"
@ -2092,12 +2081,8 @@ msgid "Change User Settings"
msgstr "Изменить Настройки Пользователя"
#: templates/helpdesk/user_settings.html:14
msgid ""
"\n"
"<h2>User Settings</h2>\n"
"\n"
"<p>Use the following options to change the way your helpdesk system works for you. These settings do not impact any other user.</p>\n"
msgstr "\n<h2>Параметры пользователя</h2>\n\n<p>Используйте следующие параметры для изменения, как системы helpdesk бкдет работать для вас. Эти параметры не воздействия любого другого пользователя,.</p>\n"
msgid "Use the following options to change the way your helpdesk system works for you. These settings do not impact any other user."
msgstr "Используйте следующие параметры для изменения, как системы helpdesk бкдет работать для вас. Эти параметры не воздействия любого другого пользователя,."
#: templates/helpdesk/user_settings.html:29
msgid "Save Options"

View File

@ -3,7 +3,7 @@
# This file is distributed under the same license as the django-helpdesk package.
#
# Translators:
# Alex Nordlund <deep.alexander@gmail.com>, 2012
# Alexander Nordlund <deep.alexander@gmail.com>, 2012
# osterberg <mikael@osterberg.me>, 2012
msgid ""
msgstr ""

File diff suppressed because it is too large Load Diff

View File

@ -10,6 +10,10 @@ users who don't yet have them.
from django.utils.translation import ugettext as _
from django.core.management.base import BaseCommand
try:
from django.contrib.auth import get_user_model
User = get_user_model()
except ImportError:
from django.contrib.auth.models import User
from helpdesk.models import UserSettings

View File

@ -21,6 +21,8 @@ from email.header import decode_header
from email.Utils import parseaddr, collapse_rfc2231_value
from optparse import make_option
from email_reply_parser import EmailReplyParser
from django.core.files.base import ContentFile
from django.core.management.base import BaseCommand
from django.db.models import Q
@ -192,7 +194,7 @@ def ticket_from_message(message, queue, quiet):
if part.get_content_maintype() == 'text' and name == None:
if part.get_content_subtype() == 'plain':
body_plain = decodeUnknown(part.get_content_charset(), part.get_payload(decode=True))
body_plain = EmailReplyParser.parse_reply(decodeUnknown(part.get_content_charset(), part.get_payload(decode=True)))
else:
body_html = part.get_payload(decode=True)
else:

View File

@ -1,490 +1,346 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
# -*- coding: utf-8 -*-
from __future__ import unicode_literals
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Queue'
db.create_table('helpdesk_queue', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
('email_address', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),
('locale', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True)),
('allow_public_submission', self.gf('django.db.models.fields.BooleanField')(default=False)),
('allow_email_submission', self.gf('django.db.models.fields.BooleanField')(default=False)),
('escalate_days', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('new_ticket_cc', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('updated_ticket_cc', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_type', self.gf('django.db.models.fields.CharField')(max_length=5, null=True, blank=True)),
('email_box_host', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_port', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('email_box_ssl', self.gf('django.db.models.fields.BooleanField')(default=False)),
('email_box_user', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_pass', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_imap_folder', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)),
('email_box_interval', self.gf('django.db.models.fields.IntegerField')(default='5', null=True, blank=True)),
('email_box_last_check', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['Queue'])
# Adding model 'Ticket'
db.create_table('helpdesk_ticket', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=200)),
('queue', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Queue'])),
('created', self.gf('django.db.models.fields.DateTimeField')(blank=True)),
('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True)),
('submitter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),
('assigned_to', self.gf('django.db.models.fields.related.ForeignKey')(related_name='assigned_to', blank=True, null=True, to=orm['auth.User'])),
('status', self.gf('django.db.models.fields.IntegerField')(default=1)),
('on_hold', self.gf('django.db.models.fields.BooleanField')(default=False)),
('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('resolution', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('priority', self.gf('django.db.models.fields.IntegerField')(default=3, blank=3)),
('last_escalation', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['Ticket'])
# Adding model 'FollowUp'
db.create_table('helpdesk_followup', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('ticket', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Ticket'])),
('date', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2011, 4, 27, 15, 17, 4, 272904))),
('title', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('comment', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('public', self.gf('django.db.models.fields.BooleanField')(default=False)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
('new_status', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['FollowUp'])
# Adding model 'TicketChange'
db.create_table('helpdesk_ticketchange', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('followup', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.FollowUp'])),
('field', self.gf('django.db.models.fields.CharField')(max_length=100)),
('old_value', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('new_value', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['TicketChange'])
# Adding model 'Attachment'
db.create_table('helpdesk_attachment', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('followup', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.FollowUp'])),
('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
('filename', self.gf('django.db.models.fields.CharField')(max_length=100)),
('mime_type', self.gf('django.db.models.fields.CharField')(max_length=30)),
('size', self.gf('django.db.models.fields.IntegerField')()),
))
db.send_create_signal('helpdesk', ['Attachment'])
# Adding model 'PreSetReply'
db.create_table('helpdesk_presetreply', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('body', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('helpdesk', ['PreSetReply'])
# Adding M2M table for field queues on 'PreSetReply'
db.create_table('helpdesk_presetreply_queues', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('presetreply', models.ForeignKey(orm['helpdesk.presetreply'], null=False)),
('queue', models.ForeignKey(orm['helpdesk.queue'], null=False))
))
db.create_unique('helpdesk_presetreply_queues', ['presetreply_id', 'queue_id'])
# Adding model 'EscalationExclusion'
db.create_table('helpdesk_escalationexclusion', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('date', self.gf('django.db.models.fields.DateField')()),
))
db.send_create_signal('helpdesk', ['EscalationExclusion'])
# Adding M2M table for field queues on 'EscalationExclusion'
db.create_table('helpdesk_escalationexclusion_queues', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('escalationexclusion', models.ForeignKey(orm['helpdesk.escalationexclusion'], null=False)),
('queue', models.ForeignKey(orm['helpdesk.queue'], null=False))
))
db.create_unique('helpdesk_escalationexclusion_queues', ['escalationexclusion_id', 'queue_id'])
# Adding model 'EmailTemplate'
db.create_table('helpdesk_emailtemplate', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('template_name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('subject', self.gf('django.db.models.fields.CharField')(max_length=100)),
('heading', self.gf('django.db.models.fields.CharField')(max_length=100)),
('plain_text', self.gf('django.db.models.fields.TextField')()),
('html', self.gf('django.db.models.fields.TextField')()),
('locale', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['EmailTemplate'])
# Adding model 'KBCategory'
db.create_table('helpdesk_kbcategory', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
('description', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('helpdesk', ['KBCategory'])
# Adding model 'KBItem'
db.create_table('helpdesk_kbitem', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('category', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.KBCategory'])),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('question', self.gf('django.db.models.fields.TextField')()),
('answer', self.gf('django.db.models.fields.TextField')()),
('votes', self.gf('django.db.models.fields.IntegerField')(default=0)),
('recommendations', self.gf('django.db.models.fields.IntegerField')(default=0)),
('last_updated', self.gf('django.db.models.fields.DateTimeField')(blank=True)),
))
db.send_create_signal('helpdesk', ['KBItem'])
# Adding model 'SavedSearch'
db.create_table('helpdesk_savedsearch', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('shared', self.gf('django.db.models.fields.BooleanField')(default=False)),
('query', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('helpdesk', ['SavedSearch'])
# Adding model 'UserSettings'
db.create_table('helpdesk_usersettings', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
('settings_pickled', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['UserSettings'])
# Adding model 'IgnoreEmail'
db.create_table('helpdesk_ignoreemail', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('date', self.gf('django.db.models.fields.DateField')(blank=True)),
('email_address', self.gf('django.db.models.fields.CharField')(max_length=150)),
('keep_in_mailbox', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('helpdesk', ['IgnoreEmail'])
# Adding M2M table for field queues on 'IgnoreEmail'
db.create_table('helpdesk_ignoreemail_queues', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('ignoreemail', models.ForeignKey(orm['helpdesk.ignoreemail'], null=False)),
('queue', models.ForeignKey(orm['helpdesk.queue'], null=False))
))
db.create_unique('helpdesk_ignoreemail_queues', ['ignoreemail_id', 'queue_id'])
# Adding model 'TicketCC'
db.create_table('helpdesk_ticketcc', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('ticket', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Ticket'])),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
('email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),
('can_view', self.gf('django.db.models.fields.BooleanField')(default=False)),
('can_update', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('helpdesk', ['TicketCC'])
# Adding model 'CustomField'
db.create_table('helpdesk_customfield', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.SlugField')(max_length=50, unique=True, db_index=True)),
('label', self.gf('django.db.models.fields.CharField')(max_length='30')),
('help_text', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('data_type', self.gf('django.db.models.fields.CharField')(max_length=100)),
('max_length', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('decimal_places', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('list_values', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('required', self.gf('django.db.models.fields.BooleanField')(default=False)),
('staff_only', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('helpdesk', ['CustomField'])
# Adding model 'TicketCustomFieldValue'
db.create_table('helpdesk_ticketcustomfieldvalue', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('ticket', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Ticket'])),
('field', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.CustomField'])),
('value', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['TicketCustomFieldValue'])
# Adding unique constraint on 'TicketCustomFieldValue', fields ['ticket', 'field']
db.create_unique('helpdesk_ticketcustomfieldvalue', ['ticket_id', 'field_id'])
from django.db import models, migrations
import django.utils.timezone
from django.conf import settings
import helpdesk.models
def backwards(self, orm):
class Migration(migrations.Migration):
# Removing unique constraint on 'TicketCustomFieldValue', fields ['ticket', 'field']
db.delete_unique('helpdesk_ticketcustomfieldvalue', ['ticket_id', 'field_id'])
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
# Deleting model 'Queue'
db.delete_table('helpdesk_queue')
# Deleting model 'Ticket'
db.delete_table('helpdesk_ticket')
# Deleting model 'FollowUp'
db.delete_table('helpdesk_followup')
# Deleting model 'TicketChange'
db.delete_table('helpdesk_ticketchange')
# Deleting model 'Attachment'
db.delete_table('helpdesk_attachment')
# Deleting model 'PreSetReply'
db.delete_table('helpdesk_presetreply')
# Removing M2M table for field queues on 'PreSetReply'
db.delete_table('helpdesk_presetreply_queues')
# Deleting model 'EscalationExclusion'
db.delete_table('helpdesk_escalationexclusion')
# Removing M2M table for field queues on 'EscalationExclusion'
db.delete_table('helpdesk_escalationexclusion_queues')
# Deleting model 'EmailTemplate'
db.delete_table('helpdesk_emailtemplate')
# Deleting model 'KBCategory'
db.delete_table('helpdesk_kbcategory')
# Deleting model 'KBItem'
db.delete_table('helpdesk_kbitem')
# Deleting model 'SavedSearch'
db.delete_table('helpdesk_savedsearch')
# Deleting model 'UserSettings'
db.delete_table('helpdesk_usersettings')
# Deleting model 'IgnoreEmail'
db.delete_table('helpdesk_ignoreemail')
# Removing M2M table for field queues on 'IgnoreEmail'
db.delete_table('helpdesk_ignoreemail_queues')
# Deleting model 'TicketCC'
db.delete_table('helpdesk_ticketcc')
# Deleting model 'CustomField'
db.delete_table('helpdesk_customfield')
# Deleting model 'TicketCustomFieldValue'
db.delete_table('helpdesk_ticketcustomfieldvalue')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'unique': 'True'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
operations = [
migrations.CreateModel(
name='Attachment',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('file', models.FileField(upload_to=helpdesk.models.attachment_path, max_length=1000, verbose_name='File')),
('filename', models.CharField(max_length=1000, verbose_name='Filename')),
('mime_type', models.CharField(max_length=255, verbose_name='MIME Type')),
('size', models.IntegerField(help_text='Size of this file in bytes', verbose_name='Size')),
],
options={
'ordering': ['filename'],
'verbose_name': 'Attachment',
'verbose_name_plural': 'Attachments',
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
bases=(models.Model,),
),
migrations.CreateModel(
name='CustomField',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.SlugField(help_text='As used in the database and behind the scenes. Must be unique and consist of only lowercase letters with no punctuation.', unique=True, verbose_name='Field Name')),
('label', models.CharField(help_text='The display label for this field', max_length=b'30', verbose_name='Label')),
('help_text', models.TextField(help_text='Shown to the user when editing the ticket', null=True, verbose_name='Help Text', blank=True)),
('data_type', models.CharField(help_text='Allows you to restrict the data entered into this field', max_length=100, verbose_name='Data Type', choices=[(b'varchar', 'Character (single line)'), (b'text', 'Text (multi-line)'), (b'integer', 'Integer'), (b'decimal', 'Decimal'), (b'list', 'List'), (b'boolean', 'Boolean (checkbox yes/no)'), (b'date', 'Date'), (b'time', 'Time'), (b'datetime', 'Date & Time'), (b'email', 'E-Mail Address'), (b'url', 'URL'), (b'ipaddress', 'IP Address'), (b'slug', 'Slug')])),
('max_length', models.IntegerField(null=True, verbose_name='Maximum Length (characters)', blank=True)),
('decimal_places', models.IntegerField(help_text='Only used for decimal fields', null=True, verbose_name='Decimal Places', blank=True)),
('empty_selection_list', models.BooleanField(default=False, help_text='Only for List: adds an empty first entry to the choices list, which enforces that the user makes an active choice.', verbose_name='Add empty first choice to List?')),
('list_values', models.TextField(help_text='For list fields only. Enter one option per line.', null=True, verbose_name='List Values', blank=True)),
('ordering', models.IntegerField(help_text='Lower numbers are displayed first; higher numbers are listed later', null=True, verbose_name='Ordering', blank=True)),
('required', models.BooleanField(default=False, help_text='Does the user have to enter a value for this field?', verbose_name='Required?')),
('staff_only', models.BooleanField(default=False, help_text='If this is ticked, then the public submission form will NOT show this field', verbose_name='Staff Only?')),
],
options={
'verbose_name': 'Custom field',
'verbose_name_plural': 'Custom fields',
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'max_length': '30', 'unique': 'True'})
bases=(models.Model,),
),
migrations.CreateModel(
name='EmailTemplate',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('template_name', models.CharField(max_length=100, verbose_name='Template Name')),
('subject', models.CharField(help_text='This will be prefixed with "[ticket.ticket] ticket.title". We recommend something simple such as "(Updated") or "(Closed)" - the same context is available as in plain_text, below.', max_length=100, verbose_name='Subject')),
('heading', models.CharField(help_text='In HTML e-mails, this will be the heading at the top of the email - the same context is available as in plain_text, below.', max_length=100, verbose_name='Heading')),
('plain_text', models.TextField(help_text='The context available to you includes {{ ticket }}, {{ queue }}, and depending on the time of the call: {{ resolution }} or {{ comment }}.', verbose_name='Plain Text')),
('html', models.TextField(help_text='The same context is available here as in plain_text, above.', verbose_name='HTML')),
('locale', models.CharField(help_text='Locale of this template.', max_length=10, null=True, verbose_name='Locale', blank=True)),
],
options={
'ordering': ['template_name', 'locale'],
'verbose_name': 'e-mail template',
'verbose_name_plural': 'e-mail templates',
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
bases=(models.Model,),
),
migrations.CreateModel(
name='EscalationExclusion',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(max_length=100, verbose_name='Name')),
('date', models.DateField(help_text='Date on which escalation should not happen', verbose_name='Date')),
],
options={
'verbose_name': 'Escalation exclusion',
'verbose_name_plural': 'Escalation exclusions',
},
'helpdesk.attachment': {
'Meta': {'ordering': "['filename']", 'object_name': 'Attachment'},
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
'filename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
'size': ('django.db.models.fields.IntegerField', [], {})
bases=(models.Model,),
),
migrations.CreateModel(
name='FollowUp',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='Date')),
('title', models.CharField(max_length=200, null=True, verbose_name='Title', blank=True)),
('comment', models.TextField(null=True, verbose_name='Comment', blank=True)),
('public', models.BooleanField(default=False, help_text='Public tickets are viewable by the submitter and all staff, but non-public tickets can only be seen by staff.', verbose_name='Public')),
('new_status', models.IntegerField(blank=True, help_text='If the status was changed, what was it changed to?', null=True, verbose_name='New Status', choices=[(1, 'Open'), (2, 'Reopened'), (3, 'Resolved'), (4, 'Closed'), (5, 'Duplicate')])),
],
options={
'ordering': ['date'],
'verbose_name': 'Follow-up',
'verbose_name_plural': 'Follow-ups',
},
'helpdesk.customfield': {
'Meta': {'object_name': 'CustomField'},
'data_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'label': ('django.db.models.fields.CharField', [], {'max_length': "'30'"}),
'list_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'unique': 'True', 'db_index': 'True'}),
'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
bases=(models.Model,),
),
migrations.CreateModel(
name='IgnoreEmail',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(max_length=100, verbose_name='Name')),
('date', models.DateField(help_text='Date on which this e-mail address was added', verbose_name='Date', editable=False, blank=True)),
('email_address', models.CharField(help_text='Enter a full e-mail address, or portions with wildcards, eg *@domain.com or postmaster@*.', max_length=150, verbose_name='E-Mail Address')),
('keep_in_mailbox', models.BooleanField(default=False, help_text='Do you want to save emails from this address in the mailbox? If this is unticked, emails from this address will be deleted.', verbose_name='Save Emails in Mailbox?')),
],
options={
'verbose_name': 'Ignored e-mail address',
'verbose_name_plural': 'Ignored e-mail addresses',
},
'helpdesk.emailtemplate': {
'Meta': {'ordering': "['template_name', 'locale']", 'object_name': 'EmailTemplate'},
'heading': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'html': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'plain_text': ('django.db.models.fields.TextField', [], {}),
'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'template_name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
bases=(models.Model,),
),
migrations.CreateModel(
name='KBCategory',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=100, verbose_name='Title')),
('slug', models.SlugField(verbose_name='Slug')),
('description', models.TextField(verbose_name='Description')),
],
options={
'ordering': ['title'],
'verbose_name': 'Knowledge base category',
'verbose_name_plural': 'Knowledge base categories',
},
'helpdesk.escalationexclusion': {
'Meta': {'object_name': 'EscalationExclusion'},
'date': ('django.db.models.fields.DateField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['helpdesk.Queue']", 'symmetrical': 'False', 'null': 'True', 'blank': 'True'})
bases=(models.Model,),
),
migrations.CreateModel(
name='KBItem',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=100, verbose_name='Title')),
('question', models.TextField(verbose_name='Question')),
('answer', models.TextField(verbose_name='Answer')),
('votes', models.IntegerField(default=0, help_text='Total number of votes cast for this item', verbose_name='Votes')),
('recommendations', models.IntegerField(default=0, help_text='Number of votes for this item which were POSITIVE.', verbose_name='Positive Votes')),
('last_updated', models.DateTimeField(help_text='The date on which this question was most recently changed.', verbose_name='Last Updated', blank=True)),
('category', models.ForeignKey(verbose_name='Category', to='helpdesk.KBCategory')),
],
options={
'ordering': ['title'],
'verbose_name': 'Knowledge base item',
'verbose_name_plural': 'Knowledge base items',
},
'helpdesk.followup': {
'Meta': {'ordering': "['date']", 'object_name': 'FollowUp'},
'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 4, 27, 15, 17, 4, 272904)'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_status': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
bases=(models.Model,),
),
migrations.CreateModel(
name='PreSetReply',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('name', models.CharField(help_text='Only used to assist users with selecting a reply - not shown to the user.', max_length=100, verbose_name='Name')),
('body', models.TextField(help_text='Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); {{ queue }} - The queue; and {{ user }} - the current user.', verbose_name='Body')),
],
options={
'ordering': ['name'],
'verbose_name': 'Pre-set reply',
'verbose_name_plural': 'Pre-set replies',
},
'helpdesk.ignoreemail': {
'Meta': {'object_name': 'IgnoreEmail'},
'date': ('django.db.models.fields.DateField', [], {'blank': 'True'}),
'email_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keep_in_mailbox': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['helpdesk.Queue']", 'symmetrical': 'False', 'null': 'True', 'blank': 'True'})
bases=(models.Model,),
),
migrations.CreateModel(
name='Queue',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=100, verbose_name='Title')),
('slug', models.SlugField(help_text="This slug is used when building ticket ID's. Once set, try not to change it or e-mailing may get messy.", verbose_name='Slug')),
('email_address', models.EmailField(help_text='All outgoing e-mails for this queue will use this e-mail address. If you use IMAP or POP3, this should be the e-mail address for that mailbox.', max_length=75, null=True, verbose_name='E-Mail Address', blank=True)),
('locale', models.CharField(help_text='Locale of this queue. All correspondence in this queue will be in this language.', max_length=10, null=True, verbose_name='Locale', blank=True)),
('allow_public_submission', models.BooleanField(default=False, help_text='Should this queue be listed on the public submission form?', verbose_name='Allow Public Submission?')),
('allow_email_submission', models.BooleanField(default=False, help_text='Do you want to poll the e-mail box below for new tickets?', verbose_name='Allow E-Mail Submission?')),
('escalate_days', models.IntegerField(help_text='For tickets which are not held, how often do you wish to increase their priority? Set to 0 for no escalation.', null=True, verbose_name='Escalation Days', blank=True)),
('new_ticket_cc', models.CharField(help_text='If an e-mail address is entered here, then it will receive notification of all new tickets created for this queue. Enter a comma between multiple e-mail addresses.', max_length=200, null=True, verbose_name='New Ticket CC Address', blank=True)),
('updated_ticket_cc', models.CharField(help_text='If an e-mail address is entered here, then it will receive notification of all activity (new tickets, closed tickets, updates, reassignments, etc) for this queue. Separate multiple addresses with a comma.', max_length=200, null=True, verbose_name='Updated Ticket CC Address', blank=True)),
('email_box_type', models.CharField(choices=[(b'pop3', 'POP 3'), (b'imap', 'IMAP')], max_length=5, blank=True, help_text='E-Mail server type for creating tickets automatically from a mailbox - both POP3 and IMAP are supported.', null=True, verbose_name='E-Mail Box Type')),
('email_box_host', models.CharField(help_text='Your e-mail server address - either the domain name or IP address. May be "localhost".', max_length=200, null=True, verbose_name='E-Mail Hostname', blank=True)),
('email_box_port', models.IntegerField(help_text='Port number to use for accessing e-mail. Default for POP3 is "110", and for IMAP is "143". This may differ on some servers. Leave it blank to use the defaults.', null=True, verbose_name='E-Mail Port', blank=True)),
('email_box_ssl', models.BooleanField(default=False, help_text='Whether to use SSL for IMAP or POP3 - the default ports when using SSL are 993 for IMAP and 995 for POP3.', verbose_name='Use SSL for E-Mail?')),
('email_box_user', models.CharField(help_text='Username for accessing this mailbox.', max_length=200, null=True, verbose_name='E-Mail Username', blank=True)),
('email_box_pass', models.CharField(help_text='Password for the above username', max_length=200, null=True, verbose_name='E-Mail Password', blank=True)),
('email_box_imap_folder', models.CharField(help_text='If using IMAP, what folder do you wish to fetch messages from? This allows you to use one IMAP account for multiple queues, by filtering messages on your IMAP server into separate folders. Default: INBOX.', max_length=100, null=True, verbose_name='IMAP Folder', blank=True)),
('email_box_interval', models.IntegerField(default=b'5', help_text='How often do you wish to check this mailbox? (in Minutes)', null=True, verbose_name='E-Mail Check Interval', blank=True)),
('email_box_last_check', models.DateTimeField(null=True, editable=False, blank=True)),
],
options={
'ordering': ('title',),
'verbose_name': 'Queue',
'verbose_name_plural': 'Queues',
},
'helpdesk.kbcategory': {
'Meta': {'ordering': "['title']", 'object_name': 'KBCategory'},
'description': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
bases=(models.Model,),
),
migrations.CreateModel(
name='SavedSearch',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(help_text='User-provided name for this query', max_length=100, verbose_name='Query Name')),
('shared', models.BooleanField(default=False, help_text='Should other users see this query?', verbose_name='Shared With Other Users?')),
('query', models.TextField(help_text='Pickled query object. Be wary changing this.', verbose_name='Search Query')),
('user', models.ForeignKey(verbose_name='User', to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'Saved search',
'verbose_name_plural': 'Saved searches',
},
'helpdesk.kbitem': {
'Meta': {'ordering': "['title']", 'object_name': 'KBItem'},
'answer': ('django.db.models.fields.TextField', [], {}),
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.KBCategory']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_updated': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'question': ('django.db.models.fields.TextField', [], {}),
'recommendations': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'votes': ('django.db.models.fields.IntegerField', [], {'default': '0'})
bases=(models.Model,),
),
migrations.CreateModel(
name='Ticket',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('title', models.CharField(max_length=200, verbose_name='Title')),
('created', models.DateTimeField(help_text='Date this ticket was first created', verbose_name='Created', blank=True)),
('modified', models.DateTimeField(help_text='Date this ticket was most recently changed.', verbose_name='Modified', blank=True)),
('submitter_email', models.EmailField(help_text='The submitter will receive an email for all public follow-ups left for this task.', max_length=75, null=True, verbose_name='Submitter E-Mail', blank=True)),
('status', models.IntegerField(default=1, verbose_name='Status', choices=[(1, 'Open'), (2, 'Reopened'), (3, 'Resolved'), (4, 'Closed'), (5, 'Duplicate')])),
('on_hold', models.BooleanField(default=False, help_text='If a ticket is on hold, it will not automatically be escalated.', verbose_name='On Hold')),
('description', models.TextField(help_text='The content of the customers query.', null=True, verbose_name='Description', blank=True)),
('resolution', models.TextField(help_text='The resolution provided to the customer by our staff.', null=True, verbose_name='Resolution', blank=True)),
('priority', models.IntegerField(default=3, help_text='1 = Highest Priority, 5 = Low Priority', blank=3, verbose_name='Priority', choices=[(1, '1. Critical'), (2, '2. High'), (3, '3. Normal'), (4, '4. Low'), (5, '5. Very Low')])),
('due_date', models.DateTimeField(null=True, verbose_name='Due on', blank=True)),
('last_escalation', models.DateTimeField(help_text='The date this ticket was last escalated - updated automatically by management/commands/escalate_tickets.py.', null=True, editable=False, blank=True)),
('assigned_to', models.ForeignKey(related_name=b'assigned_to', verbose_name='Assigned to', blank=True, to=settings.AUTH_USER_MODEL, null=True)),
('queue', models.ForeignKey(verbose_name='Queue', to='helpdesk.Queue')),
],
options={
'ordering': ('id',),
'get_latest_by': 'created',
'verbose_name': 'Ticket',
'verbose_name_plural': 'Tickets',
},
'helpdesk.presetreply': {
'Meta': {'ordering': "['name']", 'object_name': 'PreSetReply'},
'body': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['helpdesk.Queue']", 'symmetrical': 'False', 'null': 'True', 'blank': 'True'})
bases=(models.Model,),
),
migrations.CreateModel(
name='TicketCC',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('email', models.EmailField(help_text='For non-user followers, enter their e-mail address', max_length=75, null=True, verbose_name='E-Mail Address', blank=True)),
('can_view', models.BooleanField(default=False, help_text='Can this CC login to view the ticket details?', verbose_name='Can View Ticket?')),
('can_update', models.BooleanField(default=False, help_text='Can this CC login and update the ticket?', verbose_name='Can Update Ticket?')),
('ticket', models.ForeignKey(verbose_name='Ticket', to='helpdesk.Ticket')),
('user', models.ForeignKey(blank=True, to=settings.AUTH_USER_MODEL, help_text='User who wishes to receive updates for this ticket.', null=True, verbose_name='User')),
],
options={
},
'helpdesk.queue': {
'Meta': {'ordering': "('title',)", 'object_name': 'Queue'},
'allow_email_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'allow_public_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'email_box_host': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_imap_folder': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'email_box_interval': ('django.db.models.fields.IntegerField', [], {'default': "'5'", 'null': 'True', 'blank': 'True'}),
'email_box_last_check': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'email_box_pass': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_port': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'email_box_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_box_type': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
'email_box_user': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'escalate_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'new_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'updated_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
bases=(models.Model,),
),
migrations.CreateModel(
name='TicketChange',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('field', models.CharField(max_length=100, verbose_name='Field')),
('old_value', models.TextField(null=True, verbose_name='Old Value', blank=True)),
('new_value', models.TextField(null=True, verbose_name='New Value', blank=True)),
('followup', models.ForeignKey(verbose_name='Follow-up', to='helpdesk.FollowUp')),
],
options={
'verbose_name': 'Ticket change',
'verbose_name_plural': 'Ticket changes',
},
'helpdesk.savedsearch': {
'Meta': {'object_name': 'SavedSearch'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'query': ('django.db.models.fields.TextField', [], {}),
'shared': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
bases=(models.Model,),
),
migrations.CreateModel(
name='TicketCustomFieldValue',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('value', models.TextField(null=True, blank=True)),
('field', models.ForeignKey(verbose_name='Field', to='helpdesk.CustomField')),
('ticket', models.ForeignKey(verbose_name='Ticket', to='helpdesk.Ticket')),
],
options={
'verbose_name': 'Ticket custom field value',
'verbose_name_plural': 'Ticket custom field values',
},
'helpdesk.ticket': {
'Meta': {'object_name': 'Ticket'},
'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'assigned_to'", 'blank': 'True', 'null': 'True', 'to': "orm['auth.User']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_escalation': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'on_hold': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'priority': ('django.db.models.fields.IntegerField', [], {'default': '3', 'blank': '3'}),
'queue': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Queue']"}),
'resolution': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'submitter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200'})
bases=(models.Model,),
),
migrations.CreateModel(
name='TicketDependency',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('depends_on', models.ForeignKey(related_name=b'depends_on', verbose_name='Depends On Ticket', to='helpdesk.Ticket')),
('ticket', models.ForeignKey(related_name=b'ticketdependency', verbose_name='Ticket', to='helpdesk.Ticket')),
],
options={
'verbose_name': 'Ticket dependency',
'verbose_name_plural': 'Ticket dependencies',
},
'helpdesk.ticketcc': {
'Meta': {'object_name': 'TicketCC'},
'can_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'can_view': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
bases=(models.Model,),
),
migrations.CreateModel(
name='UserSettings',
fields=[
('id', models.AutoField(verbose_name='ID', serialize=False, auto_created=True, primary_key=True)),
('settings_pickled', models.TextField(help_text='This is a base64-encoded representation of a pickled Python dictionary. Do not change this field via the admin.', null=True, verbose_name='Settings Dictionary', blank=True)),
('user', models.OneToOneField(to=settings.AUTH_USER_MODEL)),
],
options={
'verbose_name': 'User Setting',
'verbose_name_plural': 'User Settings',
},
'helpdesk.ticketchange': {
'Meta': {'object_name': 'TicketChange'},
'field': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'old_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'helpdesk.ticketcustomfieldvalue': {
'Meta': {'unique_together': "(('ticket', 'field'),)", 'object_name': 'TicketCustomFieldValue'},
'field': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.CustomField']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'helpdesk.usersettings': {
'Meta': {'object_name': 'UserSettings'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'settings_pickled': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
}
}
complete_apps = ['helpdesk']
bases=(models.Model,),
),
migrations.AlterUniqueTogether(
name='ticketdependency',
unique_together=set([('ticket', 'depends_on')]),
),
migrations.AddField(
model_name='presetreply',
name='queues',
field=models.ManyToManyField(help_text='Leave blank to allow this reply to be used for all queues, or select those queues you wish to limit this reply to.', to='helpdesk.Queue', null=True, blank=True),
preserve_default=True,
),
migrations.AddField(
model_name='ignoreemail',
name='queues',
field=models.ManyToManyField(help_text='Leave blank for this e-mail to be ignored on all queues, or select those queues you wish to ignore this e-mail for.', to='helpdesk.Queue', null=True, blank=True),
preserve_default=True,
),
migrations.AddField(
model_name='followup',
name='ticket',
field=models.ForeignKey(verbose_name='Ticket', to='helpdesk.Ticket'),
preserve_default=True,
),
migrations.AddField(
model_name='followup',
name='user',
field=models.ForeignKey(verbose_name='User', blank=True, to=settings.AUTH_USER_MODEL, null=True),
preserve_default=True,
),
migrations.AddField(
model_name='escalationexclusion',
name='queues',
field=models.ManyToManyField(help_text='Leave blank for this exclusion to be applied to all queues, or select those queues you wish to exclude with this entry.', to='helpdesk.Queue', null=True, blank=True),
preserve_default=True,
),
migrations.AddField(
model_name='attachment',
name='followup',
field=models.ForeignKey(verbose_name='Follow-up', to='helpdesk.FollowUp'),
preserve_default=True,
),
]

View File

@ -7,8 +7,8 @@ models.py - Model (and hence database) definitions. This is the core of the
helpdesk structure.
"""
from django.contrib.auth.models import User
from django.db import models
from django.contrib.auth import get_user_model
from django.conf import settings
from django.utils.translation import ugettext_lazy as _, ugettext
@ -17,11 +17,6 @@ try:
except ImportError:
from datetime import datetime as timezone
from helpdesk.settings import HAS_TAG_SUPPORT
if HAS_TAG_SUPPORT:
from tagging.fields import TagField
class Queue(models.Model):
"""
A queue is a collection of tickets into what would generally be business
@ -188,6 +183,8 @@ class Queue(models.Model):
class Meta:
ordering = ('title',)
verbose_name = _('Queue')
verbose_name_plural = _('Queues')
def _from_address(self):
"""
@ -287,7 +284,7 @@ class Ticket(models.Model):
)
assigned_to = models.ForeignKey(
User,
settings.AUTH_USER_MODEL,
related_name='assigned_to',
blank=True,
null=True,
@ -375,13 +372,17 @@ class Ticket(models.Model):
return u"%shelpdesk/priorities/priority%s.png" % (settings.MEDIA_URL, self.priority)
get_priority_img = property(_get_priority_img)
def _get_priority_span(self):
def _get_priority_css_class(self):
"""
A HTML <span> providing a CSS_styled representation of the priority.
Return the boostrap class corresponding to the priority.
"""
from django.utils.safestring import mark_safe
return mark_safe(u"<span class='priority%s'>%s</span>" % (self.priority, self.priority))
get_priority_span = property(_get_priority_span)
if self.priority == 2:
return "warning"
elif self.priority == 1:
return "danger"
else:
return ""
get_priority_css_class = property(_get_priority_css_class)
def _get_status(self):
"""
@ -441,14 +442,14 @@ class Ticket(models.Model):
return TicketDependency.objects.filter(ticket=self).filter(depends_on__status__in=OPEN_STATUSES).count() == 0
can_be_resolved = property(_can_be_resolved)
if HAS_TAG_SUPPORT:
tags = TagField(blank=True)
class Meta:
get_latest_by = "created"
ordering = ('id',)
verbose_name = _('Ticket')
verbose_name_plural = _('Tickets')
def __unicode__(self):
return u'%s' % self.title
return u'%s %s' % (self.id, self.title)
def get_absolute_url(self):
return ('helpdesk_view', (self.id,))
@ -495,7 +496,7 @@ class FollowUp(models.Model):
date = models.DateTimeField(
_('Date'),
default = timezone.now()
default = timezone.now
)
title = models.CharField(
@ -520,7 +521,7 @@ class FollowUp(models.Model):
)
user = models.ForeignKey(
User,
settings.AUTH_USER_MODEL,
blank=True,
null=True,
verbose_name=_('User'),
@ -538,6 +539,8 @@ class FollowUp(models.Model):
class Meta:
ordering = ['date']
verbose_name = _('Follow-up')
verbose_name_plural = _('Follow-ups')
def __unicode__(self):
return u'%s' % self.title
@ -593,6 +596,10 @@ class TicketChange(models.Model):
}
return str
class Meta:
verbose_name = _('Ticket change')
verbose_name_plural = _('Ticket changes')
def attachment_path(instance, filename):
"""
@ -624,11 +631,12 @@ class Attachment(models.Model):
file = models.FileField(
_('File'),
upload_to=attachment_path,
max_length=1000,
)
filename = models.CharField(
_('Filename'),
max_length=100,
max_length=1000,
)
mime_type = models.CharField(
@ -655,6 +663,8 @@ class Attachment(models.Model):
class Meta:
ordering = ['filename',]
verbose_name = _('Attachment')
verbose_name_plural = _('Attachments')
class PreSetReply(models.Model):
@ -693,6 +703,8 @@ class PreSetReply(models.Model):
class Meta:
ordering = ['name',]
verbose_name = _('Pre-set reply')
verbose_name_plural = _('Pre-set replies')
def __unicode__(self):
return u'%s' % self.name
@ -731,6 +743,10 @@ class EscalationExclusion(models.Model):
def __unicode__(self):
return u'%s' % self.name
class Meta:
verbose_name = _('Escalation exclusion')
verbose_name_plural = _('Escalation exclusions')
class EmailTemplate(models.Model):
"""
@ -788,6 +804,8 @@ class EmailTemplate(models.Model):
class Meta:
ordering = ['template_name', 'locale']
verbose_name = _('e-mail template')
verbose_name_plural = _('e-mail templates')
class KBCategory(models.Model):
@ -814,6 +832,8 @@ class KBCategory(models.Model):
class Meta:
ordering = ['title',]
verbose_name = _('Knowledge base category')
verbose_name_plural = _('Knowledge base categories')
def get_absolute_url(self):
return ('helpdesk_kb_category', (), {'slug': self.slug})
@ -879,6 +899,8 @@ class KBItem(models.Model):
class Meta:
ordering = ['title',]
verbose_name = _('Knowledge base item')
verbose_name_plural = _('Knowledge base items')
def get_absolute_url(self):
return ('helpdesk_kb_item', (self.id,))
@ -897,7 +919,7 @@ class SavedSearch(models.Model):
etc...
"""
user = models.ForeignKey(
User,
settings.AUTH_USER_MODEL,
verbose_name=_('User'),
)
@ -925,6 +947,11 @@ class SavedSearch(models.Model):
else:
return u'%s' % self.title
class Meta:
verbose_name = _('Saved search')
verbose_name_plural = _('Saved searches')
class UserSettings(models.Model):
"""
A bunch of user-specific settings that we want to be able to define, such
@ -934,7 +961,7 @@ class UserSettings(models.Model):
We should always refer to user.usersettings.settings['setting_name'].
"""
user = models.OneToOneField(User)
user = models.OneToOneField(settings.AUTH_USER_MODEL)
settings_pickled = models.TextField(
_('Settings Dictionary'),
@ -964,8 +991,8 @@ class UserSettings(models.Model):
return u'Preferences for %s' % self.user
class Meta:
verbose_name = 'User Settings'
verbose_name_plural = 'User Settings'
verbose_name = _('User Setting')
verbose_name_plural = _('User Settings')
def create_usersettings(sender, created_models=[], instance=None, created=False, **kwargs):
@ -978,11 +1005,12 @@ def create_usersettings(sender, created_models=[], instance=None, created=False,
'DoesNotExist: UserSettings matching query does not exist.' errors.
"""
from helpdesk.settings import DEFAULT_USER_SETTINGS
if sender == User and created:
if sender == settings.AUTH_USER_MODEL and created:
# This is a new user, so lets create their settings entry.
s, created = UserSettings.objects.get_or_create(user=instance, defaults={'settings': DEFAULT_USER_SETTINGS})
s.save()
elif UserSettings in created_models:
User = get_user_model()
# We just created the UserSettings model, lets create a UserSettings
# entry for each existing user. This will only happen once (at install
# time, or at upgrade) when the UserSettings model doesn't already
@ -995,7 +1023,11 @@ def create_usersettings(sender, created_models=[], instance=None, created=False,
s.save()
models.signals.post_syncdb.connect(create_usersettings)
models.signals.post_save.connect(create_usersettings, sender=User)
try:
models.signals.post_save.connect(create_usersettings, sender=settings.AUTH_USER_MODEL)
except:
signal_user = get_user_model()
models.signals.post_save.connect(create_usersettings, sender=signal_user)
class IgnoreEmail(models.Model):
"""
@ -1071,6 +1103,11 @@ class IgnoreEmail(models.Model):
else:
return False
class Meta:
verbose_name = _('Ignored e-mail address')
verbose_name_plural = _('Ignored e-mail addresses')
class TicketCC(models.Model):
"""
Often, there are people who wish to follow a ticket who aren't the
@ -1087,7 +1124,7 @@ class TicketCC(models.Model):
)
user = models.ForeignKey(
User,
settings.AUTH_USER_MODEL,
blank=True,
null=True,
help_text=_('User who wishes to receive updates for this ticket.'),
@ -1104,12 +1141,14 @@ class TicketCC(models.Model):
can_view = models.BooleanField(
_('Can View Ticket?'),
blank=True,
default=False,
help_text=_('Can this CC login to view the ticket details?'),
)
can_update = models.BooleanField(
_('Can Update Ticket?'),
blank=True,
default=False,
help_text=_('Can this CC login and update the ticket?'),
)
@ -1131,8 +1170,8 @@ class TicketCC(models.Model):
return u'%s for %s' % (self.display, self.ticket.title)
class CustomFieldManager(models.Manager):
def get_query_set(self):
return super(CustomFieldManager, self).get_query_set().order_by('ordering')
def get_queryset(self):
return super(CustomFieldManager, self).get_queryset().order_by('ordering')
class CustomField(models.Model):
@ -1197,6 +1236,7 @@ class CustomField(models.Model):
empty_selection_list = models.BooleanField(
_('Add empty first choice to List?'),
default=False,
help_text=_('Only for List: adds an empty first entry to the choices list, which enforces that the user makes an active choice.'),
)
@ -1225,11 +1265,13 @@ class CustomField(models.Model):
required = models.BooleanField(
_('Required?'),
help_text=_('Does the user have to enter a value for this field?'),
default=False,
)
staff_only = models.BooleanField(
_('Staff Only?'),
help_text=_('If this is ticked, then the public submission form will NOT show this field'),
default=False,
)
objects = CustomFieldManager()
@ -1237,6 +1279,10 @@ class CustomField(models.Model):
def __unicode__(self):
return '%s' % (self.name)
class Meta:
verbose_name = _('Custom field')
verbose_name_plural = _('Custom fields')
class TicketCustomFieldValue(models.Model):
ticket = models.ForeignKey(
@ -1257,6 +1303,10 @@ class TicketCustomFieldValue(models.Model):
class Meta:
unique_together = ('ticket', 'field'),
class Meta:
verbose_name = _('Ticket custom field value')
verbose_name_plural = _('Ticket custom field values')
class TicketDependency(models.Model):
"""
@ -1281,3 +1331,5 @@ class TicketDependency(models.Model):
class Meta:
unique_together = ('ticket', 'depends_on')
verbose_name = _('Ticket dependency')
verbose_name_plural = _('Ticket dependencies')

View File

@ -1,4 +1,3 @@
"""
Default settings for django-helpdesk.
@ -6,12 +5,6 @@ Default settings for django-helpdesk.
from django.conf import settings
# check for django-tagging support
HAS_TAG_SUPPORT = 'tagging' in settings.INSTALLED_APPS
try:
import tagging
except ImportError:
HAS_TAG_SUPPORT = False
try:
DEFAULT_USER_SETTINGS = settings.HELPDESK_DEFAULT_SETTINGS
@ -29,31 +22,18 @@ if type(DEFAULT_USER_SETTINGS) != type(dict()):
}
HAS_TAG_SUPPORT = False
''' generic options - visible on all pages '''
# redirect to login page instead of the default homepage when users visits "/"?
HELPDESK_REDIRECT_TO_LOGIN_BY_DEFAULT = getattr(settings, 'HELPDESK_REDIRECT_TO_LOGIN_BY_DEFAULT', False)
# customize helpdesk name on a few pages, i.e., your organization.
HELPDESK_PREPEND_ORG_NAME = getattr(settings, 'HELPDESK_PREPEND_ORG_NAME', False)
# show knowledgebase links?
HELPDESK_KB_ENABLED = getattr(settings, 'HELPDESK_KB_ENABLED', True)
# show knowledgebase links on staff view?
HELPDESK_KB_ENABLED_STAFF = getattr(settings, 'HELPDESK_KB_ENABLED_STAFF', False)
# show extended navigation by default, to all users, irrespective of staff status?
HELPDESK_NAVIGATION_ENABLED = getattr(settings, 'HELPDESK_NAVIGATION_ENABLED', False)
# show 'stats' link in navigation bar?
HELPDESK_NAVIGATION_STATS_ENABLED = getattr(settings, 'HELPDESK_NAVIGATION_STATS_ENABLED', True)
# set this to an email address inside your organization and a footer below
# the 'Powered by django-helpdesk' will be shown, telling the user whom to contact
# in case they have technical problems.
HELPDESK_SUPPORT_PERSON = getattr(settings, 'HELPDESK_SUPPORT_PERSON', False)
# show dropdown list of languages that ticket comments can be translated into?
HELPDESK_TRANSLATE_TICKET_COMMENTS = getattr(settings, 'HELPDESK_TRANSLATE_TICKET_COMMENTS', False)
@ -66,9 +46,6 @@ HELPDESK_SHOW_CHANGE_PASSWORD = getattr(settings, 'HELPDESK_SHOW_CHANGE_PASSWORD
# allow user to override default layout for 'followups' - work in progress.
HELPDESK_FOLLOWUP_MOD = getattr(settings, 'HELPDESK_FOLLOWUP_MOD', False)
# show custom welcome message in dashboard?
HELPDESK_CUSTOM_WELCOME = getattr(settings, 'HELPDESK_CUSTOM_WELCOME', False)
# auto-subscribe user to ticket if (s)he responds to a ticket?
HELPDESK_AUTO_SUBSCRIBE_ON_TICKET_RESPONSE = getattr(settings, 'HELPDESK_AUTO_SUBSCRIBE_ON_TICKET_RESPONSE', False)
@ -80,9 +57,6 @@ HELPDESK_VIEW_A_TICKET_PUBLIC = getattr(settings, 'HELPDESK_VIEW_A_TICKET_PUBLIC
# show 'submit a ticket' section on public page?
HELPDESK_SUBMIT_A_TICKET_PUBLIC = getattr(settings, 'HELPDESK_SUBMIT_A_TICKET_PUBLIC', True)
# Should we should the KB categories on the homepage?
HELPDESK_SHOW_KB_ON_HOMEPAGE = getattr(settings, 'HELPDESK_SHOW_KB_ON_HOMEPAGE', False)
''' options for update_ticket views '''
@ -96,17 +70,8 @@ HELPDESK_SHOW_EDIT_BUTTON_FOLLOW_UP = getattr(settings, 'HELPDESK_SHOW_EDIT_BUTT
# show delete buttons in ticket follow ups if user is 'superuser'
HELPDESK_SHOW_DELETE_BUTTON_SUPERUSER_FOLLOW_UP = getattr(settings, 'HELPDESK_SHOW_DELETE_BUTTON_SUPERUSER_FOLLOW_UP', False)
# show ticket edit button on top of ticket description.
HELPDESK_SHOW_EDIT_BUTTON_TICKET_TOP = getattr(settings, 'HELPDESK_SHOW_EDIT_BUTTON_TICKET_TOP', True)
# show ticket delete button on top of ticket description.
HELPDESK_SHOW_DELETE_BUTTON_TICKET_TOP = getattr(settings, 'HELPDESK_SHOW_DELETE_BUTTON_TICKET_TOP', True)
# show hold / unhold button on top of ticket description.
HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP = getattr(settings, 'HELPDESK_SHOW_HOLD_BUTTON_TICKET_TOP', True)
# make all updates public by default? this will hide the 'is this update public' checkbox
HELPDESK_UPDATE_PUBLIC_DEFAULT = getattr(settings, 'HELPDESK_UPDATE_PUBLIC_DEFAULT', True)
HELPDESK_UPDATE_PUBLIC_DEFAULT = getattr(settings, 'HELPDESK_UPDATE_PUBLIC_DEFAULT', False)
# only show staff users in ticket owner drop-downs
HELPDESK_STAFF_ONLY_TICKET_OWNERS = getattr(settings, 'HELPDESK_STAFF_ONLY_TICKET_OWNERS', False)
@ -115,6 +80,9 @@ HELPDESK_STAFF_ONLY_TICKET_OWNERS = getattr(settings, 'HELPDESK_STAFF_ONLY_TICKE
HELPDESK_STAFF_ONLY_TICKET_CC = getattr(settings, 'HELPDESK_STAFF_ONLY_TICKET_CC', False)
# allow the subject to have a configurable template.
HELPDESK_EMAIL_SUBJECT_TEMPLATE = getattr(settings, 'HELPDESK_EMAIL_SUBJECT_TEMPLATE', "{{ ticket.ticket }} {{ ticket.title|safe }} %(subject)s")
''' options for staff.create_ticket view '''
# hide the 'assigned to' / 'Case owner' field from the 'create_ticket' view?
@ -122,26 +90,6 @@ HELPDESK_CREATE_TICKET_HIDE_ASSIGNED_TO = getattr(settings, 'HELPDESK_CREATE_TIC
''' options for dashboard '''
# show delete button next to unassigned tickets
HELPDESK_DASHBOARD_SHOW_DELETE_UNASSIGNED = getattr(settings, 'HELPDESK_DASHBOARD_SHOW_DELETE_UNASSIGNED', True)
# hide empty queues in dashboard overview?
HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES = getattr(settings, 'HELPDESK_DASHBOARD_HIDE_EMPTY_QUEUES', True)
# show basic ticket stats on dashboard?
HELPDESK_DASHBOARD_BASIC_TICKET_STATS = getattr(settings, 'HELPDESK_DASHBOARD_BASIC_TICKET_STATS', False)
''' options for footer '''
# show 'API' link at bottom of page
HELPDESK_FOOTER_SHOW_API_LINK = getattr(settings, 'HELPDESK_FOOTER_SHOW_API_LINK', True)
# show / hide 'change language' link at bottom of page
HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK = getattr(settings, 'HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK', False)
''' email options '''
# default Queue email submission settings
QUEUE_EMAIL_BOX_TYPE = getattr(settings, 'QUEUE_EMAIL_BOX_TYPE', None)

View File

@ -0,0 +1,490 @@
# encoding: utf-8
import datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Adding model 'Queue'
db.create_table('helpdesk_queue', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
('email_address', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),
('locale', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True)),
('allow_public_submission', self.gf('django.db.models.fields.BooleanField')(default=False)),
('allow_email_submission', self.gf('django.db.models.fields.BooleanField')(default=False)),
('escalate_days', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('new_ticket_cc', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('updated_ticket_cc', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_type', self.gf('django.db.models.fields.CharField')(max_length=5, null=True, blank=True)),
('email_box_host', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_port', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('email_box_ssl', self.gf('django.db.models.fields.BooleanField')(default=False)),
('email_box_user', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_pass', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('email_box_imap_folder', self.gf('django.db.models.fields.CharField')(max_length=100, null=True, blank=True)),
('email_box_interval', self.gf('django.db.models.fields.IntegerField')(default='5', null=True, blank=True)),
('email_box_last_check', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['Queue'])
# Adding model 'Ticket'
db.create_table('helpdesk_ticket', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=200)),
('queue', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Queue'])),
('created', self.gf('django.db.models.fields.DateTimeField')(blank=True)),
('modified', self.gf('django.db.models.fields.DateTimeField')(blank=True)),
('submitter_email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),
('assigned_to', self.gf('django.db.models.fields.related.ForeignKey')(related_name='assigned_to', blank=True, null=True, to=orm['auth.User'])),
('status', self.gf('django.db.models.fields.IntegerField')(default=1)),
('on_hold', self.gf('django.db.models.fields.BooleanField')(default=False)),
('description', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('resolution', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('priority', self.gf('django.db.models.fields.IntegerField')(default=3, blank=3)),
('last_escalation', self.gf('django.db.models.fields.DateTimeField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['Ticket'])
# Adding model 'FollowUp'
db.create_table('helpdesk_followup', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('ticket', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Ticket'])),
('date', self.gf('django.db.models.fields.DateTimeField')(default=datetime.datetime(2011, 4, 27, 15, 17, 4, 272904))),
('title', self.gf('django.db.models.fields.CharField')(max_length=200, null=True, blank=True)),
('comment', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('public', self.gf('django.db.models.fields.BooleanField')(default=False)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
('new_status', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['FollowUp'])
# Adding model 'TicketChange'
db.create_table('helpdesk_ticketchange', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('followup', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.FollowUp'])),
('field', self.gf('django.db.models.fields.CharField')(max_length=100)),
('old_value', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('new_value', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['TicketChange'])
# Adding model 'Attachment'
db.create_table('helpdesk_attachment', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('followup', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.FollowUp'])),
('file', self.gf('django.db.models.fields.files.FileField')(max_length=100)),
('filename', self.gf('django.db.models.fields.CharField')(max_length=100)),
('mime_type', self.gf('django.db.models.fields.CharField')(max_length=30)),
('size', self.gf('django.db.models.fields.IntegerField')()),
))
db.send_create_signal('helpdesk', ['Attachment'])
# Adding model 'PreSetReply'
db.create_table('helpdesk_presetreply', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('body', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('helpdesk', ['PreSetReply'])
# Adding M2M table for field queues on 'PreSetReply'
db.create_table('helpdesk_presetreply_queues', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('presetreply', models.ForeignKey(orm['helpdesk.presetreply'], null=False)),
('queue', models.ForeignKey(orm['helpdesk.queue'], null=False))
))
db.create_unique('helpdesk_presetreply_queues', ['presetreply_id', 'queue_id'])
# Adding model 'EscalationExclusion'
db.create_table('helpdesk_escalationexclusion', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('date', self.gf('django.db.models.fields.DateField')()),
))
db.send_create_signal('helpdesk', ['EscalationExclusion'])
# Adding M2M table for field queues on 'EscalationExclusion'
db.create_table('helpdesk_escalationexclusion_queues', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('escalationexclusion', models.ForeignKey(orm['helpdesk.escalationexclusion'], null=False)),
('queue', models.ForeignKey(orm['helpdesk.queue'], null=False))
))
db.create_unique('helpdesk_escalationexclusion_queues', ['escalationexclusion_id', 'queue_id'])
# Adding model 'EmailTemplate'
db.create_table('helpdesk_emailtemplate', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('template_name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('subject', self.gf('django.db.models.fields.CharField')(max_length=100)),
('heading', self.gf('django.db.models.fields.CharField')(max_length=100)),
('plain_text', self.gf('django.db.models.fields.TextField')()),
('html', self.gf('django.db.models.fields.TextField')()),
('locale', self.gf('django.db.models.fields.CharField')(max_length=10, null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['EmailTemplate'])
# Adding model 'KBCategory'
db.create_table('helpdesk_kbcategory', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('slug', self.gf('django.db.models.fields.SlugField')(max_length=50, db_index=True)),
('description', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('helpdesk', ['KBCategory'])
# Adding model 'KBItem'
db.create_table('helpdesk_kbitem', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('category', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.KBCategory'])),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('question', self.gf('django.db.models.fields.TextField')()),
('answer', self.gf('django.db.models.fields.TextField')()),
('votes', self.gf('django.db.models.fields.IntegerField')(default=0)),
('recommendations', self.gf('django.db.models.fields.IntegerField')(default=0)),
('last_updated', self.gf('django.db.models.fields.DateTimeField')(blank=True)),
))
db.send_create_signal('helpdesk', ['KBItem'])
# Adding model 'SavedSearch'
db.create_table('helpdesk_savedsearch', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'])),
('title', self.gf('django.db.models.fields.CharField')(max_length=100)),
('shared', self.gf('django.db.models.fields.BooleanField')(default=False)),
('query', self.gf('django.db.models.fields.TextField')()),
))
db.send_create_signal('helpdesk', ['SavedSearch'])
# Adding model 'UserSettings'
db.create_table('helpdesk_usersettings', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('user', self.gf('django.db.models.fields.related.OneToOneField')(to=orm['auth.User'], unique=True)),
('settings_pickled', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['UserSettings'])
# Adding model 'IgnoreEmail'
db.create_table('helpdesk_ignoreemail', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
('date', self.gf('django.db.models.fields.DateField')(blank=True)),
('email_address', self.gf('django.db.models.fields.CharField')(max_length=150)),
('keep_in_mailbox', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('helpdesk', ['IgnoreEmail'])
# Adding M2M table for field queues on 'IgnoreEmail'
db.create_table('helpdesk_ignoreemail_queues', (
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
('ignoreemail', models.ForeignKey(orm['helpdesk.ignoreemail'], null=False)),
('queue', models.ForeignKey(orm['helpdesk.queue'], null=False))
))
db.create_unique('helpdesk_ignoreemail_queues', ['ignoreemail_id', 'queue_id'])
# Adding model 'TicketCC'
db.create_table('helpdesk_ticketcc', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('ticket', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Ticket'])),
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
('email', self.gf('django.db.models.fields.EmailField')(max_length=75, null=True, blank=True)),
('can_view', self.gf('django.db.models.fields.BooleanField')(default=False)),
('can_update', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('helpdesk', ['TicketCC'])
# Adding model 'CustomField'
db.create_table('helpdesk_customfield', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('name', self.gf('django.db.models.fields.SlugField')(max_length=50, unique=True, db_index=True)),
('label', self.gf('django.db.models.fields.CharField')(max_length='30')),
('help_text', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('data_type', self.gf('django.db.models.fields.CharField')(max_length=100)),
('max_length', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('decimal_places', self.gf('django.db.models.fields.IntegerField')(null=True, blank=True)),
('list_values', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
('required', self.gf('django.db.models.fields.BooleanField')(default=False)),
('staff_only', self.gf('django.db.models.fields.BooleanField')(default=False)),
))
db.send_create_signal('helpdesk', ['CustomField'])
# Adding model 'TicketCustomFieldValue'
db.create_table('helpdesk_ticketcustomfieldvalue', (
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
('ticket', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.Ticket'])),
('field', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['helpdesk.CustomField'])),
('value', self.gf('django.db.models.fields.TextField')(null=True, blank=True)),
))
db.send_create_signal('helpdesk', ['TicketCustomFieldValue'])
# Adding unique constraint on 'TicketCustomFieldValue', fields ['ticket', 'field']
db.create_unique('helpdesk_ticketcustomfieldvalue', ['ticket_id', 'field_id'])
def backwards(self, orm):
# Removing unique constraint on 'TicketCustomFieldValue', fields ['ticket', 'field']
db.delete_unique('helpdesk_ticketcustomfieldvalue', ['ticket_id', 'field_id'])
# Deleting model 'Queue'
db.delete_table('helpdesk_queue')
# Deleting model 'Ticket'
db.delete_table('helpdesk_ticket')
# Deleting model 'FollowUp'
db.delete_table('helpdesk_followup')
# Deleting model 'TicketChange'
db.delete_table('helpdesk_ticketchange')
# Deleting model 'Attachment'
db.delete_table('helpdesk_attachment')
# Deleting model 'PreSetReply'
db.delete_table('helpdesk_presetreply')
# Removing M2M table for field queues on 'PreSetReply'
db.delete_table('helpdesk_presetreply_queues')
# Deleting model 'EscalationExclusion'
db.delete_table('helpdesk_escalationexclusion')
# Removing M2M table for field queues on 'EscalationExclusion'
db.delete_table('helpdesk_escalationexclusion_queues')
# Deleting model 'EmailTemplate'
db.delete_table('helpdesk_emailtemplate')
# Deleting model 'KBCategory'
db.delete_table('helpdesk_kbcategory')
# Deleting model 'KBItem'
db.delete_table('helpdesk_kbitem')
# Deleting model 'SavedSearch'
db.delete_table('helpdesk_savedsearch')
# Deleting model 'UserSettings'
db.delete_table('helpdesk_usersettings')
# Deleting model 'IgnoreEmail'
db.delete_table('helpdesk_ignoreemail')
# Removing M2M table for field queues on 'IgnoreEmail'
db.delete_table('helpdesk_ignoreemail_queues')
# Deleting model 'TicketCC'
db.delete_table('helpdesk_ticketcc')
# Deleting model 'CustomField'
db.delete_table('helpdesk_customfield')
# Deleting model 'TicketCustomFieldValue'
db.delete_table('helpdesk_ticketcustomfieldvalue')
models = {
'auth.group': {
'Meta': {'object_name': 'Group'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '80', 'unique': 'True'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
'auth.permission': {
'Meta': {'ordering': "('content_type__app_label', 'content_type__model', 'codename')", 'unique_together': "(('content_type', 'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['contenttypes.ContentType']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
'username': ('django.db.models.fields.CharField', [], {'max_length': '30', 'unique': 'True'})
},
'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'helpdesk.attachment': {
'Meta': {'ordering': "['filename']", 'object_name': 'Attachment'},
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '100'}),
'filename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '30'}),
'size': ('django.db.models.fields.IntegerField', [], {})
},
'helpdesk.customfield': {
'Meta': {'object_name': 'CustomField'},
'data_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'label': ('django.db.models.fields.CharField', [], {'max_length': "'30'"}),
'list_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'unique': 'True', 'db_index': 'True'}),
'required': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'staff_only': ('django.db.models.fields.BooleanField', [], {'default': 'False'})
},
'helpdesk.emailtemplate': {
'Meta': {'ordering': "['template_name', 'locale']", 'object_name': 'EmailTemplate'},
'heading': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'html': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'plain_text': ('django.db.models.fields.TextField', [], {}),
'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'template_name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'helpdesk.escalationexclusion': {
'Meta': {'object_name': 'EscalationExclusion'},
'date': ('django.db.models.fields.DateField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['helpdesk.Queue']", 'symmetrical': 'False', 'null': 'True', 'blank': 'True'})
},
'helpdesk.followup': {
'Meta': {'ordering': "['date']", 'object_name': 'FollowUp'},
'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2011, 4, 27, 15, 17, 4, 272904)'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_status': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'helpdesk.ignoreemail': {
'Meta': {'object_name': 'IgnoreEmail'},
'date': ('django.db.models.fields.DateField', [], {'blank': 'True'}),
'email_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keep_in_mailbox': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['helpdesk.Queue']", 'symmetrical': 'False', 'null': 'True', 'blank': 'True'})
},
'helpdesk.kbcategory': {
'Meta': {'ordering': "['title']", 'object_name': 'KBCategory'},
'description': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
'helpdesk.kbitem': {
'Meta': {'ordering': "['title']", 'object_name': 'KBItem'},
'answer': ('django.db.models.fields.TextField', [], {}),
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.KBCategory']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_updated': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'question': ('django.db.models.fields.TextField', [], {}),
'recommendations': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'votes': ('django.db.models.fields.IntegerField', [], {'default': '0'})
},
'helpdesk.presetreply': {
'Meta': {'ordering': "['name']", 'object_name': 'PreSetReply'},
'body': ('django.db.models.fields.TextField', [], {}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['helpdesk.Queue']", 'symmetrical': 'False', 'null': 'True', 'blank': 'True'})
},
'helpdesk.queue': {
'Meta': {'ordering': "('title',)", 'object_name': 'Queue'},
'allow_email_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'allow_public_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'email_box_host': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_imap_folder': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'email_box_interval': ('django.db.models.fields.IntegerField', [], {'default': "'5'", 'null': 'True', 'blank': 'True'}),
'email_box_last_check': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'email_box_pass': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_port': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'email_box_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_box_type': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
'email_box_user': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'escalate_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'new_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50', 'db_index': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'updated_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
'helpdesk.savedsearch': {
'Meta': {'object_name': 'SavedSearch'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'query': ('django.db.models.fields.TextField', [], {}),
'shared': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"})
},
'helpdesk.ticket': {
'Meta': {'object_name': 'Ticket'},
'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'assigned_to'", 'blank': 'True', 'null': 'True', 'to': "orm['auth.User']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_escalation': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'on_hold': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'priority': ('django.db.models.fields.IntegerField', [], {'default': '3', 'blank': '3'}),
'queue': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Queue']"}),
'resolution': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'submitter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200'})
},
'helpdesk.ticketcc': {
'Meta': {'object_name': 'TicketCC'},
'can_update': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'can_view': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
'helpdesk.ticketchange': {
'Meta': {'object_name': 'TicketChange'},
'field': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.FollowUp']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'old_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'helpdesk.ticketcustomfieldvalue': {
'Meta': {'unique_together': "(('ticket', 'field'),)", 'object_name': 'TicketCustomFieldValue'},
'field': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.CustomField']"}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['helpdesk.Ticket']"}),
'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
'helpdesk.usersettings': {
'Meta': {'object_name': 'UserSettings'},
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'settings_pickled': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': "orm['auth.User']", 'unique': 'True'})
}
}
complete_apps = ['helpdesk']

View File

@ -0,0 +1,234 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Removing unique constraint on 'TicketCustomFieldValue', fields ['ticket', 'field']
db.delete_unique(u'helpdesk_ticketcustomfieldvalue', ['ticket_id', 'field_id'])
# Changing field 'Attachment.file'
db.alter_column(u'helpdesk_attachment', 'file', self.gf('django.db.models.fields.files.FileField')(max_length=1000))
def backwards(self, orm):
# Changing field 'Attachment.file'
db.alter_column(u'helpdesk_attachment', 'file', self.gf('django.db.models.fields.files.FileField')(max_length=100))
# Adding unique constraint on 'TicketCustomFieldValue', fields ['ticket', 'field']
db.create_unique(u'helpdesk_ticketcustomfieldvalue', ['ticket_id', 'field_id'])
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'helpdesk.attachment': {
'Meta': {'ordering': "['filename']", 'object_name': 'Attachment'},
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1000'}),
'filename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.FollowUp']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'size': ('django.db.models.fields.IntegerField', [], {})
},
u'helpdesk.customfield': {
'Meta': {'object_name': 'CustomField'},
'data_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'empty_selection_list': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'label': ('django.db.models.fields.CharField', [], {'max_length': "'30'"}),
'list_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
'ordering': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'required': ('django.db.models.fields.BooleanField', [], {}),
'staff_only': ('django.db.models.fields.BooleanField', [], {})
},
u'helpdesk.emailtemplate': {
'Meta': {'ordering': "['template_name', 'locale']", 'object_name': 'EmailTemplate'},
'heading': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'html': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'plain_text': ('django.db.models.fields.TextField', [], {}),
'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'template_name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'helpdesk.escalationexclusion': {
'Meta': {'object_name': 'EscalationExclusion'},
'date': ('django.db.models.fields.DateField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.followup': {
'Meta': {'ordering': "['date']", 'object_name': 'FollowUp'},
'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 9, 2, 0, 0)'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_status': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Ticket']"}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.ignoreemail': {
'Meta': {'object_name': 'IgnoreEmail'},
'date': ('django.db.models.fields.DateField', [], {'blank': 'True'}),
'email_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keep_in_mailbox': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.kbcategory': {
'Meta': {'ordering': "['title']", 'object_name': 'KBCategory'},
'description': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'helpdesk.kbitem': {
'Meta': {'ordering': "['title']", 'object_name': 'KBItem'},
'answer': ('django.db.models.fields.TextField', [], {}),
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.KBCategory']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_updated': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'question': ('django.db.models.fields.TextField', [], {}),
'recommendations': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'votes': ('django.db.models.fields.IntegerField', [], {'default': '0'})
},
u'helpdesk.presetreply': {
'Meta': {'ordering': "['name']", 'object_name': 'PreSetReply'},
'body': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.queue': {
'Meta': {'ordering': "('title',)", 'object_name': 'Queue'},
'allow_email_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'allow_public_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'email_box_host': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_imap_folder': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'email_box_interval': ('django.db.models.fields.IntegerField', [], {'default': "'5'", 'null': 'True', 'blank': 'True'}),
'email_box_last_check': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'email_box_pass': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_port': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'email_box_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_box_type': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
'email_box_user': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'escalate_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'new_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'updated_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
u'helpdesk.savedsearch': {
'Meta': {'object_name': 'SavedSearch'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'query': ('django.db.models.fields.TextField', [], {}),
'shared': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
},
u'helpdesk.ticket': {
'Meta': {'ordering': "('id',)", 'object_name': 'Ticket'},
'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assigned_to'", 'null': 'True', 'to': u"orm['auth.User']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'due_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_escalation': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'on_hold': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'priority': ('django.db.models.fields.IntegerField', [], {'default': '3', 'blank': '3'}),
'queue': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Queue']"}),
'resolution': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'submitter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200'})
},
u'helpdesk.ticketcc': {
'Meta': {'object_name': 'TicketCC'},
'can_update': ('django.db.models.fields.BooleanField', [], {}),
'can_view': ('django.db.models.fields.BooleanField', [], {}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Ticket']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.ticketchange': {
'Meta': {'object_name': 'TicketChange'},
'field': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.FollowUp']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'old_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
u'helpdesk.ticketcustomfieldvalue': {
'Meta': {'object_name': 'TicketCustomFieldValue'},
'field': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.CustomField']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Ticket']"}),
'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
u'helpdesk.ticketdependency': {
'Meta': {'unique_together': "(('ticket', 'depends_on'),)", 'object_name': 'TicketDependency'},
'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'depends_on'", 'to': u"orm['helpdesk.Ticket']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ticketdependency'", 'to': u"orm['helpdesk.Ticket']"})
},
u'helpdesk.usersettings': {
'Meta': {'object_name': 'UserSettings'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'settings_pickled': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
}
}
complete_apps = ['helpdesk']

View File

@ -0,0 +1,228 @@
# -*- coding: utf-8 -*-
from south.utils import datetime_utils as datetime
from south.db import db
from south.v2 import SchemaMigration
from django.db import models
class Migration(SchemaMigration):
def forwards(self, orm):
# Changing field 'Attachment.filename'
db.alter_column(u'helpdesk_attachment', 'filename', self.gf('django.db.models.fields.CharField')(max_length=1000))
def backwards(self, orm):
# Changing field 'Attachment.filename'
db.alter_column(u'helpdesk_attachment', 'filename', self.gf('django.db.models.fields.CharField')(max_length=100))
models = {
u'auth.group': {
'Meta': {'object_name': 'Group'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
},
u'auth.permission': {
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
},
u'auth.user': {
'Meta': {'object_name': 'User'},
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Group']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "u'user_set'", 'blank': 'True', 'to': u"orm['auth.Permission']"}),
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
},
u'contenttypes.contenttype': {
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'helpdesk.attachment': {
'Meta': {'ordering': "['filename']", 'object_name': 'Attachment'},
'file': ('django.db.models.fields.files.FileField', [], {'max_length': '1000'}),
'filename': ('django.db.models.fields.CharField', [], {'max_length': '1000'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.FollowUp']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'mime_type': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
'size': ('django.db.models.fields.IntegerField', [], {})
},
u'helpdesk.customfield': {
'Meta': {'object_name': 'CustomField'},
'data_type': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'decimal_places': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'empty_selection_list': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'help_text': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'label': ('django.db.models.fields.CharField', [], {'max_length': "'30'"}),
'list_values': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'max_length': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'name': ('django.db.models.fields.SlugField', [], {'unique': 'True', 'max_length': '50'}),
'ordering': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'required': ('django.db.models.fields.BooleanField', [], {}),
'staff_only': ('django.db.models.fields.BooleanField', [], {})
},
u'helpdesk.emailtemplate': {
'Meta': {'ordering': "['template_name', 'locale']", 'object_name': 'EmailTemplate'},
'heading': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'html': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'plain_text': ('django.db.models.fields.TextField', [], {}),
'subject': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'template_name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'helpdesk.escalationexclusion': {
'Meta': {'object_name': 'EscalationExclusion'},
'date': ('django.db.models.fields.DateField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.followup': {
'Meta': {'ordering': "['date']", 'object_name': 'FollowUp'},
'comment': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'date': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime(2014, 9, 2, 0, 0)'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_status': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'public': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Ticket']"}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.ignoreemail': {
'Meta': {'object_name': 'IgnoreEmail'},
'date': ('django.db.models.fields.DateField', [], {'blank': 'True'}),
'email_address': ('django.db.models.fields.CharField', [], {'max_length': '150'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'keep_in_mailbox': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.kbcategory': {
'Meta': {'ordering': "['title']", 'object_name': 'KBCategory'},
'description': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'})
},
u'helpdesk.kbitem': {
'Meta': {'ordering': "['title']", 'object_name': 'KBItem'},
'answer': ('django.db.models.fields.TextField', [], {}),
'category': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.KBCategory']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_updated': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'question': ('django.db.models.fields.TextField', [], {}),
'recommendations': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'votes': ('django.db.models.fields.IntegerField', [], {'default': '0'})
},
u'helpdesk.presetreply': {
'Meta': {'ordering': "['name']", 'object_name': 'PreSetReply'},
'body': ('django.db.models.fields.TextField', [], {}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'queues': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': u"orm['helpdesk.Queue']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.queue': {
'Meta': {'ordering': "('title',)", 'object_name': 'Queue'},
'allow_email_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'allow_public_submission': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_address': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'email_box_host': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_imap_folder': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True', 'blank': 'True'}),
'email_box_interval': ('django.db.models.fields.IntegerField', [], {'default': "'5'", 'null': 'True', 'blank': 'True'}),
'email_box_last_check': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'email_box_pass': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'email_box_port': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
'email_box_ssl': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'email_box_type': ('django.db.models.fields.CharField', [], {'max_length': '5', 'null': 'True', 'blank': 'True'}),
'email_box_user': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'escalate_days': ('django.db.models.fields.IntegerField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'locale': ('django.db.models.fields.CharField', [], {'max_length': '10', 'null': 'True', 'blank': 'True'}),
'new_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'}),
'slug': ('django.db.models.fields.SlugField', [], {'max_length': '50'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'updated_ticket_cc': ('django.db.models.fields.CharField', [], {'max_length': '200', 'null': 'True', 'blank': 'True'})
},
u'helpdesk.savedsearch': {
'Meta': {'object_name': 'SavedSearch'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'query': ('django.db.models.fields.TextField', [], {}),
'shared': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']"})
},
u'helpdesk.ticket': {
'Meta': {'ordering': "('id',)", 'object_name': 'Ticket'},
'assigned_to': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'assigned_to'", 'null': 'True', 'to': u"orm['auth.User']"}),
'created': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'description': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'due_date': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'last_escalation': ('django.db.models.fields.DateTimeField', [], {'null': 'True', 'blank': 'True'}),
'modified': ('django.db.models.fields.DateTimeField', [], {'blank': 'True'}),
'on_hold': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
'priority': ('django.db.models.fields.IntegerField', [], {'default': '3', 'blank': '3'}),
'queue': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Queue']"}),
'resolution': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'status': ('django.db.models.fields.IntegerField', [], {'default': '1'}),
'submitter_email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
'title': ('django.db.models.fields.CharField', [], {'max_length': '200'})
},
u'helpdesk.ticketcc': {
'Meta': {'object_name': 'TicketCC'},
'can_update': ('django.db.models.fields.BooleanField', [], {}),
'can_view': ('django.db.models.fields.BooleanField', [], {}),
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'null': 'True', 'blank': 'True'}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Ticket']"}),
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'null': 'True', 'blank': 'True'})
},
u'helpdesk.ticketchange': {
'Meta': {'object_name': 'TicketChange'},
'field': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
'followup': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.FollowUp']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'new_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'old_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
u'helpdesk.ticketcustomfieldvalue': {
'Meta': {'object_name': 'TicketCustomFieldValue'},
'field': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.CustomField']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['helpdesk.Ticket']"}),
'value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'})
},
u'helpdesk.ticketdependency': {
'Meta': {'unique_together': "(('ticket', 'depends_on'),)", 'object_name': 'TicketDependency'},
'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'depends_on'", 'to': u"orm['helpdesk.Ticket']"}),
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'ticket': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'ticketdependency'", 'to': u"orm['helpdesk.Ticket']"})
},
u'helpdesk.usersettings': {
'Meta': {'object_name': 'UserSettings'},
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
'settings_pickled': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'user': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['auth.User']", 'unique': 'True'})
}
}
complete_apps = ['helpdesk']

View File

View File

@ -0,0 +1,55 @@
/*
Bootstrap overrides
*/
.thumbnail.filterBox {
display: none;
float: left;
border: solid #ccc 1px;
padding: 10px;
margin: 4px;
max-width: 24%;
min-height: 200px;
}
.thumbnail.filterBoxShow {
display: block;
}
.filterBox label {
clear: both;
display: block;
}
.filterBox .filterHelp {
color: #aaa;
font-size: 0.8em;
clear: both;
}
#searchtabs {margin-bottom: 20px;}
.row_tablehead, table.table caption {background-color: #dbd5d9;}
table.table caption {height: 2em; line-height: 2em; font-weight: bold;}
table.ticket-stats caption {color: #fbff00; font-style: italic;}
table.ticket-stats tbody th, table.ticket-stats tbody tr {padding-left: 20px}
.errorlist {list-style: none;}
.errorlist {padding: 0;}
.has-error .input-group input, .has-error .input-group select, .has-error .input-group textarea {border-color: #b94a48}
#helpdesk-nav-collapse #searchform {
padding-top: 0;
}
#ticket-description {background-color: #FCF8E3;}
.followup.well {background-color: #f4f5ff;}
/*
Add your custom styles here
*/
#footer {
border-top: 2px solid #AAAAAA;
margin-top: 20px;
padding: 10px 0;
}
#helpdesk-body {padding-top: 100px;}
img.brand {padding-right: 30px;}

View File

@ -1,7 +0,0 @@
$(document).ready(function() {
$("tr.row_hover").mouseover(function() {
$(this).addClass("hover");
}).mouseout(function() {
$(this).removeClass("hover");
});
});

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
.jqplot-target{position:relative;color:#666;font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;font-size:1em;}.jqplot-axis{font-size:.75em;}.jqplot-xaxis{margin-top:10px;}.jqplot-x2axis{margin-bottom:10px;}.jqplot-yaxis{margin-right:10px;}.jqplot-y2axis,.jqplot-y3axis,.jqplot-y4axis,.jqplot-y5axis,.jqplot-y6axis,.jqplot-y7axis,.jqplot-y8axis,.jqplot-y9axis{margin-left:10px;margin-right:10px;}.jqplot-axis-tick,.jqplot-xaxis-tick,.jqplot-yaxis-tick,.jqplot-x2axis-tick,.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{position:absolute;}.jqplot-xaxis-tick{top:0;left:15px;vertical-align:top;}.jqplot-x2axis-tick{bottom:0;left:15px;vertical-align:bottom;}.jqplot-yaxis-tick{right:0;top:15px;text-align:right;}.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{left:0;top:15px;text-align:left;}.jqplot-meterGauge-tick{font-size:.75em;color:#999;}.jqplot-meterGauge-label{font-size:1em;color:#999;}.jqplot-xaxis-label{margin-top:10px;font-size:11pt;position:absolute;}.jqplot-x2axis-label{margin-bottom:10px;font-size:11pt;position:absolute;}.jqplot-yaxis-label{margin-right:10px;font-size:11pt;position:absolute;}.jqplot-y2axis-label,.jqplot-y3axis-label,.jqplot-y4axis-label,.jqplot-y5axis-label,.jqplot-y6axis-label,.jqplot-y7axis-label,.jqplot-y8axis-label,.jqplot-y9axis-label{font-size:11pt;position:absolute;}table.jqplot-table-legend{margin-top:12px;margin-bottom:12px;margin-left:12px;margin-right:12px;}table.jqplot-table-legend,table.jqplot-cursor-legend{background-color:rgba(255,255,255,0.6);border:1px solid #ccc;position:absolute;font-size:.75em;}td.jqplot-table-legend{vertical-align:middle;}td.jqplot-seriesToggle:hover,td.jqplot-seriesToggle:active{cursor:pointer;}td.jqplot-table-legend>div{border:1px solid #ccc;padding:1px;}div.jqplot-table-legend-swatch{width:0;height:0;border-top-width:5px;border-bottom-width:5px;border-left-width:6px;border-right-width:6px;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid;}.jqplot-title{top:0;left:0;padding-bottom:.5em;font-size:1.2em;}table.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;}.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-highlighter-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px;}.jqplot-point-label{font-size:.75em;z-index:2;}td.jqplot-cursor-legend-swatch{vertical-align:middle;text-align:center;}div.jqplot-cursor-legend-swatch{width:1.2em;height:.7em;}.jqplot-error{text-align:center;}.jqplot-error-message{position:relative;top:46%;display:inline-block;}div.jqplot-bubble-label{font-size:.8em;padding-left:2px;padding-right:2px;color:rgb(20%,20%,20%);}div.jqplot-bubble-label.jqplot-bubble-label-highlight{background:rgba(90%,90%,90%,0.7);}
.jqplot-target{position:relative;color:#666;font-family:"Trebuchet MS",Arial,Helvetica,sans-serif;font-size:1em}.jqplot-axis{font-size:.75em}.jqplot-xaxis{margin-top:10px}.jqplot-x2axis{margin-bottom:10px}.jqplot-yaxis{margin-right:10px}.jqplot-y2axis,.jqplot-y3axis,.jqplot-y4axis,.jqplot-y5axis,.jqplot-y6axis,.jqplot-y7axis,.jqplot-y8axis,.jqplot-y9axis,.jqplot-yMidAxis{margin-left:10px;margin-right:10px}.jqplot-axis-tick,.jqplot-xaxis-tick,.jqplot-yaxis-tick,.jqplot-x2axis-tick,.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick,.jqplot-yMidAxis-tick{position:absolute;white-space:pre}.jqplot-xaxis-tick{top:0;left:15px;vertical-align:top}.jqplot-x2axis-tick{bottom:0;left:15px;vertical-align:bottom}.jqplot-yaxis-tick{right:0;top:15px;text-align:right}.jqplot-yaxis-tick.jqplot-breakTick{right:-20px;margin-right:0;padding:1px 5px 1px 5px;z-index:2;font-size:1.5em}.jqplot-y2axis-tick,.jqplot-y3axis-tick,.jqplot-y4axis-tick,.jqplot-y5axis-tick,.jqplot-y6axis-tick,.jqplot-y7axis-tick,.jqplot-y8axis-tick,.jqplot-y9axis-tick{left:0;top:15px;text-align:left}.jqplot-yMidAxis-tick{text-align:center;white-space:nowrap}.jqplot-xaxis-label{margin-top:10px;font-size:11pt;position:absolute}.jqplot-x2axis-label{margin-bottom:10px;font-size:11pt;position:absolute}.jqplot-yaxis-label{margin-right:10px;font-size:11pt;position:absolute}.jqplot-yMidAxis-label{font-size:11pt;position:absolute}.jqplot-y2axis-label,.jqplot-y3axis-label,.jqplot-y4axis-label,.jqplot-y5axis-label,.jqplot-y6axis-label,.jqplot-y7axis-label,.jqplot-y8axis-label,.jqplot-y9axis-label{font-size:11pt;margin-left:10px;position:absolute}.jqplot-meterGauge-tick{font-size:.75em;color:#999}.jqplot-meterGauge-label{font-size:1em;color:#999}table.jqplot-table-legend{margin-top:12px;margin-bottom:12px;margin-left:12px;margin-right:12px}table.jqplot-table-legend,table.jqplot-cursor-legend{background-color:rgba(255,255,255,0.6);border:1px solid #ccc;position:absolute;font-size:.75em}td.jqplot-table-legend{vertical-align:middle}td.jqplot-seriesToggle:hover,td.jqplot-seriesToggle:active{cursor:pointer}.jqplot-table-legend .jqplot-series-hidden{text-decoration:line-through}div.jqplot-table-legend-swatch-outline{border:1px solid #ccc;padding:1px}div.jqplot-table-legend-swatch{width:0;height:0;border-top-width:5px;border-bottom-width:5px;border-left-width:6px;border-right-width:6px;border-top-style:solid;border-bottom-style:solid;border-left-style:solid;border-right-style:solid}.jqplot-title{top:0;left:0;padding-bottom:.5em;font-size:1.2em}table.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em}.jqplot-cursor-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px}.jqplot-highlighter-tooltip,.jqplot-canvasOverlay-tooltip{border:1px solid #ccc;font-size:.75em;white-space:nowrap;background:rgba(208,208,208,0.5);padding:1px}.jqplot-point-label{font-size:.75em;z-index:2}td.jqplot-cursor-legend-swatch{vertical-align:middle;text-align:center}div.jqplot-cursor-legend-swatch{width:1.2em;height:.7em}.jqplot-error{text-align:center}.jqplot-error-message{position:relative;top:46%;display:inline-block}div.jqplot-bubble-label{font-size:.8em;padding-left:2px;padding-right:2px;color:rgb(20%,20%,20%)}div.jqplot-bubble-label.jqplot-bubble-label-highlight{background:rgba(90%,90%,90%,0.7)}div.jqplot-noData-container{text-align:center;background-color:rgba(96%,96%,96%,0.3)}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(a){a.jqplot.BlockRenderer=function(){a.jqplot.LineRenderer.call(this)};a.jqplot.BlockRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.BlockRenderer.prototype.constructor=a.jqplot.BlockRenderer;a.jqplot.BlockRenderer.prototype.init=function(b){this.css={padding:"2px",border:"1px solid #999",textAlign:"center"};this.escapeHtml=false;this.insertBreaks=true;this.varyBlockColors=false;a.extend(true,this,b);if(this.css.backgroundColor){this.color=this.css.backgroundColor}else{if(this.css.background){this.color=this.css.background}else{if(!this.varyBlockColors){this.css.background=this.color}}}this.canvas=new a.jqplot.BlockCanvas();this.shadowCanvas=new a.jqplot.BlockCanvas();this.canvas._plotDimensions=this._plotDimensions;this.shadowCanvas._plotDimensions=this._plotDimensions;this.moveBlock=function(l,j,i,e){var c=this.canvas._elem.children(":eq("+l+")");this.data[l][0]=j;this.data[l][1]=i;this._plotData[l][0]=j;this._plotData[l][1]=i;this._stackData[l][0]=j;this._stackData[l][1]=i;this.gridData[l][0]=this._xaxis.series_u2p(j);this.gridData[l][1]=this._yaxis.series_u2p(i);var k=c.outerWidth();var f=c.outerHeight();var d=this.gridData[l][0]-k/2+"px";var g=this.gridData[l][1]-f/2+"px";if(e){if(parseInt(e,10)){e=parseInt(e,10)}c.animate({left:d,top:g},e)}else{c.css({left:d,top:g})}c=null}};a.jqplot.BlockRenderer.prototype.draw=function(q,o,r){if(this.plugins.pointLabels){this.plugins.pointLabels.show=false}var f,c,l,o,p,k,n,g,e,m;var b=(r!=undefined)?r:{};var j=new a.jqplot.ColorGenerator(this.seriesColors);this.canvas._elem.empty();for(f=0;f<this.gridData.length;f++){l=this.data[f];o=this.gridData[f];p="";k={};if(typeof l[2]=="string"){p=l[2]}else{if(typeof l[2]=="object"){k=l[2]}}if(typeof l[3]=="object"){k=l[3]}if(this.insertBreaks){p=p.replace(/ /g,"<br />")}k=a.extend(true,{},this.css,k);c=a('<div style="position:absolute;margin-left:auto;margin-right:auto;"></div>');this.canvas._elem.append(c);this.escapeHtml?c.text(p):c.html(p);delete k.position;delete k.marginRight;delete k.marginLeft;if(!k.background&&!k.backgroundColor&&!k.backgroundImage){k.background=j.next()}c.css(k);n=c.outerWidth();g=c.outerHeight();e=o[0]-n/2+"px";m=o[1]-g/2+"px";c.css({left:e,top:m});c=null}};a.jqplot.BlockCanvas=function(){a.jqplot.ElemContainer.call(this);this._ctx};a.jqplot.BlockCanvas.prototype=new a.jqplot.ElemContainer();a.jqplot.BlockCanvas.prototype.constructor=a.jqplot.BlockCanvas;a.jqplot.BlockCanvas.prototype.createElement=function(i,e,c){this._offsets=i;var b="jqplot-blockCanvas";if(e!=undefined){b=e}var g;if(this._elem){g=this._elem.get(0)}else{g=document.createElement("div")}if(c!=undefined){this._plotDimensions=c}var d=this._plotDimensions.width-this._offsets.left-this._offsets.right+"px";var f=this._plotDimensions.height-this._offsets.top-this._offsets.bottom+"px";this._elem=a(g);this._elem.css({position:"absolute",width:d,height:f,left:this._offsets.left,top:this._offsets.top});this._elem.addClass(b);return this._elem};a.jqplot.BlockCanvas.prototype.setContext=function(){this._ctx={canvas:{width:0,height:0},clearRect:function(){return null}};return this._ctx}})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(a){a.jqplot.BlockRenderer=function(){a.jqplot.LineRenderer.call(this)};a.jqplot.BlockRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.BlockRenderer.prototype.constructor=a.jqplot.BlockRenderer;a.jqplot.BlockRenderer.prototype.init=function(b){this.css={padding:"2px",border:"1px solid #999",textAlign:"center"};this.escapeHtml=false;this.insertBreaks=true;this.varyBlockColors=false;a.extend(true,this,b);if(this.css.backgroundColor){this.color=this.css.backgroundColor}else{if(this.css.background){this.color=this.css.background}else{if(!this.varyBlockColors){this.css.background=this.color}}}this.canvas=new a.jqplot.BlockCanvas();this.shadowCanvas=new a.jqplot.BlockCanvas();this.canvas._plotDimensions=this._plotDimensions;this.shadowCanvas._plotDimensions=this._plotDimensions;this._type="block";this.moveBlock=function(l,j,i,e){var c=this.canvas._elem.children(":eq("+l+")");this.data[l][0]=j;this.data[l][1]=i;this._plotData[l][0]=j;this._plotData[l][1]=i;this._stackData[l][0]=j;this._stackData[l][1]=i;this.gridData[l][0]=this._xaxis.series_u2p(j);this.gridData[l][1]=this._yaxis.series_u2p(i);var k=c.outerWidth();var f=c.outerHeight();var d=this.gridData[l][0]-k/2+"px";var g=this.gridData[l][1]-f/2+"px";if(e){if(parseInt(e,10)){e=parseInt(e,10)}c.animate({left:d,top:g},e)}else{c.css({left:d,top:g})}c=null}};a.jqplot.BlockRenderer.prototype.draw=function(q,o,r){if(this.plugins.pointLabels){this.plugins.pointLabels.show=false}var f,c,l,o,p,k,n,g,e,m;var b=(r!=undefined)?r:{};var j=new a.jqplot.ColorGenerator(this.seriesColors);this.canvas._elem.empty();for(f=0;f<this.gridData.length;f++){l=this.data[f];o=this.gridData[f];p="";k={};if(typeof l[2]=="string"){p=l[2]}else{if(typeof l[2]=="object"){k=l[2]}}if(typeof l[3]=="object"){k=l[3]}if(this.insertBreaks){p=p.replace(/ /g,"<br />")}k=a.extend(true,{},this.css,k);c=a('<div style="position:absolute;margin-left:auto;margin-right:auto;"></div>');this.canvas._elem.append(c);this.escapeHtml?c.text(p):c.html(p);delete k.position;delete k.marginRight;delete k.marginLeft;if(!k.background&&!k.backgroundColor&&!k.backgroundImage){k.background=j.next()}c.css(k);n=c.outerWidth();g=c.outerHeight();e=o[0]-n/2+"px";m=o[1]-g/2+"px";c.css({left:e,top:m});c=null}};a.jqplot.BlockCanvas=function(){a.jqplot.ElemContainer.call(this);this._ctx};a.jqplot.BlockCanvas.prototype=new a.jqplot.ElemContainer();a.jqplot.BlockCanvas.prototype.constructor=a.jqplot.BlockCanvas;a.jqplot.BlockCanvas.prototype.createElement=function(i,e,c){this._offsets=i;var b="jqplot-blockCanvas";if(e!=undefined){b=e}var g;if(this._elem){g=this._elem.get(0)}else{g=document.createElement("div")}if(c!=undefined){this._plotDimensions=c}var d=this._plotDimensions.width-this._offsets.left-this._offsets.right+"px";var f=this._plotDimensions.height-this._offsets.top-this._offsets.bottom+"px";this._elem=a(g);this._elem.css({position:"absolute",width:d,height:f,left:this._offsets.left,top:this._offsets.top});this._elem.addClass(b);return this._elem};a.jqplot.BlockCanvas.prototype.setContext=function(){this._ctx={canvas:{width:0,height:0},clearRect:function(){return null}};return this._ctx}})(jQuery);

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(a){a.jqplot.CanvasAxisLabelRenderer=function(b){this.angle=0;this.axis;this.show=true;this.showLabel=true;this.label="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="11pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);if(b.angle==null&&this.axis!="xaxis"&&this.axis!="x2axis"){this.angle=-90}var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){function d(){return !!(document.createElement("canvas").getContext&&typeof document.createElement("canvas").getContext("2d").fillText=="function")}if(d()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisLabelRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisLabelRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisLabelRenderer.prototype.draw=function(c){var e=document.createElement("canvas");this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.position="absolute";this._domelem=e;this._elem=a(e);this._elem.addClass("jqplot-"+this.axis+"-label");return this._elem};a.jqplot.CanvasAxisLabelRenderer.prototype.pack=function(){if(a.browser.msie){window.G_vmlCanvasManager.init_(document);this._domelem=window.G_vmlCanvasManager.initElement(this._domelem)}var b=this._elem.get(0).getContext("2d");this._textRenderer.draw(b,this.label)}})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(a){a.jqplot.CanvasAxisLabelRenderer=function(b){this.angle=0;this.axis;this.show=true;this.showLabel=true;this.label="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="11pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);if(b.angle==null&&this.axis!="xaxis"&&this.axis!="x2axis"){this.angle=-90}var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisLabelRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisLabelRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisLabelRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisLabelRenderer.prototype.draw=function(c,f){if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css({position:"absolute"});this._elem.addClass("jqplot-"+this.axis+"-label");e=null;return this._elem};a.jqplot.CanvasAxisLabelRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(a){a.jqplot.CanvasAxisTickRenderer=function(b){this.mark="outside";this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.angle=0;this.markSize=4;this.show=true;this.showLabel=true;this.labelPosition="auto";this.label="";this.value=null;this._styles={};this.formatter=a.jqplot.DefaultTickFormatter;this.formatString="";this.prefix="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="10pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){function d(){return !!(document.createElement("canvas").getContext&&typeof document.createElement("canvas").getContext("2d").fillText=="function")}if(d()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisTickRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisTickRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisTickRenderer.prototype.setTick=function(b,d,c){this.value=b;if(c){this.isMinorTick=true}return this};a.jqplot.CanvasAxisTickRenderer.prototype.draw=function(c){if(!this.label){this.label=this.formatter(this.formatString,this.value)}if(this.prefix&&!this.formatString){this.label=this.prefix+this.label}var e=document.createElement("canvas");this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.textAlign="left";e.style.position="absolute";this._domelem=e;this._elem=a(e);this._elem.css(this._styles);this._elem.addClass("jqplot-"+this.axis+"-tick");return this._elem};a.jqplot.CanvasAxisTickRenderer.prototype.pack=function(){if(a.browser.msie){window.G_vmlCanvasManager.init_(document);this._domelem=window.G_vmlCanvasManager.initElement(this._domelem)}var b=this._elem.get(0).getContext("2d");this._textRenderer.draw(b,this.label)}})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(a){a.jqplot.CanvasAxisTickRenderer=function(b){this.mark="outside";this.showMark=true;this.showGridline=true;this.isMinorTick=false;this.angle=0;this.markSize=4;this.show=true;this.showLabel=true;this.labelPosition="auto";this.label="";this.value=null;this._styles={};this.formatter=a.jqplot.DefaultTickFormatter;this.formatString="";this.prefix="";this.fontFamily='"Trebuchet MS", Arial, Helvetica, sans-serif';this.fontSize="10pt";this.fontWeight="normal";this.fontStretch=1;this.textColor="#666666";this.enableFontSupport=true;this.pt2px=null;this._elem;this._ctx;this._plotWidth;this._plotHeight;this._plotDimensions={height:null,width:null};a.extend(true,this,b);var c={fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily};if(this.pt2px){c.pt2px=this.pt2px}if(this.enableFontSupport){if(a.jqplot.support_canvas_text()){this._textRenderer=new a.jqplot.CanvasFontRenderer(c)}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}}else{this._textRenderer=new a.jqplot.CanvasTextRenderer(c)}};a.jqplot.CanvasAxisTickRenderer.prototype.init=function(b){a.extend(true,this,b);this._textRenderer.init({fontSize:this.fontSize,fontWeight:this.fontWeight,fontStretch:this.fontStretch,fillStyle:this.textColor,angle:this.getAngleRad(),fontFamily:this.fontFamily})};a.jqplot.CanvasAxisTickRenderer.prototype.getWidth=function(d){if(this._elem){return this._elem.outerWidth(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.sin(f.angle)*e)+Math.abs(Math.cos(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getHeight=function(d){if(this._elem){return this._elem.outerHeight(true)}else{var f=this._textRenderer;var c=f.getWidth(d);var e=f.getHeight(d);var b=Math.abs(Math.cos(f.angle)*e)+Math.abs(Math.sin(f.angle)*c);return b}};a.jqplot.CanvasAxisTickRenderer.prototype.getTop=function(b){if(this._elem){return this._elem.position().top}else{return null}};a.jqplot.CanvasAxisTickRenderer.prototype.getAngleRad=function(){var b=this.angle*Math.PI/180;return b};a.jqplot.CanvasAxisTickRenderer.prototype.setTick=function(b,d,c){this.value=b;if(c){this.isMinorTick=true}return this};a.jqplot.CanvasAxisTickRenderer.prototype.draw=function(c,f){if(!this.label){this.label=this.prefix+this.formatter(this.formatString,this.value)}if(this._elem){if(a.jqplot.use_excanvas&&window.G_vmlCanvasManager.uninitElement!==undefined){window.G_vmlCanvasManager.uninitElement(this._elem.get(0))}this._elem.emptyForce();this._elem=null}var e=f.canvasManager.getCanvas();this._textRenderer.setText(this.label,c);var b=this.getWidth(c);var d=this.getHeight(c);e.width=b;e.height=d;e.style.width=b;e.style.height=d;e.style.textAlign="left";e.style.position="absolute";e=f.canvasManager.initCanvas(e);this._elem=a(e);this._elem.css(this._styles);this._elem.addClass("jqplot-"+this.axis+"-tick");e=null;return this._elem};a.jqplot.CanvasAxisTickRenderer.prototype.pack=function(){this._textRenderer.draw(this._elem.get(0).getContext("2d"),this.label)}})(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(a){a.jqplot.ciParser=function(g,l){var m=[],o,n,h,f,e,c;if(typeof(g)=="string"){g=a.jqplot.JSON.parse(g,d)}else{if(typeof(g)=="object"){for(e in g){for(h=0;h<g[e].length;h++){for(c in g[e][h]){g[e][h][c]=d(c,g[e][h][c])}}}}else{return null}}function d(j,k){var i;if(k!=null){if(k.toString().indexOf("Date")>=0){i=/^\/Date\((-?[0-9]+)\)\/$/.exec(k);if(i){return parseInt(i[1],10)}}return k}}for(var b in g){o=[];n=g[b];switch(b){case"PriceTicks":for(h=0;h<n.length;h++){o.push([n[h]["TickDate"],n[h]["Price"]])}break;case"PriceBars":for(h=0;h<n.length;h++){o.push([n[h]["BarDate"],n[h]["Open"],n[h]["High"],n[h]["Low"],n[h]["Close"]])}break}m.push(o)}return m}})(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(d){d.jqplot.Dragable=function(g){this.markerRenderer=new d.jqplot.MarkerRenderer({shadow:false});this.shapeRenderer=new d.jqplot.ShapeRenderer();this.isDragging=false;this.isOver=false;this._ctx;this._elem;this._point;this._gridData;this.color;this.constrainTo="none";d.extend(true,this,g)};function b(){d.jqplot.GenericCanvas.call(this);this.isDragging=false;this.isOver=false;this._neighbor;this._cursors=[]}b.prototype=new d.jqplot.GenericCanvas();b.prototype.constructor=b;d.jqplot.Dragable.parseOptions=function(i,h){var g=h||{};this.plugins.dragable=new d.jqplot.Dragable(g.dragable);this.isDragable=d.jqplot.config.enablePlugins};d.jqplot.Dragable.postPlotDraw=function(){this.plugins.dragable={previousCursor:"auto",isOver:false};this.plugins.dragable.dragCanvas=new b();this.eventCanvas._elem.before(this.plugins.dragable.dragCanvas.createElement(this._gridPadding,"jqplot-dragable-canvas",this._plotDimensions));var g=this.plugins.dragable.dragCanvas.setContext()};d.jqplot.preParseSeriesOptionsHooks.push(d.jqplot.Dragable.parseOptions);d.jqplot.postDrawHooks.push(d.jqplot.Dragable.postPlotDraw);d.jqplot.eventListenerHooks.push(["jqplotMouseMove",e]);d.jqplot.eventListenerHooks.push(["jqplotMouseDown",c]);d.jqplot.eventListenerHooks.push(["jqplotMouseUp",a]);function f(n,p){var q=n.series[p.seriesIndex];var m=q.plugins.dragable;var h=q.markerRenderer;var i=m.markerRenderer;i.style=h.style;i.lineWidth=h.lineWidth+2.5;i.size=h.size+5;if(!m.color){var l=d.jqplot.getColorComponents(h.color);var o=[l[0],l[1],l[2]];var k=(l[3]>=0.6)?l[3]*0.6:l[3]*(2-l[3]);m.color="rgba("+o[0]+","+o[1]+","+o[2]+","+k+")"}i.color=m.color;i.init();var g=(p.pointIndex>0)?p.pointIndex-1:0;var j=p.pointIndex+2;m._gridData=q.gridData.slice(g,j)}function e(o,l,h,t,m){if(m.plugins.dragable.dragCanvas.isDragging){var u=m.plugins.dragable.dragCanvas;var i=u._neighbor;var w=m.series[i.seriesIndex];var k=w.plugins.dragable;var r=w.gridData;var p=(k.constrainTo=="y")?i.gridData[0]:l.x;var n=(k.constrainTo=="x")?i.gridData[1]:l.y;var g=w._xaxis.series_p2u(p);var q=w._yaxis.series_p2u(n);var v=u._ctx;v.clearRect(0,0,v.canvas.width,v.canvas.height);if(i.pointIndex>0){k._gridData[1]=[p,n]}else{k._gridData[0]=[p,n]}m.series[i.seriesIndex].draw(u._ctx,{gridData:k._gridData,shadow:false,preventJqPlotSeriesDrawTrigger:true,color:k.color,markerOptions:{color:k.color,shadow:false},trendline:{show:false}});m.target.trigger("jqplotSeriesPointChange",[i.seriesIndex,i.pointIndex,[g,q],[p,n]])}else{if(t!=null){var j=m.series[t.seriesIndex];if(j.isDragable){var u=m.plugins.dragable.dragCanvas;if(!u.isOver){u._cursors.push(o.target.style.cursor);o.target.style.cursor="pointer"}u.isOver=true}}else{if(t==null){var u=m.plugins.dragable.dragCanvas;if(u.isOver){o.target.style.cursor=u._cursors.pop();u.isOver=false}}}}}function c(k,i,g,l,j){var m=j.plugins.dragable.dragCanvas;m._cursors.push(k.target.style.cursor);if(l!=null){var o=j.series[l.seriesIndex];var h=o.plugins.dragable;if(o.isDragable&&!m.isDragging){m._neighbor=l;m.isDragging=true;f(j,l);h.markerRenderer.draw(o.gridData[l.pointIndex][0],o.gridData[l.pointIndex][1],m._ctx);k.target.style.cursor="move";j.target.trigger("jqlotDragStart",[l.seriesIndex,l.pointIndex,i,g])}}else{var n=m._ctx;n.clearRect(0,0,n.canvas.width,n.canvas.height);m.isDragging=false}}function a(m,j,g,o,k){if(k.plugins.dragable.dragCanvas.isDragging){var p=k.plugins.dragable.dragCanvas;var q=p._ctx;q.clearRect(0,0,q.canvas.width,q.canvas.height);p.isDragging=false;var h=p._neighbor;var r=k.series[h.seriesIndex];var i=r.plugins.dragable;var n=(i.constrainTo=="y")?h.data[0]:g[r.xaxis];var l=(i.constrainTo=="x")?h.data[1]:g[r.yaxis];r.data[h.pointIndex][0]=n;r.data[h.pointIndex][1]=l;k.drawSeries({preventJqPlotSeriesDrawTrigger:true},h.seriesIndex);p._neighbor=null;m.target.style.cursor=p._cursors.pop();k.target.trigger("jqlotDragStop",[j,g])}}})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(d){d.jqplot.Dragable=function(g){this.markerRenderer=new d.jqplot.MarkerRenderer({shadow:false});this.shapeRenderer=new d.jqplot.ShapeRenderer();this.isDragging=false;this.isOver=false;this._ctx;this._elem;this._point;this._gridData;this.color;this.constrainTo="none";d.extend(true,this,g)};function b(){d.jqplot.GenericCanvas.call(this);this.isDragging=false;this.isOver=false;this._neighbor;this._cursors=[]}b.prototype=new d.jqplot.GenericCanvas();b.prototype.constructor=b;d.jqplot.Dragable.parseOptions=function(i,h){var g=h||{};this.plugins.dragable=new d.jqplot.Dragable(g.dragable);this.isDragable=d.jqplot.config.enablePlugins};d.jqplot.Dragable.postPlotDraw=function(){if(this.plugins.dragable&&this.plugins.dragable.highlightCanvas){this.plugins.dragable.highlightCanvas.resetCanvas();this.plugins.dragable.highlightCanvas=null}this.plugins.dragable={previousCursor:"auto",isOver:false};this.plugins.dragable.dragCanvas=new b();this.eventCanvas._elem.before(this.plugins.dragable.dragCanvas.createElement(this._gridPadding,"jqplot-dragable-canvas",this._plotDimensions,this));var g=this.plugins.dragable.dragCanvas.setContext()};d.jqplot.preParseSeriesOptionsHooks.push(d.jqplot.Dragable.parseOptions);d.jqplot.postDrawHooks.push(d.jqplot.Dragable.postPlotDraw);d.jqplot.eventListenerHooks.push(["jqplotMouseMove",e]);d.jqplot.eventListenerHooks.push(["jqplotMouseDown",c]);d.jqplot.eventListenerHooks.push(["jqplotMouseUp",a]);function f(n,p){var q=n.series[p.seriesIndex];var m=q.plugins.dragable;var h=q.markerRenderer;var i=m.markerRenderer;i.style=h.style;i.lineWidth=h.lineWidth+2.5;i.size=h.size+5;if(!m.color){var l=d.jqplot.getColorComponents(h.color);var o=[l[0],l[1],l[2]];var k=(l[3]>=0.6)?l[3]*0.6:l[3]*(2-l[3]);m.color="rgba("+o[0]+","+o[1]+","+o[2]+","+k+")"}i.color=m.color;i.init();var g=(p.pointIndex>0)?p.pointIndex-1:0;var j=p.pointIndex+2;m._gridData=q.gridData.slice(g,j)}function e(o,l,h,t,m){if(m.plugins.dragable.dragCanvas.isDragging){var u=m.plugins.dragable.dragCanvas;var i=u._neighbor;var w=m.series[i.seriesIndex];var k=w.plugins.dragable;var r=w.gridData;var p=(k.constrainTo=="y")?i.gridData[0]:l.x;var n=(k.constrainTo=="x")?i.gridData[1]:l.y;var g=w._xaxis.series_p2u(p);var q=w._yaxis.series_p2u(n);var v=u._ctx;v.clearRect(0,0,v.canvas.width,v.canvas.height);if(i.pointIndex>0){k._gridData[1]=[p,n]}else{k._gridData[0]=[p,n]}m.series[i.seriesIndex].draw(u._ctx,{gridData:k._gridData,shadow:false,preventJqPlotSeriesDrawTrigger:true,color:k.color,markerOptions:{color:k.color,shadow:false},trendline:{show:false}});m.target.trigger("jqplotSeriesPointChange",[i.seriesIndex,i.pointIndex,[g,q],[p,n]])}else{if(t!=null){var j=m.series[t.seriesIndex];if(j.isDragable){var u=m.plugins.dragable.dragCanvas;if(!u.isOver){u._cursors.push(o.target.style.cursor);o.target.style.cursor="pointer"}u.isOver=true}}else{if(t==null){var u=m.plugins.dragable.dragCanvas;if(u.isOver){o.target.style.cursor=u._cursors.pop();u.isOver=false}}}}}function c(k,i,g,l,j){var m=j.plugins.dragable.dragCanvas;m._cursors.push(k.target.style.cursor);if(l!=null){var o=j.series[l.seriesIndex];var h=o.plugins.dragable;if(o.isDragable&&!m.isDragging){m._neighbor=l;m.isDragging=true;f(j,l);h.markerRenderer.draw(o.gridData[l.pointIndex][0],o.gridData[l.pointIndex][1],m._ctx);k.target.style.cursor="move";j.target.trigger("jqplotDragStart",[l.seriesIndex,l.pointIndex,i,g])}}else{var n=m._ctx;n.clearRect(0,0,n.canvas.width,n.canvas.height);m.isDragging=false}}function a(m,j,g,o,k){if(k.plugins.dragable.dragCanvas.isDragging){var p=k.plugins.dragable.dragCanvas;var q=p._ctx;q.clearRect(0,0,q.canvas.width,q.canvas.height);p.isDragging=false;var h=p._neighbor;var r=k.series[h.seriesIndex];var i=r.plugins.dragable;var n=(i.constrainTo=="y")?h.data[0]:g[r.xaxis];var l=(i.constrainTo=="x")?h.data[1]:g[r.yaxis];r.data[h.pointIndex][0]=n;r.data[h.pointIndex][1]=l;k.drawSeries({preventJqPlotSeriesDrawTrigger:true},h.seriesIndex);p._neighbor=null;m.target.style.cursor=p._cursors.pop();k.target.trigger("jqplotDragStop",[j,g])}}})(jQuery);

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(a){a.jqplot.EnhancedLegendRenderer=function(){a.jqplot.TableLegendRenderer.call(this)};a.jqplot.EnhancedLegendRenderer.prototype=new a.jqplot.TableLegendRenderer();a.jqplot.EnhancedLegendRenderer.prototype.constructor=a.jqplot.EnhancedLegendRenderer;a.jqplot.EnhancedLegendRenderer.prototype.init=function(b){this.numberRows=null;this.numberColumns=null;this.seriesToggle="normal";this.disableIEFading=true;a.extend(true,this,b);if(this.seriesToggle){a.jqplot.postDrawHooks.push(postDraw)}};a.jqplot.EnhancedLegendRenderer.prototype.draw=function(){var t=this;if(this.show){var m=this._series;var u="position:absolute;";u+=(this.background)?"background:"+this.background+";":"";u+=(this.border)?"border:"+this.border+";":"";u+=(this.fontSize)?"font-size:"+this.fontSize+";":"";u+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";u+=(this.textColor)?"color:"+this.textColor+";":"";u+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";u+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";u+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";u+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=a('<table class="jqplot-table-legend" style="'+u+'"></table>');if(this.seriesToggle){this._elem.css("z-index","3")}var d=false,o=false,q,l;if(this.numberRows){q=this.numberRows;if(!this.numberColumns){l=Math.ceil(m.length/q)}else{l=this.numberColumns}}else{if(this.numberColumns){l=this.numberColumns;q=Math.ceil(m.length/this.numberColumns)}else{q=m.length;l=1}}var n,k,p,e,c,h,g;var r=0;for(n=m.length-1;n>=0;n--){if(m[n]._stack||m[n].renderer.constructor==a.jqplot.BezierCurveRenderer){o=true}}for(n=0;n<q;n++){if(o){p=a('<tr class="jqplot-table-legend"></tr>').prependTo(this._elem)}else{p=a('<tr class="jqplot-table-legend"></tr>').appendTo(this._elem)}for(k=0;k<l;k++){if(r<m.length&&m[r].show&&m[r].showLabel){s=m[r];h=this.labels[r]||s.label.toString();if(h){var f=s.color;if(!o){if(n>0){d=true}else{d=false}}else{if(n==q-1){d=false}else{d=true}}g=(d)?this.rowSpacing:"0";e=a('<td class="jqplot-table-legend" style="text-align:center;padding-top:'+g+';"><div><div class="jqplot-table-legend-swatch" style="background-color:'+f+";border-color:"+f+';"></div></div></td>');c=a('<td class="jqplot-table-legend" style="padding-top:'+g+';"></td>');if(this.escapeHtml){c.text(h)}else{c.html(h)}if(o){if(this.showLabels){c.prependTo(p)}if(this.showSwatches){e.prependTo(p)}}else{if(this.showSwatches){e.appendTo(p)}if(this.showLabels){c.appendTo(p)}}if(this.seriesToggle){var b;if(typeof(this.seriesToggle)=="string"||typeof(this.seriesToggle)=="number"){if(!a.browser.msie||!this.disableIEFading){b=this.seriesToggle}}if(this.showSwatches){e.bind("click",{series:s,speed:b},s.toggleDisplay);e.addClass("jqplot-seriesToggle")}if(this.showLabels){c.bind("click",{series:s,speed:b},s.toggleDisplay);c.addClass("jqplot-seriesToggle")}}d=true}}r++}}}return this._elem};postDraw=function(){if(this.legend.renderer.constructor==a.jqplot.EnhancedLegendRenderer&&this.legend.seriesToggle){var b=this.legend._elem.detach();this.eventCanvas._elem.after(b)}}})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(c){c.jqplot.EnhancedLegendRenderer=function(){c.jqplot.TableLegendRenderer.call(this)};c.jqplot.EnhancedLegendRenderer.prototype=new c.jqplot.TableLegendRenderer();c.jqplot.EnhancedLegendRenderer.prototype.constructor=c.jqplot.EnhancedLegendRenderer;c.jqplot.EnhancedLegendRenderer.prototype.init=function(d){this.numberRows=null;this.numberColumns=null;this.seriesToggle="normal";this.seriesToggleReplot=false;this.disableIEFading=true;c.extend(true,this,d);if(this.seriesToggle){c.jqplot.postDrawHooks.push(b)}};c.jqplot.EnhancedLegendRenderer.prototype.draw=function(m,y){var f=this;if(this.show){var r=this._series;var u;var w="position:absolute;";w+=(this.background)?"background:"+this.background+";":"";w+=(this.border)?"border:"+this.border+";":"";w+=(this.fontSize)?"font-size:"+this.fontSize+";":"";w+=(this.fontFamily)?"font-family:"+this.fontFamily+";":"";w+=(this.textColor)?"color:"+this.textColor+";":"";w+=(this.marginTop!=null)?"margin-top:"+this.marginTop+";":"";w+=(this.marginBottom!=null)?"margin-bottom:"+this.marginBottom+";":"";w+=(this.marginLeft!=null)?"margin-left:"+this.marginLeft+";":"";w+=(this.marginRight!=null)?"margin-right:"+this.marginRight+";":"";this._elem=c('<table class="jqplot-table-legend" style="'+w+'"></table>');if(this.seriesToggle){this._elem.css("z-index","3")}var C=false,q=false,d,o;if(this.numberRows){d=this.numberRows;if(!this.numberColumns){o=Math.ceil(r.length/d)}else{o=this.numberColumns}}else{if(this.numberColumns){o=this.numberColumns;d=Math.ceil(r.length/this.numberColumns)}else{d=r.length;o=1}}var B,z,e,l,k,n,p,t,h,g;var v=0;for(B=r.length-1;B>=0;B--){if(o==1&&r[B]._stack||r[B].renderer.constructor==c.jqplot.BezierCurveRenderer){q=true}}for(B=0;B<d;B++){e=c(document.createElement("tr"));e.addClass("jqplot-table-legend");if(q){e.prependTo(this._elem)}else{e.appendTo(this._elem)}for(z=0;z<o;z++){if(v<r.length&&(r[v].show||r[v].showLabel)){u=r[v];n=this.labels[v]||u.label.toString();if(n){var x=u.color;if(!q){if(B>0){C=true}else{C=false}}else{if(B==d-1){C=false}else{C=true}}p=(C)?this.rowSpacing:"0";l=c(document.createElement("td"));l.addClass("jqplot-table-legend jqplot-table-legend-swatch");l.css({textAlign:"center",paddingTop:p});h=c(document.createElement("div"));h.addClass("jqplot-table-legend-swatch-outline");g=c(document.createElement("div"));g.addClass("jqplot-table-legend-swatch");g.css({backgroundColor:x,borderColor:x});l.append(h.append(g));k=c(document.createElement("td"));k.addClass("jqplot-table-legend jqplot-table-legend-label");k.css("paddingTop",p);if(this.escapeHtml){k.text(n)}else{k.html(n)}if(q){if(this.showLabels){k.prependTo(e)}if(this.showSwatches){l.prependTo(e)}}else{if(this.showSwatches){l.appendTo(e)}if(this.showLabels){k.appendTo(e)}}if(this.seriesToggle){var A;if(typeof(this.seriesToggle)==="string"||typeof(this.seriesToggle)==="number"){if(!c.jqplot.use_excanvas||!this.disableIEFading){A=this.seriesToggle}}if(this.showSwatches){l.bind("click",{series:u,speed:A,plot:y,replot:this.seriesToggleReplot},a);l.addClass("jqplot-seriesToggle")}if(this.showLabels){k.bind("click",{series:u,speed:A,plot:y,replot:this.seriesToggleReplot},a);k.addClass("jqplot-seriesToggle")}if(!u.show&&u.showLabel){l.addClass("jqplot-series-hidden");k.addClass("jqplot-series-hidden")}}C=true}}v++}l=k=h=g=null}}return this._elem};var a=function(j){var i=j.data,m=i.series,k=i.replot,h=i.plot,f=i.speed,l=m.index,g=false;if(m.canvas._elem.is(":hidden")||!m.show){g=true}var e=function(){if(k){var n={};if(c.isPlainObject(k)){c.extend(true,n,k)}h.replot(n);if(g&&f){var d=h.series[l];if(d.shadowCanvas._elem){d.shadowCanvas._elem.hide().fadeIn(f)}d.canvas._elem.hide().fadeIn(f);d.canvas._elem.nextAll(".jqplot-point-label.jqplot-series-"+d.index).hide().fadeIn(f)}}else{var d=h.series[l];if(d.canvas._elem.is(":hidden")||!d.show){if(typeof h.options.legend.showSwatches==="undefined"||h.options.legend.showSwatches===true){h.legend._elem.find("td").eq(l*2).addClass("jqplot-series-hidden")}if(typeof h.options.legend.showLabels==="undefined"||h.options.legend.showLabels===true){h.legend._elem.find("td").eq((l*2)+1).addClass("jqplot-series-hidden")}}else{if(typeof h.options.legend.showSwatches==="undefined"||h.options.legend.showSwatches===true){h.legend._elem.find("td").eq(l*2).removeClass("jqplot-series-hidden")}if(typeof h.options.legend.showLabels==="undefined"||h.options.legend.showLabels===true){h.legend._elem.find("td").eq((l*2)+1).removeClass("jqplot-series-hidden")}}}};m.toggleDisplay(j,e)};var b=function(){if(this.legend.renderer.constructor==c.jqplot.EnhancedLegendRenderer&&this.legend.seriesToggle){var d=this.legend._elem.detach();this.eventCanvas._elem.after(d)}}})(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function($){$.jqplot.JSON=window.JSON;if(!window.JSON){$.jqplot.JSON={}}function f(n){return n<10?"0"+n:n}if(typeof Date.prototype.toJSON!=="function"){Date.prototype.toJSON=function(key){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null};String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(key){return this.valueOf()}}var cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;function quote(string){escapable.lastIndex=0;return escapable.test(string)?'"'+string.replace(escapable,function(a){var c=meta[a];return typeof c==="string"?c:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+string+'"'}function str(key,holder){var i,k,v,length,mind=gap,partial,value=holder[key];if(value&&typeof value==="object"&&typeof value.toJSON==="function"){value=value.toJSON(key)}if(typeof rep==="function"){value=rep.call(holder,key,value)}switch(typeof value){case"string":return quote(value);case"number":return isFinite(value)?String(value):"null";case"boolean":case"null":return String(value);case"object":if(!value){return"null"}gap+=indent;partial=[];if(Object.prototype.toString.apply(value)==="[object Array]"){length=value.length;for(i=0;i<length;i+=1){partial[i]=str(i,value)||"null"}v=partial.length===0?"[]":gap?"[\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"]":"["+partial.join(",")+"]";gap=mind;return v}if(rep&&typeof rep==="object"){length=rep.length;for(i=0;i<length;i+=1){k=rep[i];if(typeof k==="string"){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}else{for(k in value){if(Object.hasOwnProperty.call(value,k)){v=str(k,value);if(v){partial.push(quote(k)+(gap?": ":":")+v)}}}}v=partial.length===0?"{}":gap?"{\n"+gap+partial.join(",\n"+gap)+"\n"+mind+"}":"{"+partial.join(",")+"}";gap=mind;return v}}if(typeof $.jqplot.JSON.stringify!=="function"){$.jqplot.JSON.stringify=function(value,replacer,space){var i;gap="";indent="";if(typeof space==="number"){for(i=0;i<space;i+=1){indent+=" "}}else{if(typeof space==="string"){indent=space}}rep=replacer;if(replacer&&typeof replacer!=="function"&&(typeof replacer!=="object"||typeof replacer.length!=="number")){throw new Error("$.jqplot.JSON.stringify")}return str("",{"":value})}}if(typeof $.jqplot.JSON.parse!=="function"){$.jqplot.JSON.parse=function(text,reviver){var j;function walk(holder,key){var k,v,value=holder[key];if(value&&typeof value==="object"){for(k in value){if(Object.hasOwnProperty.call(value,k)){v=walk(value,k);if(v!==undefined){value[k]=v}else{delete value[k]}}}}return reviver.call(holder,key,value)}text=String(text);cx.lastIndex=0;if(cx.test(text)){text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})}if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,""))){j=eval("("+text+")");return typeof reviver==="function"?walk({"":j},""):j}throw new SyntaxError("$.jqplot.JSON.parse")}}})(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,3 @@
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(b){function a(e,d,c){this.bindCustomEvents=function(){this.eventCanvas._elem.bind("vclick",{plot:this},this.onClick);this.eventCanvas._elem.bind("dblclick",{plot:this},this.onDblClick);this.eventCanvas._elem.bind("taphold",{plot:this},this.onDblClick);this.eventCanvas._elem.bind("vmousedown",{plot:this},this.onMouseDown);this.eventCanvas._elem.bind("vmousemove",{plot:this},this.onMouseMove);this.eventCanvas._elem.bind("mouseenter",{plot:this},this.onMouseEnter);this.eventCanvas._elem.bind("mouseleave",{plot:this},this.onMouseLeave);if(this.captureRightClick){this.eventCanvas._elem.bind("vmouseup",{plot:this},this.onRightClick);this.eventCanvas._elem.get(0).oncontextmenu=function(){return false}}else{this.eventCanvas._elem.bind("vmouseup",{plot:this},this.onMouseUp)}};this.plugins.mobile=true}b.jqplot.postInitHooks.push(a)})(jQuery);

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(a){a.jqplot.OHLCRenderer=function(){a.jqplot.LineRenderer.call(this);this.candleStick=false;this.tickLength="auto";this.bodyWidth="auto";this.openColor=null;this.closeColor=null;this.wickColor=null;this.fillUpBody=false;this.fillDownBody=true;this.upBodyColor=null;this.downBodyColor=null;this.hlc=false;this._tickLength;this._bodyWidth};a.jqplot.OHLCRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.OHLCRenderer.prototype.constructor=a.jqplot.OHLCRenderer;a.jqplot.OHLCRenderer.prototype.init=function(e){this.lineWidth=1.5;a.jqplot.LineRenderer.prototype.init.call(this,e);var b=this._yaxis._dataBounds;var f=this._plotData;if(f[0].length<5){this.renderer.hlc=true;for(var c=0;c<f.length;c++){if(f[c][2]<b.min||b.min==null){b.min=f[c][2]}if(f[c][1]>b.max||b.max==null){b.max=f[c][1]}}}else{for(var c=0;c<f.length;c++){if(f[c][3]<b.min||b.min==null){b.min=f[c][3]}if(f[c][2]>b.max||b.max==null){b.max=f[c][2]}}}};a.jqplot.OHLCRenderer.prototype.draw=function(z,J,g){var G=this.data;var u=this._xaxis.min;var y=this._xaxis.max;var k=0;var H=G.length;var n=this._xaxis.series_u2p;var F=this._yaxis.series_u2p;var C,D,e,I,E,m,K,B;var v;var t=this.renderer;var q=(g!=undefined)?g:{};var j=(q.shadow!=undefined)?q.shadow:this.shadow;var A=(q.fill!=undefined)?q.fill:this.fill;var c=(q.fillAndStroke!=undefined)?q.fillAndStroke:this.fillAndStroke;t.bodyWidth=(q.bodyWidth!=undefined)?q.bodyWidth:t.bodyWidth;t.tickLength=(q.tickLength!=undefined)?q.tickLength:t.tickLength;z.save();if(this.show){var l,p,f,L,s;for(var C=0;C<G.length;C++){if(G[C][0]<u){k=C}else{if(G[C][0]<y){H=C+1}}}if(t.candleStick){if(typeof(t.bodyWidth)=="number"){t._bodyWidth=t.bodyWidth}else{t._bodyWidth=Math.min(20,z.canvas.width/(H-k)/2)}}else{if(typeof(t.tickLength)=="number"){t._tickLength=t.tickLength}else{t._tickLength=Math.min(10,z.canvas.width/(H-k)/4)}}for(var C=k;C<H;C++){l=n(G[C][0]);if(t.hlc){p=null;f=F(G[C][1]);L=F(G[C][2]);s=F(G[C][3])}else{p=F(G[C][1]);f=F(G[C][2]);L=F(G[C][3]);s=F(G[C][4])}v={};if(t.candleStick&&!t.hlc){m=t._bodyWidth;K=l-m/2;if(s<p){if(t.wickColor){v.color=t.wickColor}else{if(t.downBodyColor){v.color=t.upBodyColor}}e=a.extend(true,{},q,v);t.shapeRenderer.draw(z,[[l,f],[l,s]],e);t.shapeRenderer.draw(z,[[l,p],[l,L]],e);v={};I=s;E=p-s;if(t.fillUpBody){v.fillRect=true}else{v.strokeRect=true;m=m-this.lineWidth;K=l-m/2}if(t.upBodyColor){v.color=t.upBodyColor;v.fillStyle=t.upBodyColor}B=[K,I,m,E]}else{if(s>p){if(t.wickColor){v.color=t.wickColor}else{if(t.downBodyColor){v.color=t.downBodyColor}}e=a.extend(true,{},q,v);t.shapeRenderer.draw(z,[[l,f],[l,p]],e);t.shapeRenderer.draw(z,[[l,s],[l,L]],e);v={};I=p;E=s-p;if(t.fillDownBody){v.fillRect=true}else{v.strokeRect=true;m=m-this.lineWidth;K=l-m/2}if(t.downBodyColor){v.color=t.downBodyColor;v.fillStyle=t.downBodyColor}B=[K,I,m,E]}else{if(t.wickColor){v.color=t.wickColor}e=a.extend(true,{},q,v);t.shapeRenderer.draw(z,[[l,f],[l,L]],e);v={};v.fillRect=false;v.strokeRect=false;K=[l-m/2,p];I=[l+m/2,s];m=null;E=null;B=[K,I]}}e=a.extend(true,{},q,v);t.shapeRenderer.draw(z,B,e)}else{D=q.color;if(t.openColor){q.color=t.openColor}if(!t.hlc){t.shapeRenderer.draw(z,[[l-t._tickLength,p],[l,p]],q)}q.color=D;if(t.wickColor){q.color=t.wickColor}t.shapeRenderer.draw(z,[[l,f],[l,L]],q);q.color=D;if(t.closeColor){q.color=t.closeColor}t.shapeRenderer.draw(z,[[l,s],[l+t._tickLength,s]],q);q.color=D}}}z.restore()};a.jqplot.OHLCRenderer.prototype.drawShadow=function(b,d,c){};a.jqplot.OHLCRenderer.checkOptions=function(d,c,b){if(!b.highlighter){b.highlighter={showMarker:false,tooltipAxes:"y",yvalues:4,formatString:'<table class="jqplot-highlighter"><tr><td>date:</td><td>%s</td></tr><tr><td>open:</td><td>%s</td></tr><tr><td>hi:</td><td>%s</td></tr><tr><td>low:</td><td>%s</td></tr><tr><td>close:</td><td>%s</td></tr></table>'}}}})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(a){a.jqplot.OHLCRenderer=function(){a.jqplot.LineRenderer.call(this);this.candleStick=false;this.tickLength="auto";this.bodyWidth="auto";this.openColor=null;this.closeColor=null;this.wickColor=null;this.fillUpBody=false;this.fillDownBody=true;this.upBodyColor=null;this.downBodyColor=null;this.hlc=false;this.lineWidth=1.5;this._tickLength;this._bodyWidth};a.jqplot.OHLCRenderer.prototype=new a.jqplot.LineRenderer();a.jqplot.OHLCRenderer.prototype.constructor=a.jqplot.OHLCRenderer;a.jqplot.OHLCRenderer.prototype.init=function(e){e=e||{};this.lineWidth=e.lineWidth||1.5;a.jqplot.LineRenderer.prototype.init.call(this,e);this._type="ohlc";var b=this._yaxis._dataBounds;var f=this._plotData;if(f[0].length<5){this.renderer.hlc=true;for(var c=0;c<f.length;c++){if(f[c][2]<b.min||b.min==null){b.min=f[c][2]}if(f[c][1]>b.max||b.max==null){b.max=f[c][1]}}}else{for(var c=0;c<f.length;c++){if(f[c][3]<b.min||b.min==null){b.min=f[c][3]}if(f[c][2]>b.max||b.max==null){b.max=f[c][2]}}}};a.jqplot.OHLCRenderer.prototype.draw=function(A,N,j){var J=this.data;var v=this._xaxis.min;var z=this._xaxis.max;var l=0;var K=J.length;var p=this._xaxis.series_u2p;var G=this._yaxis.series_u2p;var D,E,f,M,F,n,O,C;var y;var u=this.renderer;var s=(j!=undefined)?j:{};var k=(s.shadow!=undefined)?s.shadow:this.shadow;var B=(s.fill!=undefined)?s.fill:this.fill;var c=(s.fillAndStroke!=undefined)?s.fillAndStroke:this.fillAndStroke;u.bodyWidth=(s.bodyWidth!=undefined)?s.bodyWidth:u.bodyWidth;u.tickLength=(s.tickLength!=undefined)?s.tickLength:u.tickLength;A.save();if(this.show){var m,q,g,Q,t;for(var D=0;D<J.length;D++){if(J[D][0]<v){l=D}else{if(J[D][0]<z){K=D+1}}}var I=this.gridData[K-1][0]-this.gridData[l][0];var L=K-l;try{var P=Math.abs(this._xaxis.series_u2p(parseInt(this._xaxis._intervalStats[0].sortedIntervals[0].interval,10))-this._xaxis.series_u2p(0))}catch(H){var P=I/L}if(u.candleStick){if(typeof(u.bodyWidth)=="number"){u._bodyWidth=u.bodyWidth}else{u._bodyWidth=Math.min(20,P/1.65)}}else{if(typeof(u.tickLength)=="number"){u._tickLength=u.tickLength}else{u._tickLength=Math.min(10,P/3.5)}}for(var D=l;D<K;D++){m=p(J[D][0]);if(u.hlc){q=null;g=G(J[D][1]);Q=G(J[D][2]);t=G(J[D][3])}else{q=G(J[D][1]);g=G(J[D][2]);Q=G(J[D][3]);t=G(J[D][4])}y={};if(u.candleStick&&!u.hlc){n=u._bodyWidth;O=m-n/2;if(t<q){if(u.wickColor){y.color=u.wickColor}else{if(u.downBodyColor){y.color=u.upBodyColor}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,t]],f);u.shapeRenderer.draw(A,[[m,q],[m,Q]],f);y={};M=t;F=q-t;if(u.fillUpBody){y.fillRect=true}else{y.strokeRect=true;n=n-this.lineWidth;O=m-n/2}if(u.upBodyColor){y.color=u.upBodyColor;y.fillStyle=u.upBodyColor}C=[O,M,n,F]}else{if(t>q){if(u.wickColor){y.color=u.wickColor}else{if(u.downBodyColor){y.color=u.downBodyColor}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,q]],f);u.shapeRenderer.draw(A,[[m,t],[m,Q]],f);y={};M=q;F=t-q;if(u.fillDownBody){y.fillRect=true}else{y.strokeRect=true;n=n-this.lineWidth;O=m-n/2}if(u.downBodyColor){y.color=u.downBodyColor;y.fillStyle=u.downBodyColor}C=[O,M,n,F]}else{if(u.wickColor){y.color=u.wickColor}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,[[m,g],[m,Q]],f);y={};y.fillRect=false;y.strokeRect=false;O=[m-n/2,q];M=[m+n/2,t];n=null;F=null;C=[O,M]}}f=a.extend(true,{},s,y);u.shapeRenderer.draw(A,C,f)}else{E=s.color;if(u.openColor){s.color=u.openColor}if(!u.hlc){u.shapeRenderer.draw(A,[[m-u._tickLength,q],[m,q]],s)}s.color=E;if(u.wickColor){s.color=u.wickColor}u.shapeRenderer.draw(A,[[m,g],[m,Q]],s);s.color=E;if(u.closeColor){s.color=u.closeColor}u.shapeRenderer.draw(A,[[m,t],[m+u._tickLength,t]],s);s.color=E}}}A.restore()};a.jqplot.OHLCRenderer.prototype.drawShadow=function(b,d,c){};a.jqplot.OHLCRenderer.checkOptions=function(d,c,b){if(!b.highlighter){b.highlighter={showMarker:false,tooltipAxes:"y",yvalues:4,formatString:'<table class="jqplot-highlighter"><tr><td>date:</td><td>%s</td></tr><tr><td>open:</td><td>%s</td></tr><tr><td>hi:</td><td>%s</td></tr><tr><td>low:</td><td>%s</td></tr><tr><td>close:</td><td>%s</td></tr></table>'}}}})(jQuery);

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(c){c.jqplot.PointLabels=function(e){this.show=c.jqplot.config.enablePlugins;this.location="n";this.labelsFromSeries=false;this.seriesLabelIndex=null;this.labels=[];this._labels=[];this.stackedValue=false;this.ypadding=6;this.xpadding=6;this.escapeHTML=true;this.edgeTolerance=-5;this.formatter=c.jqplot.DefaultTickFormatter;this.formatString="";this.hideZeros=false;this._elems=[];c.extend(true,this,e)};var a=["nw","n","ne","e","se","s","sw","w"];var d={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var b=["se","s","sw","w","nw","n","ne","e"];c.jqplot.PointLabels.init=function(i,h,f,g){var e=c.extend(true,{},f,g);e.pointLabels=e.pointLabels||{};if(this.renderer.constructor==c.jqplot.BarRenderer&&this.barDirection=="horizontal"&&!e.pointLabels.location){e.pointLabels.location="e"}this.plugins.pointLabels=new c.jqplot.PointLabels(e.pointLabels);this.plugins.pointLabels.setLabels.call(this)};c.jqplot.PointLabels.prototype.setLabels=function(){var f=this.plugins.pointLabels;var h;if(f.seriesLabelIndex!=null){h=f.seriesLabelIndex}else{if(this.renderer.constructor==c.jqplot.BarRenderer&&this.barDirection=="horizontal"){h=0}else{h=this._plotData[0].length-1}}f._labels=[];if(f.labels.length==0||f.labelsFromSeries){if(f.stackedValue){if(this._plotData.length&&this._plotData[0].length){for(var e=0;e<this._plotData.length;e++){f._labels.push(this._plotData[e][h])}}}else{var g=this.data;if(this.renderer.constructor==c.jqplot.BarRenderer&&this.waterfall){g=this._data}if(g.length&&g[0].length){for(var e=0;e<g.length;e++){f._labels.push(g[e][h])}}}}else{if(f.labels.length){f._labels=f.labels}}};c.jqplot.PointLabels.prototype.xOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerWidth(true)-this.xpadding;break;case"n":h=-f.outerWidth(true)/2;break;case"ne":h=this.xpadding;break;case"e":h=this.xpadding;break;case"se":h=this.xpadding;break;case"s":h=-f.outerWidth(true)/2;break;case"sw":h=-f.outerWidth(true)-this.xpadding;break;case"w":h=-f.outerWidth(true)-this.xpadding;break;default:h=-f.outerWidth(true)-this.xpadding;break}return h};c.jqplot.PointLabels.prototype.yOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerHeight(true)-this.ypadding;break;case"n":h=-f.outerHeight(true)-this.ypadding;break;case"ne":h=-f.outerHeight(true)-this.ypadding;break;case"e":h=-f.outerHeight(true)/2;break;case"se":h=this.ypadding;break;case"s":h=this.ypadding;break;case"sw":h=this.ypadding;break;case"w":h=-f.outerHeight(true)/2;break;default:h=-f.outerHeight(true)-this.ypadding;break}return h};c.jqplot.PointLabels.draw=function(t,h){var r=this.plugins.pointLabels;r.setLabels.call(this);for(var s=0;s<r._elems.length;s++){r._elems[s].remove()}if(r.show){var o="_"+this._stackAxis+"axis";if(!r.formatString){r.formatString=this[o]._ticks[0].formatString;r.formatter=this[o]._ticks[0].formatter}var z=this._plotData;var w=this._xaxis;var n=this._yaxis;for(var s=r._labels.length-1;s>=0;s--){var m=r._labels[s];if(r.hideZeros&&parseInt(r._labels[s],10)==0){m=""}if(m!=null){m=r.formatter(r.formatString,m)}var v=c('<div class="jqplot-point-label jqplot-series-'+this.index+" jqplot-point-"+s+'" style="position:absolute"></div>');v.insertAfter(t.canvas);r._elems.push(v);if(r.escapeHTML){v.text(m)}else{v.html(m)}var f=r.location;if(this.waterfall&&parseInt(m,10)<0){f=b[d[f]]}var l=w.u2p(z[s][0])+r.xOffset(v,f);var g=n.u2p(z[s][1])+r.yOffset(v,f);if(this.renderer.constructor==c.jqplot.BarRenderer){if(this.barDirection=="vertical"){l+=this._barNudge}else{g-=this._barNudge}}v.css("left",l);v.css("top",g);var j=l+c(v).width();var q=g+c(v).height();var y=r.edgeTolerance;var e=c(t.canvas).position().left;var u=c(t.canvas).position().top;var x=t.canvas.width+e;var k=t.canvas.height+u;if(l-y<e||g-y<u||j+y>x||q+y>k){c(v).detach()}}}};c.jqplot.postSeriesInitHooks.push(c.jqplot.PointLabels.init);c.jqplot.postDrawSeriesHooks.push(c.jqplot.PointLabels.draw)})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(c){c.jqplot.PointLabels=function(e){this.show=c.jqplot.config.enablePlugins;this.location="n";this.labelsFromSeries=false;this.seriesLabelIndex=null;this.labels=[];this._labels=[];this.stackedValue=false;this.ypadding=6;this.xpadding=6;this.escapeHTML=true;this.edgeTolerance=-5;this.formatter=c.jqplot.DefaultTickFormatter;this.formatString="";this.hideZeros=false;this._elems=[];c.extend(true,this,e)};var a=["nw","n","ne","e","se","s","sw","w"];var d={nw:0,n:1,ne:2,e:3,se:4,s:5,sw:6,w:7};var b=["se","s","sw","w","nw","n","ne","e"];c.jqplot.PointLabels.init=function(j,h,f,g,i){var e=c.extend(true,{},f,g);e.pointLabels=e.pointLabels||{};if(this.renderer.constructor===c.jqplot.BarRenderer&&this.barDirection==="horizontal"&&!e.pointLabels.location){e.pointLabels.location="e"}this.plugins.pointLabels=new c.jqplot.PointLabels(e.pointLabels);this.plugins.pointLabels.setLabels.call(this)};c.jqplot.PointLabels.prototype.setLabels=function(){var f=this.plugins.pointLabels;var h;if(f.seriesLabelIndex!=null){h=f.seriesLabelIndex}else{if(this.renderer.constructor===c.jqplot.BarRenderer&&this.barDirection==="horizontal"){h=(this._plotData[0].length<3)?0:this._plotData[0].length-1}else{h=(this._plotData.length===0)?0:this._plotData[0].length-1}}f._labels=[];if(f.labels.length===0||f.labelsFromSeries){if(f.stackedValue){if(this._plotData.length&&this._plotData[0].length){for(var e=0;e<this._plotData.length;e++){f._labels.push(this._plotData[e][h])}}}else{var g=this.data;if(this.renderer.constructor===c.jqplot.BarRenderer&&this.waterfall){g=this._data}if(g.length&&g[0].length){for(var e=0;e<g.length;e++){f._labels.push(g[e][h])}}g=null}}else{if(f.labels.length){f._labels=f.labels}}};c.jqplot.PointLabels.prototype.xOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerWidth(true)-this.xpadding;break;case"n":h=-f.outerWidth(true)/2;break;case"ne":h=this.xpadding;break;case"e":h=this.xpadding;break;case"se":h=this.xpadding;break;case"s":h=-f.outerWidth(true)/2;break;case"sw":h=-f.outerWidth(true)-this.xpadding;break;case"w":h=-f.outerWidth(true)-this.xpadding;break;default:h=-f.outerWidth(true)-this.xpadding;break}return h};c.jqplot.PointLabels.prototype.yOffset=function(f,e,g){e=e||this.location;g=g||this.xpadding;var h;switch(e){case"nw":h=-f.outerHeight(true)-this.ypadding;break;case"n":h=-f.outerHeight(true)-this.ypadding;break;case"ne":h=-f.outerHeight(true)-this.ypadding;break;case"e":h=-f.outerHeight(true)/2;break;case"se":h=this.ypadding;break;case"s":h=this.ypadding;break;case"sw":h=this.ypadding;break;case"w":h=-f.outerHeight(true)/2;break;default:h=-f.outerHeight(true)-this.ypadding;break}return h};c.jqplot.PointLabels.draw=function(x,j,v){var t=this.plugins.pointLabels;t.setLabels.call(this);for(var w=0;w<t._elems.length;w++){t._elems[w].emptyForce()}t._elems.splice(0,t._elems.length);if(t.show){var r="_"+this._stackAxis+"axis";if(!t.formatString){t.formatString=this[r]._ticks[0].formatString;t.formatter=this[r]._ticks[0].formatter}var E=this._plotData;var D=this._prevPlotData;var A=this._xaxis;var q=this._yaxis;var z,f;for(var w=0,u=t._labels.length;w<u;w++){var o=t._labels[w];if(o==null||(t.hideZeros&&parseInt(o,10)==0)){continue}o=t.formatter(t.formatString,o);f=document.createElement("div");t._elems[w]=c(f);z=t._elems[w];z.addClass("jqplot-point-label jqplot-series-"+this.index+" jqplot-point-"+w);z.css("position","absolute");z.insertAfter(x.canvas);if(t.escapeHTML){z.text(o)}else{z.html(o)}var g=t.location;if((this.fillToZero&&E[w][1]<0)||(this.fillToZero&&this._type==="bar"&&this.barDirection==="horizontal"&&E[w][0]<0)||(this.waterfall&&parseInt(o,10))<0){g=b[d[g]]}var n=A.u2p(E[w][0])+t.xOffset(z,g);var h=q.u2p(E[w][1])+t.yOffset(z,g);if(this._stack&&!t.stackedValue){if(this.barDirection==="vertical"){h=(this._barPoints[w][0][1]+this._barPoints[w][1][1])/2+v._gridPadding.top-0.5*z.outerHeight(true)}else{n=(this._barPoints[w][2][0]+this._barPoints[w][0][0])/2+v._gridPadding.left-0.5*z.outerWidth(true)}}if(this.renderer.constructor==c.jqplot.BarRenderer){if(this.barDirection=="vertical"){n+=this._barNudge}else{h-=this._barNudge}}z.css("left",n);z.css("top",h);var k=n+z.width();var s=h+z.height();var C=t.edgeTolerance;var e=c(x.canvas).position().left;var y=c(x.canvas).position().top;var B=x.canvas.width+e;var m=x.canvas.height+y;if(n-C<e||h-C<y||k+C>B||s+C>m){z.remove()}z=null;f=null}}};c.jqplot.postSeriesInitHooks.push(c.jqplot.PointLabels.init);c.jqplot.postDrawSeriesHooks.push(c.jqplot.PointLabels.draw)})(jQuery);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1,34 +1,3 @@
/**
* Copyright (c) 2009 - 2010 Chris Leonello
* jqPlot is currently available for use in all personal or commercial projects
* under both the MIT (http://www.opensource.org/licenses/mit-license.php) and GPL
* version 2.0 (http://www.gnu.org/licenses/gpl-2.0.html) licenses. This means that you can
* choose the license that best suits your project and use it accordingly.
*
* Although not required, the author would appreciate an email letting him
* know of any substantial use of jqPlot. You can reach the author at:
* chris at jqplot or see http://www.jqplot.com/info.php .
*
* If you are feeling kind and generous, consider supporting the project by
* making a donation at: http://www.jqplot.com/donate.php .
*
* jqPlot includes date instance methods and printf/sprintf functions by other authors:
*
* Date instance methods contained in jqplot.dateMethods.js:
*
* author Ken Snyder (ken d snyder at gmail dot com)
* date 2008-09-10
* version 2.0.2 (http://kendsnyder.com/sandbox/date/)
* license Creative Commons Attribution License 3.0 (http://creativecommons.org/licenses/by/3.0/)
*
* JavaScript printf/sprintf functions contained in jqplot.sprintf.js:
*
* version 2007.04.27
* author Ash Searle
* http://hexmen.com/blog/2007/03/printf-sprintf/
* http://hexmen.com/js/sprintf.js
* The author (Ash Searle) has placed this code in the public domain:
* "This code is unrestricted: you are free to use it however you like."
*
*/
(function(f){f.jqplot.Trendline=function(){this.show=f.jqplot.config.enablePlugins;this.color="#666666";this.renderer=new f.jqplot.LineRenderer();this.rendererOptions={marker:{show:false}};this.label="";this.type="linear";this.shadow=true;this.markerRenderer={show:false};this.lineWidth=1.5;this.shadowAngle=45;this.shadowOffset=1;this.shadowAlpha=0.07;this.shadowDepth=3;this.isTrendline=true};f.jqplot.postSeriesInitHooks.push(e);f.jqplot.postDrawSeriesHooks.push(g);f.jqplot.addLegendRowHooks.push(a);function a(k){var i=k.trendline.label.toString();var j=null;if(this.renderer.constructor!=f.jqplot.PieRenderer&&k.trendline.show&&i){j={label:i,color:k.trendline.color}}return j}function e(m,k,j,i,l){if(this.renderer.constructor==f.jqplot.LineRenderer){this.trendline=new f.jqplot.Trendline();i=i||{};f.extend(true,this.trendline,{color:this.color},j.trendline,i.trendline);this.trendline.renderer.init.call(this.trendline,null)}}function g(m,i){i=f.extend(true,{},this.trendline,i);if(i.show&&this.renderer.constructor!=f.jqplot.PieRenderer){var k;var l=i.data||this.data;k=c(l,this.trendline.type);var j=i.gridData||this.renderer.makeGridData.call(this,k.data);this.trendline.renderer.draw.call(this.trendline,m,j,{showLine:true,shadow:this.trendline.shadow})}}function b(w,v,n){var u=(n==null)?"linear":n;var s=w.length;var t;var z;var o=0;var m=0;var r=0;var q=0;var l=0;var j=[];var k=[];if(u=="linear"){k=w;j=v}else{if(u=="exp"||u=="exponential"){for(var p=0;p<v.length;p++){if(v[p]<=0){s--}else{k.push(w[p]);j.push(Math.log(v[p]))}}}}for(var p=0;p<s;p++){o=o+k[p];m=m+j[p];q=q+k[p]*j[p];r=r+k[p]*k[p];l=l+j[p]*j[p]}t=(s*q-o*m)/(s*r-o*o);z=(m-t*o)/s;return[t,z]}function h(k,j){var i;i=b(k,j,"linear");return[i[0],i[1]]}function d(o,m){var k;var i=o;var n=m;k=b(i,n,"exp");var l=Math.exp(k[0]);var j=Math.exp(k[1]);return[l,j]}function c(l,j){var p=(j==null)?"linear":j;var n;var o;var r=[];var q=[];var m=[];for(k=0;k<l.length;k++){if(l[k]!=null&&l[k][0]!=null&&l[k][1]!=null){r.push(l[k][0]);q.push(l[k][1])}}if(p=="linear"){n=h(r,q);for(var k=0;k<r.length;k++){o=n[0]*r[k]+n[1];m.push([r[k],o])}}else{if(p=="exp"||p=="exponential"){n=d(r,q);for(var k=0;k<r.length;k++){o=n[1]*Math.pow(n[0],r[k]);m.push([r[k],o])}}}return{data:m,slope:n[0],intercept:n[1]}}})(jQuery);
/* jqPlot 1.0.8r1250 | (c) 2009-2013 Chris Leonello | jplot.com
jsDate | (c) 2010-2013 Chris Leonello
*/(function(f){f.jqplot.Trendline=function(){this.show=f.jqplot.config.enablePlugins;this.color="#666666";this.renderer=new f.jqplot.LineRenderer();this.rendererOptions={marker:{show:false}};this.label="";this.type="linear";this.shadow=true;this.markerRenderer={show:false};this.lineWidth=1.5;this.shadowAngle=45;this.shadowOffset=1;this.shadowAlpha=0.07;this.shadowDepth=3;this.isTrendline=true};f.jqplot.postSeriesInitHooks.push(e);f.jqplot.postDrawSeriesHooks.push(g);f.jqplot.addLegendRowHooks.push(a);function a(k){var j=null;if(k.trendline&&k.trendline.show){var i=k.trendline.label.toString();if(i){j={label:i,color:k.trendline.color}}}return j}function e(m,k,j,i,l){if(this._type&&(this._type==="line"||this._type=="bar")){this.trendline=new f.jqplot.Trendline();i=i||{};f.extend(true,this.trendline,{color:this.color},j.trendline,i.trendline);this.trendline.renderer.init.call(this.trendline,null)}}function g(m,i){i=f.extend(true,{},this.trendline,i);if(this.trendline&&i.show){var k;var l=i.data||this.data;k=c(l,this.trendline.type);var j=i.gridData||this.renderer.makeGridData.call(this,k.data);this.trendline.renderer.draw.call(this.trendline,m,j,{showLine:true,shadow:this.trendline.shadow})}}function b(w,v,n){var u=(n==null)?"linear":n;var s=w.length;var t;var z;var o=0;var m=0;var r=0;var q=0;var l=0;var j=[];var k=[];if(u=="linear"){k=w;j=v}else{if(u=="exp"||u=="exponential"){for(var p=0;p<v.length;p++){if(v[p]<=0){s--}else{k.push(w[p]);j.push(Math.log(v[p]))}}}}for(var p=0;p<s;p++){o=o+k[p];m=m+j[p];q=q+k[p]*j[p];r=r+k[p]*k[p];l=l+j[p]*j[p]}t=(s*q-o*m)/(s*r-o*o);z=(m-t*o)/s;return[t,z]}function h(k,j){var i;i=b(k,j,"linear");return[i[0],i[1]]}function d(o,m){var k;var i=o;var n=m;k=b(i,n,"exp");var l=Math.exp(k[0]);var j=Math.exp(k[1]);return[l,j]}function c(l,j){var p=(j==null)?"linear":j;var n;var o;var r=[];var q=[];var m=[];for(k=0;k<l.length;k++){if(l[k]!=null&&l[k][0]!=null&&l[k][1]!=null){r.push(l[k][0]);q.push(l[k][1])}}if(p=="linear"){n=h(r,q);for(var k=0;k<r.length;k++){o=n[0]*r[k]+n[1];m.push([r[k],o])}}else{if(p=="exp"||p=="exponential"){n=d(r,q);for(var k=0;k<r.length;k++){o=n[1]*Math.pow(n[0],r[k]);m.push([r[k],o])}}}return{data:m,slope:n[0],intercept:n[1]}}})(jQuery);

View File

@ -1,5 +1,2 @@
{% load i18n %}
{% trans "Powered by <a href='https://github.com/rossp/django-helpdesk'>django-helpdesk</a>." %}
{% if helpdesk_settings.HELPDESK_SUPPORT_PERSON %}
<p>{% trans "For technical support please contact:" %} <a href='mailto:{{ helpdesk_settings.HELPDESK_SUPPORT_PERSON }}'>{{ helpdesk_settings.HELPDESK_SUPPORT_PERSON }}</a></p>
{% endif %}
{% trans "<a href='https://github.com/rossp/django-helpdesk'>django-helpdesk</a>." %}

View File

@ -3,72 +3,24 @@
{% load saved_queries %}
{% load load_helpdesk_settings %}
{% with request|load_helpdesk_settings as helpdesk_settings %}
{% with request|saved_queries as user_saved_queries_ %}
{% with user|saved_queries as user_saved_queries_ %}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>{% block helpdesk_title %}Helpdesk{% endblock %} :: {% trans "Powered by django-helpdesk" %}</title>
<script src='{{ STATIC_URL }}helpdesk/jquery-1.5.min.js' type='text/javascript' language='javascript'></script>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script src='{{ STATIC_URL }}helpdesk/jquery-ui-1.8.9.custom.min.js' type='text/javascript' language='javascript'></script>
{% comment %}
<script src='{{ STATIC_URL }}helpdesk/jquery.translate-debug-all.js' type='text/javascript' language='javascript'></script>
{% endcomment %}
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/helpdesk.css' type='text/css' media="screen" />
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/helpdesk-print.css' type='text/css' media="print" />
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/jquery-smoothness-theme/jquery-ui-1.8.9.custom.css' type='text/css' />
<link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/helpdesk-extend.css' type='text/css' media="screen" >
<!--link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/helpdesk-print.css' type='text/css' media="print" /-->
<!--link rel='stylesheet' href='{{ STATIC_URL }}helpdesk/jquery-smoothness-theme/jquery-ui-1.8.9.custom.css' type='text/css' /-->
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.2/js/bootstrap.min.js"></script>
<link href="//netdna.bootstrapcdn.com/bootstrap/3.0.2/css/bootstrap.min.css" rel="stylesheet">
<link rel='alternate' href='{% url 'helpdesk_rss_user' user.username %}' type='application/rss+xml' title='{% trans "My Open Tickets" %}' />
<link rel='alternate' href='{% url 'helpdesk_rss_activity' %}' type='application/rss+xml' title='{% trans "All Recent Activity" %}' />
<link rel='alternate' href='{% url 'helpdesk_rss_unassigned' %}' type='application/rss+xml' title='{% trans "Unassigned Tickets" %}' />
{% comment %}
<script type="text/javascript">
$(document).ready(function(){
// replace display while hovering over menu item
$('li.headerlink').hover(
function() { $('ul', this).css('display', 'block'); },
function() { $('ul', this).css('display', 'none'); });
{% if helpdesk_settings.HELPDESK_TRANSLATE_TICKET_COMMENTS %}
// add translate functionality - google translate V1 is deprecated
$.translate.load(bingID);
$.translate(function(){ //when the Language API is loaded
$.translate().ui({
tags: ["select", "option"],
// a function that filters the languages:
{% if helpdesk_settings.HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG %}
filter: {{ helpdesk_settings.HELPDESK_TRANSLATE_TICKET_COMMENTS_LANG|safe }},
{% else %}
// all languages
filter: $.translate.isTranslatable,
{% endif %}
//a function that returns the text to display based on the language code:
label: $.translate.toNativeLanguage ||
function(langCode, lang){
return $.translate.capitalize(lang);
},
// whether to include the UNKNOWN:"" along with the languages:
includeUnknown: false,
})
.click(function(){ // when selecting a language - 'change' is not enough, because your first language in the menu might be your target language
$('#translate_block').translate( '', $(this).val(), { // translate from current language to the selected language
not: '.option, select, pre, .translate_dropdown', // exclude these elements
fromOriginal: true, // always translate from original version (even after the page has been translated)
async: true, // this prevents the browser from freezing on larger sites by executing each DOM filtering iteration with a delay
toggle: true, // all translation will be cached (stored with $.data) and used if it's found, or translated to otherwise
walk: true // finds elements having textnodes and translates only their content; on very large and complex pages this might take some time
})
})
.appendTo('#translate_dropdown'); // insert the dropdown menu to the page
});
{% endif %}
});
</script>
{% endcomment %}
<style type="text/css">
/* hide google translate top bar */
.goog-te-banner-frame {display: none !important;}
@ -94,26 +46,22 @@
{% block helpdesk_head %}{% endblock %}
</head>
<body>
<div id='container'>
<div id='header'>
<h1>{% trans "Helpdesk" %}</h1>
<body id="helpdesk-body">
<div id='container' class="container">
<div id='header' class="row">
<h1>{% block h1_title %}{% trans "Helpdesk" %}{% endblock %}</h1>
{% include "helpdesk/navigation.html" %}
</div>
<div id='body'>
<div id='body' class="row">
{% block helpdesk_body %}{% endblock %}
</div>
<div id='footer'>
<p>{% include "helpdesk/attribution.html" %}
<a href='{% url 'helpdesk_rss_index' %}'><img src='{{ STATIC_URL }}helpdesk/rss_icon.png' width='14' height='14' alt='{% trans "RSS Icon" %}' title='{% trans "RSS Feeds" %}' border='0' />{% trans "RSS Feeds" %}</a>
{% if helpdesk_settings.HELPDESK_FOOTER_SHOW_API_LINK %}<a href='{% url 'helpdesk_api_help' %}'>{% trans "API" %}</a>{% endif %}
<a href='{% url 'helpdesk_user_settings' %}'>{% trans "User Settings" %}</a>
{% if helpdesk_settings.HELPDESK_FOOTER_SHOW_CHANGE_LANGUAGE_LINK %}
<a href='{% url 'helpdesk_public_change_language' %}?return_to={{ request.path }}'>{% trans "Change Language" %}</a>
{% endif %}
{% if user.is_superuser %}<a href='{% url 'helpdesk_system_settings' %}'>{% trans "System Settings" %}</a>{% endif %}</p>
<div id='footer' class="row">
<div class="col-md-2">{% include "helpdesk/attribution.html" %}</div>
<div class="col-md-2"><a href='{% url 'helpdesk_rss_index' %}'><img src='{{ STATIC_URL }}helpdesk/rss_icon.png' width='14' height='14' alt='{% trans "RSS Icon" %}' title='{% trans "RSS Feeds" %}' border='0' />{% trans "RSS Feeds" %}</a></div>
<div class="col-md-2"><a href='{% url 'helpdesk_api_help' %}'>{% trans "API" %}</a></div>
{% if user.is_superuser %}<div class="col-md-2"><a href='{% url 'helpdesk_system_settings' %}'>{% trans "System Settings" %}</a></div>{% endif %}
</div>
</div>
{% include "helpdesk/debug.html" %}

View File

@ -2,17 +2,16 @@
{% block helpdesk_title %}{% trans "Delete Saved Query" %}{% endblock %}
{% block helpdesk_body %}{% blocktrans with query.title as query_title %}
<h2>Delete Query</h2>
{% block helpdesk_body %}
<h2>{% trans "Delete Query" %}</h2>
<p>Are you sure you want to delete this saved filter (<em>{{ query_title }}</em>)? To re-create it, you will need to manually re-filter your ticket listing.</p>
{% endblocktrans %}
<p>{% blocktrans with query.title as query_title %}Are you sure you want to delete this saved filter (<em>{{ query_title }}</em>)? To re-create it, you will need to manually re-filter your ticket listing.{% endblocktrans %}</p>
{% if query.shared %}{% blocktrans %}
<p>You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.</p>
{% endblocktrans %}{% endif %}
{% if query.shared %}
<p>{% blocktrans %}You have shared this query, so other users may be using it. If you delete it, they will have to manually create their own query.{% endblocktrans %}</p>
{% endif %}
<p><a href='../'>{% trans "No, Don't Delete It" %}</a></p>
<form method='post' action='./'><input type='submit' value='{% trans "Yes - Delete It" %}' />{% csrf_token %}</form>
<form method='post' action='./'><input class="btn btn-primary" type='submit' value='{% trans "Yes - Delete It" %}' />{% csrf_token %}</form>
{% endblock %}

Some files were not shown because too many files have changed in this diff Show More