diff --git a/.gitignore b/.gitignore index 9e6dab0f..162dbae9 100644 --- a/.gitignore +++ b/.gitignore @@ -11,6 +11,7 @@ docs/doctrees/* .pydevproject .directory *.swp +.idea # ignore demo attachments that user might have added helpdesk/attachments/ diff --git a/demo/demodesk/fixtures/demo.json b/demo/demodesk/fixtures/demo.json index ee491702..b1565fea 100644 --- a/demo/demodesk/fixtures/demo.json +++ b/demo/demodesk/fixtures/demo.json @@ -7,9 +7,9 @@ {"model": "helpdesk.followup", "pk": 2, "fields": {"ticket": 2, "date": "2017-03-20T04:54:53.031Z", "title": "Ticket Opened", "comment": "Something else with some other product. Not a big deal.", "public": true, "user": 1, "new_status": null}}, {"model": "helpdesk.ticket", "pk": 3, "fields": {"title": "Something with an attachment", "queue": 1, "created": "2017-03-20T05:14:36.320Z", "modified": "2017-03-20T05:28:28.695Z", "submitter_email": "helpdesk@example.com", "assigned_to": null, "status": 1, "on_hold": false, "description": "WHOA!", "resolution": null, "priority": 1, "due_date": null, "last_escalation": null}}, {"model": "helpdesk.followup", "pk": 3, "fields": {"ticket": 3, "date": "2017-03-20T05:14:36.345Z", "title": "Ticket Opened", "comment": "WHOA!", "public": true, "user": 1, "new_status": null}}, - {"model": "helpdesk.attachment", "pk": 1, "fields": {"followup": 3, "file": "helpdesk/attachments/DH-3/3/someinfo.txt", "filename": "someinfo.txt", "mime_type": "text/plain", "size": 56}}, + {"model": "helpdesk.followupattachment", "pk": 1, "fields": {"followup": 3, "file": "helpdesk/attachments/DH-3/3/someinfo.txt", "filename": "someinfo.txt", "mime_type": "text/plain", "size": 56}}, {"model": "helpdesk.followup", "pk": 4, "fields": {"ticket": 3, "date": "2017-03-20T05:28:28.458Z", "title": "Comment", "comment": "An image attachment goes here!", "public": true, "user": 1, "new_status": null}}, - {"model": "helpdesk.attachment", "pk": 2, "fields": {"followup": 4, "file": "helpdesk/attachments/DH-3/4/helpdesk.png", "filename": "helpdesk.png", "mime_type": "image/png", "size": 30229}}, + {"model": "helpdesk.followupattachment", "pk": 2, "fields": {"followup": 4, "file": "helpdesk/attachments/DH-3/4/helpdesk.png", "filename": "helpdesk.png", "mime_type": "image/png", "size": 30229}}, {"model": "helpdesk.kbcategory", "pk": 1, "fields": {"title": "KB Cat 1", "slug": "kbcat1", "description": "Some category of KB info"}}, {"model": "helpdesk.kbcategory", "pk": 2, "fields": {"title": "KB Cat 2", "slug": "kbcat2", "description": "Here is another category. Enjoy!"}}, {"model": "helpdesk.kbitem", "pk": 1, "fields": {"category": 1, "title": "Django-Helpdesk", "question": "What is Django-Helpdesk?", "answer": "An open source helpdesk written in python using the awesome django framework.", "votes": 0, "recommendations": 0, "last_updated": "2017-04-02T19:02:17.213Z"}}, diff --git a/docs/index.rst b/docs/index.rst index 1757da4d..e93cbde2 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -15,6 +15,8 @@ Contents settings spam custom_fields + integration + teams contributing license diff --git a/docs/install.rst b/docs/install.rst index e0b0d1f8..9eaba067 100644 --- a/docs/install.rst +++ b/docs/install.rst @@ -58,7 +58,11 @@ errors with trying to create User settings. 'django.contrib.admin', # Required for helpdesk admin/maintenance 'django.contrib.humanize', # Required for elapsed time formatting 'bootstrap4form', # Required for nicer formatting of forms with the default templates + 'account', # Required by pinax-teams + 'pinax.inviations', # required by pinax-teams + 'pinax.teams', # team support 'helpdesk', # This is us! + 'reversion', # required by pinax-teams ) Your ``settings.py`` file should also define a ``SITE_ID`` that allows multiple projects to share diff --git a/docs/integration.rst b/docs/integration.rst index 59ab0538..159fde81 100644 --- a/docs/integration.rst +++ b/docs/integration.rst @@ -7,5 +7,12 @@ Django-helpdesk associates an email address with each submitted ticket. If you i - `title` - `body` - `submitter_email` + - `custom_` + +There is also a page under the url `/tickets/submit_iframe/` with the same behavior. + +Fields may be hidden by adding them to a comma separated `_hide_fieds_` query parameter. + +Here is an example url to get you started: `http://localhost:8000/desk/tickets/submit_iframe/?queue=1;custom_dpnk-user=http://lol.cz;submitter_email=foo@bar.cz;title=lol;_hide_fields_=title,queue,submitter_email`. This url sets the queue to 1, sets the custom field `dpnk-url` to `http://lol.cz` and submitter_email to `lol@baz.cz` and hides the title, queue, and submitter_email fields. Note that hidden fields should be set to a default. Note that these fields will continue to be user-editable despite being pre-filled. diff --git a/docs/teams.rst b/docs/teams.rst new file mode 100644 index 00000000..cd27aaef --- /dev/null +++ b/docs/teams.rst @@ -0,0 +1,14 @@ +Working with teams and larger organizations +=========================================== + +If you only have one or two people working on tickets, basic Queue setup is enough to get you going. You can now assign tickets to teams for better ticket filtering, reducing noise and improving organization efficiency. + +Rather than assigning tickets to teams directly, django-helpdesk allows you assign tickets to knowledge-base items and then assign knowledge base items to teams. + +Knowledge-base items can be in either public or private knowledge-base categories, so this organizational structure need not have any influence on the external appearance of your public helpdesk web portal. + +You can visit the 'Pinax Teams' page in your django admin in order to create a team and add team members. + +You can assign a knowledge-base item to a team on the Helpdesk admin page. + +Once you have set up teams. Unassigned tickets which are associated with a knowledge-base item will only be shown on the dashboard to those users who are members of the team which is associated with that knowledge-base item. diff --git a/helpdesk/admin.py b/helpdesk/admin.py index 52318ec6..9d18007e 100644 --- a/helpdesk/admin.py +++ b/helpdesk/admin.py @@ -70,9 +70,9 @@ class FollowUpAdmin(admin.ModelAdmin): @admin.register(KBItem) class KBItemAdmin(admin.ModelAdmin): - list_display = ('category', 'title', 'last_updated',) + list_display = ('category', 'title', 'last_updated', 'team', 'order', 'enabled') inlines = [KBIAttachmentInline] - readonly_fields = ('voted_by',) + readonly_fields = ('voted_by', 'downvoted_by') list_display_links = ('title',) @@ -93,6 +93,10 @@ class IgnoreEmailAdmin(admin.ModelAdmin): list_display = ('name', 'queue_list', 'email_address', 'keep_in_mailbox') +@admin.register(KBCategory) +class KBCategoryAdmin(admin.ModelAdmin): + list_display = ('name', 'title', 'slug', 'public') + + admin.site.register(PreSetReply) admin.site.register(EscalationExclusion) -admin.site.register(KBCategory) diff --git a/helpdesk/email.py b/helpdesk/email.py index 5458e022..a2088be2 100644 --- a/helpdesk/email.py +++ b/helpdesk/email.py @@ -487,13 +487,18 @@ def object_from_message(message, queue, logger): body.encode('utf-8') logger.debug("Discovered plain text MIME part") else: + try: + email_body = encoding.smart_text(part.get_payload(decode=True)) + except UnicodeDecodeError: + email_body = encoding.smart_text(part.get_payload(decode=False)) + payload = """ %s -""" % encoding.smart_text(part.get_payload(decode=True)) +""" % email_body files.append( SimpleUploadedFile(_("email_html_body.html"), payload.encode("utf-8"), 'text/html') ) diff --git a/helpdesk/forms.py b/helpdesk/forms.py index bd6b4603..b196da90 100644 --- a/helpdesk/forms.py +++ b/helpdesk/forms.py @@ -6,11 +6,10 @@ django-helpdesk - A Django powered ticket tracker for small enterprise. forms.py - Definitions of newforms-based forms for creating and maintaining tickets. """ - +import logging from django.core.exceptions import ObjectDoesNotExist from django import forms -from django.forms import widgets from django.conf import settings from django.utils.translation import ugettext_lazy as _ from django.contrib.auth import get_user_model @@ -18,9 +17,10 @@ from django.utils import timezone from helpdesk.lib import safe_template_context, process_attachments from helpdesk.models import (Ticket, Queue, FollowUp, IgnoreEmail, TicketCC, - CustomField, TicketCustomFieldValue, TicketDependency, UserSettings) + CustomField, TicketCustomFieldValue, TicketDependency, UserSettings, KBItem) from helpdesk import settings as helpdesk_settings +logger = logging.getLogger(__name__) User = get_user_model() CUSTOMFIELD_TO_FIELD_DICT = { @@ -158,7 +158,7 @@ class AbstractTicketForm(CustomFieldMixin, forms.Form): widget=forms.Select(attrs={'class': 'form-control'}), choices=Ticket.PRIORITY_CHOICES, required=True, - initial='3', + initial=getattr(settings, 'HELPDESK_PUBLIC_TICKET_PRIORITY', '3'), label=_('Priority'), help_text=_("Please select a priority carefully. If unsure, leave it as '3'."), ) @@ -177,6 +177,16 @@ class AbstractTicketForm(CustomFieldMixin, forms.Form): help_text=_('You can attach a file such as a document or screenshot to this ticket.'), ) + def __init__(self, kbcategory=None, *args, **kwargs): + super().__init__(*args, **kwargs) + if kbcategory: + self.fields['kbitem'] = forms.ChoiceField( + widget=forms.Select(attrs={'class': 'form-control'}), + required=False, + label=_('Knowledge Base Item'), + choices=[(kbi.pk, kbi.title) for kbi in KBItem.objects.filter(category=kbcategory.pk, enabled=True)], + ) + def _add_form_custom_fields(self, staff_only_filter=None): if staff_only_filter is None: queryset = CustomField.objects.all() @@ -192,18 +202,33 @@ class AbstractTicketForm(CustomFieldMixin, forms.Form): self.customfield_to_field(field, instanceargs) - def _create_ticket(self): - queue = Queue.objects.get(id=int(self.cleaned_data['queue'])) + def _get_queue(self): + # this procedure is re-defined for public submission form + return Queue.objects.get(id=int(self.cleaned_data['queue'])) - ticket = Ticket(title=self.cleaned_data['title'], - submitter_email=self.cleaned_data['submitter_email'], - created=timezone.now(), - status=Ticket.OPEN_STATUS, - queue=queue, - description=self.cleaned_data['body'], - priority=self.cleaned_data['priority'], - due_date=self.cleaned_data['due_date'], - ) + def _create_ticket(self): + queue = self._get_queue() + kbitem = None + if 'kbitem' in self.cleaned_data: + kbitem = KBItem.objects.get(id=int(self.cleaned_data['kbitem'])) + + ticket = Ticket( + title=self.cleaned_data['title'], + submitter_email=self.cleaned_data['submitter_email'], + created=timezone.now(), + status=Ticket.OPEN_STATUS, + queue=queue, + description=self.cleaned_data['body'], + priority=self.cleaned_data.get( + 'priority', + getattr(settings, "HELPDESK_PUBLIC_TICKET_PRIORITY", "3") + ), + due_date=self.cleaned_data.get( + 'due_date', + getattr(settings, "HELPDESK_PUBLIC_TICKET_DUE_DATE", None) + ) or None, + kbitem=kbitem, + ) return ticket, queue @@ -263,7 +288,11 @@ class TicketForm(AbstractTicketForm): 'updates to this ticket.'), ) assigned_to = forms.ChoiceField( - widget=forms.Select(attrs={'class': 'form-control'}) if not helpdesk_settings.HELPDESK_CREATE_TICKET_HIDE_ASSIGNED_TO else forms.HiddenInput(), + widget=( + forms.Select(attrs={'class': 'form-control'}) + if not helpdesk_settings.HELPDESK_CREATE_TICKET_HIDE_ASSIGNED_TO + else forms.HiddenInput() + ), required=False, label=_('Case owner'), help_text=_('If you select an owner other than yourself, they\'ll be ' @@ -333,20 +362,55 @@ class PublicTicketForm(AbstractTicketForm): help_text=_('We will e-mail you when your ticket is updated.'), ) - def __init__(self, *args, **kwargs): + def __init__(self, hidden_fields=(), readonly_fields=(), *args, **kwargs): """ Add any (non-staff) custom fields that are defined to the form """ super(PublicTicketForm, self).__init__(*args, **kwargs) + self._add_form_custom_fields(False) - if hasattr(settings, 'HELPDESK_PUBLIC_TICKET_QUEUE'): - self.fields['queue'].widget = forms.HiddenInput() - if hasattr(settings, 'HELPDESK_PUBLIC_TICKET_PRIORITY'): - self.fields['priority'].widget = forms.HiddenInput() - if hasattr(settings, 'HELPDESK_PUBLIC_TICKET_DUE_DATE'): - self.fields['due_date'].widget = forms.HiddenInput() - self.fields['queue'].choices = [('', '--------')] + [ - (q.id, q.title) for q in Queue.objects.filter(allow_public_submission=True)] + field_hide_table = { + 'queue': 'HELPDESK_PUBLIC_TICKET_QUEUE', + 'priority': 'HELPDESK_PUBLIC_TICKET_PRIORITY', + 'due_date': 'HELPDESK_PUBLIC_TICKET_DUE_DATE', + } + + for field_name, field_setting_key in field_hide_table.items(): + has_settings_default_value = getattr(settings, field_setting_key, None) + if has_settings_default_value is not None: + hidden_fields += (field_name,) + + for field in hidden_fields: + if field in self.fields: + del self.fields[field] + + public_queues = Queue.objects.filter(allow_public_submission=True) + + if len(public_queues) == 0: + logger.warning( + "There are no public queues defined - public ticket creation is impossible" + ) + + if 'queue' in self.fields: + self.fields['queue'].choices = [('', '--------')] + [ + (q.id, q.title) for q in public_queues] + + def _get_queue(self): + if getattr(settings, 'HELPDESK_PUBLIC_TICKET_QUEUE', None) is not None: + # force queue to be the pre-defined one + # (only for public submissions) + public_queue = Queue.objects.filter( + slug=settings.HELPDESK_PUBLIC_TICKET_QUEUE + ).first() + if not public_queue: + logger.fatal( + "Public queue '%s' is configured as default but can't be found", + settings.HELPDESK_PUBLIC_TICKET_QUEUE + ) + return public_queue + else: + # get the queue user entered + return Queue.objects.get(id=int(self.cleaned_data['queue'])) def save(self): """ diff --git a/helpdesk/lib.py b/helpdesk/lib.py index 9a48af5b..0895ab7b 100644 --- a/helpdesk/lib.py +++ b/helpdesk/lib.py @@ -161,9 +161,9 @@ def format_time_spent(time_spent): """ if time_spent: - time_spent = "{0:02d}h:{0:02d}m".format( - int(time_spent.total_seconds() // 3600), - int((time_spent.total_seconds() % 3600) / 60) + time_spent = "{0:02d}h:{1:02d}m".format( + time_spent.seconds // 3600, + time_spent.seconds // 60 ) else: time_spent = "" diff --git a/helpdesk/locale/cs/LC_MESSAGES/django.mo b/helpdesk/locale/cs/LC_MESSAGES/django.mo index b939c14e..2242c9b5 100644 Binary files a/helpdesk/locale/cs/LC_MESSAGES/django.mo and b/helpdesk/locale/cs/LC_MESSAGES/django.mo differ diff --git a/helpdesk/locale/cs/LC_MESSAGES/django.po b/helpdesk/locale/cs/LC_MESSAGES/django.po index 267da0d1..657c55df 100644 --- a/helpdesk/locale/cs/LC_MESSAGES/django.po +++ b/helpdesk/locale/cs/LC_MESSAGES/django.po @@ -9,8 +9,8 @@ msgid "" msgstr "" "Project-Id-Version: django-helpdesk\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-02-04 15:00+0000\n" -"PO-Revision-Date: 2019-02-02 12:47+0000\n" +"POT-Creation-Date: 2020-01-16 18:19+0100\n" +"PO-Revision-Date: 2020-01-16 18:23+0100\n" "Last-Translator: jachym \n" "Language-Team: Czech (http://www.transifex.com/django-helpdesk/django-" "helpdesk/language/cs/)\n" @@ -20,85 +20,126 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1 && n % 1 == 0) ? 0 : (n >= 2 && n " "<= 4 && n % 1 == 0) ? 1: (n % 1 != 0 ) ? 2 : 3;\n" +"X-Generator: Poedit 1.8.11\n" -#: helpdesk/admin.py:29 helpdesk/models.py:415 -#: helpdesk/templates/helpdesk/public_view_ticket.html:19 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:57 +#: third_party/django-helpdesk/helpdesk/admin.py:38 +#: third_party/django-helpdesk/helpdesk/models.py:491 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:19 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:39 msgid "Submitter E-Mail" msgstr "E-mail zadavatele" -#: helpdesk/admin.py:48 helpdesk/models.py:40 helpdesk/models.py:965 -#: helpdesk/models.py:1374 +#: third_party/django-helpdesk/helpdesk/admin.py:68 +#: third_party/django-helpdesk/helpdesk/models.py:84 +#: third_party/django-helpdesk/helpdesk/models.py:1220 +#: third_party/django-helpdesk/helpdesk/models.py:1677 msgid "Slug" msgstr "Slug" -#: helpdesk/forms.py:139 helpdesk/models.py:272 helpdesk/models.py:399 -#: helpdesk/templates/helpdesk/include/tickets.html:18 -#: helpdesk/templates/helpdesk/include/unassigned.html:18 -#: helpdesk/templates/helpdesk/report_index.html:39 -#: helpdesk/templates/helpdesk/rss_list.html:34 -#: helpdesk/templates/helpdesk/ticket_list.html:63 -#: helpdesk/templates/helpdesk/ticket_list.html:82 -#: helpdesk/templates/helpdesk/ticket_list.html:223 -#: helpdesk/views/staff.py:1253 helpdesk/views/staff.py:1259 -#: helpdesk/views/staff.py:1265 helpdesk/views/staff.py:1271 +#: third_party/django-helpdesk/helpdesk/email.py:357 +#, python-format +msgid "E-Mail Received from %(sender_email)s" +msgstr "E-mail obdržen od %(sender_email)s" + +#: third_party/django-helpdesk/helpdesk/email.py:366 +#, python-format +msgid "Ticket Re-Opened by E-Mail Received from %(sender_email)s" +msgstr "Ticket znovu otevřen e-mailem od%(sender_email)s" + +#: third_party/django-helpdesk/helpdesk/email.py:423 +msgid "Comment from e-mail" +msgstr "Komentář z e-mailu" + +#: third_party/django-helpdesk/helpdesk/email.py:429 +msgid "Unknown Sender" +msgstr "Neznámý odesílatel" + +#: third_party/django-helpdesk/helpdesk/email.py:498 +msgid "email_html_body.html" +msgstr "email_html_body.html" + +#: third_party/django-helpdesk/helpdesk/forms.py:138 +#: third_party/django-helpdesk/helpdesk/models.py:330 +#: third_party/django-helpdesk/helpdesk/models.py:475 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/tickets.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:44 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:45 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:64 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:171 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1211 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1217 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1223 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1229 msgid "Queue" msgstr "Fronta požadavků" -#: helpdesk/forms.py:148 +#: third_party/django-helpdesk/helpdesk/forms.py:147 msgid "Summary of the problem" msgstr "Shrnutí problému" -#: helpdesk/forms.py:153 +#: third_party/django-helpdesk/helpdesk/forms.py:152 msgid "Description of your issue" msgstr "Popis problému" -#: helpdesk/forms.py:155 +#: third_party/django-helpdesk/helpdesk/forms.py:154 msgid "Please be as descriptive as possible and include all details" msgstr "" "Prosíme, popište problém co nejdetailněji, abychom jej byli schopni vyřešit." -#: helpdesk/forms.py:163 helpdesk/management/commands/escalate_tickets.py:156 -#: helpdesk/models.py:459 -#: helpdesk/templates/helpdesk/public_view_ticket.html:24 -#: helpdesk/templates/helpdesk/ticket.html:215 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:62 -#: helpdesk/templates/helpdesk/ticket_list.html:88 helpdesk/views/staff.py:548 +#: third_party/django-helpdesk/helpdesk/forms.py:162 +#: third_party/django-helpdesk/helpdesk/management/commands/escalate_tickets.py:131 +#: third_party/django-helpdesk/helpdesk/models.py:535 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:22 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/tickets.html:15 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:24 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:178 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:49 +#: third_party/django-helpdesk/helpdesk/views/staff.py:593 msgid "Priority" msgstr "Priorita" -#: helpdesk/forms.py:164 +#: third_party/django-helpdesk/helpdesk/forms.py:163 msgid "Please select a priority carefully. If unsure, leave it as '3'." msgstr "" "Prosím volte prioritu uvážlivě. Pokud si nejste jisti, ponechte číslo '3'." -#: helpdesk/forms.py:170 helpdesk/models.py:467 -#: helpdesk/templates/helpdesk/ticket.html:218 helpdesk/views/staff.py:558 +#: third_party/django-helpdesk/helpdesk/forms.py:170 +#: third_party/django-helpdesk/helpdesk/models.py:543 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:181 +#: third_party/django-helpdesk/helpdesk/views/staff.py:603 msgid "Due on" msgstr "Vyřešit do" -#: helpdesk/forms.py:175 +#: third_party/django-helpdesk/helpdesk/forms.py:176 msgid "Attach File" msgstr "Přiložit soubor" -#: helpdesk/forms.py:176 +#: third_party/django-helpdesk/helpdesk/forms.py:177 msgid "You can attach a file such as a document or screenshot to this ticket." msgstr "K ticketu můžete přiložit soubor, dokument nebo snímek obrazovky." -#: helpdesk/forms.py:299 +#: third_party/django-helpdesk/helpdesk/forms.py:186 +#, fuzzy +#| msgid "Knowledge base item" +msgid "Knowedge Base Item" +msgstr "Položka znalostní báze" + +#: third_party/django-helpdesk/helpdesk/forms.py:274 msgid "Submitter E-Mail Address" msgstr "E-mailová adresa zadavatele" -#: helpdesk/forms.py:301 +#: third_party/django-helpdesk/helpdesk/forms.py:276 msgid "" "This e-mail address will receive copies of all public updates to this ticket." msgstr "Na tuto adresu budou zasílány všechny veřejné aktualizace k ticketu." -#: helpdesk/forms.py:309 +#: third_party/django-helpdesk/helpdesk/forms.py:282 msgid "Case owner" msgstr "Vlastník případu" -#: helpdesk/forms.py:310 +#: third_party/django-helpdesk/helpdesk/forms.py:283 msgid "" "If you select an owner other than yourself, they'll be e-mailed details of " "this ticket immediately." @@ -106,93 +147,38 @@ msgstr "" "Pokud vyberete jiného vlastníka než sami sebe, budou mu okamžitě e-mailem " "odeslány detaily ticketu." -#: helpdesk/forms.py:338 +#: third_party/django-helpdesk/helpdesk/forms.py:322 #, python-format msgid "Ticket Opened & Assigned to %(name)s" msgstr "Ticket byl otevřen a přiřazen 1%(name)s" -#: helpdesk/forms.py:339 +#: third_party/django-helpdesk/helpdesk/forms.py:323 msgid "" msgstr "" -#: helpdesk/forms.py:342 +#: third_party/django-helpdesk/helpdesk/forms.py:326 msgid "Ticket Opened" msgstr "Ticket byl otevřen" -#: helpdesk/forms.py:362 +#: third_party/django-helpdesk/helpdesk/forms.py:346 msgid "Your E-Mail Address" msgstr "Váš e-mail" -#: helpdesk/forms.py:363 +#: third_party/django-helpdesk/helpdesk/forms.py:347 msgid "We will e-mail you when your ticket is updated." msgstr "Při aktualizaci ticketu budete informováni e-mailem." -#: helpdesk/forms.py:392 +#: third_party/django-helpdesk/helpdesk/forms.py:384 msgid "Ticket Opened Via Web" msgstr "Ticket založen prostřednictvím webového formuláře." -#: helpdesk/forms.py:405 -msgid "Show Ticket List on Login?" -msgstr "Zobrazit seznam ticketů po přihlášení?" - -#: helpdesk/forms.py:406 -msgid "Display the ticket list upon login? Otherwise, the dashboard is shown." -msgstr "" -"Zobrazit seznam ticketů po přihlášení? V opačném případě bude zobrazena " -"nástěnka." - -#: helpdesk/forms.py:411 -msgid "E-mail me on ticket change?" -msgstr "Poslat mi e-mail při změně ticketu?" - -#: helpdesk/forms.py:412 -msgid "" -"If you're the ticket owner and the ticket is changed via the web by somebody " -"else, do you want to receive an e-mail?" -msgstr "" -"Přejete si dostat e-mail v případě, pokud jste vlastník ticketu a ticket je " -"změněn prostřednictvím webového formuláře někým dalším." - -#: helpdesk/forms.py:417 -msgid "E-mail me when assigned a ticket?" -msgstr "Poslat e-mail, pokud mi byl přiřazen ticket?" - -#: helpdesk/forms.py:418 -msgid "" -"If you are assigned a ticket via the web, do you want to receive an e-mail?" -msgstr "" -"Přejete si dostat e-mail, pokud Vám byl přiřazen ticket prostřednictvím " -"webového formuláře?" - -#: helpdesk/forms.py:423 -msgid "Number of tickets to show per page" -msgstr "Počet ticketů zobrazených na stránku" - -#: helpdesk/forms.py:424 -msgid "How many tickets do you want to see on the Ticket List page?" -msgstr "Kolik ticketů chcete vidět na stránce Seznam ticketů?" - -#: helpdesk/forms.py:430 -msgid "Use my e-mail address when submitting tickets?" -msgstr "Použít můj e-mail, pokud zadávám nový ticket?" - -#: helpdesk/forms.py:431 -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 "" -"V případě, že zadáte nový ticket, chcete, aby Váš e-mail byl automaticky " -"přiřazen jako e-mail zadavatele? Můžete také zadat jiný e-mail, pokud je to " -"potřeba, tato volba pouze nastaví výchozí hodnotu." - -#: helpdesk/management/commands/create_queue_permissions.py:69 -#: helpdesk/migrations/0009_migrate_queuemembership.py:30 -#: helpdesk/models.py:331 +#: third_party/django-helpdesk/helpdesk/management/commands/create_queue_permissions.py:69 +#: third_party/django-helpdesk/helpdesk/migrations/0009_migrate_queuemembership.py:28 +#: third_party/django-helpdesk/helpdesk/models.py:404 msgid "Permission for queue: " msgstr "" -#: helpdesk/management/commands/create_usersettings.py:24 +#: third_party/django-helpdesk/helpdesk/management/commands/create_usersettings.py:24 msgid "" "Check for user without django-helpdesk UserSettings and create settings if " "required. Uses settings.DEFAULT_USER_SETTINGS which can be overridden to " @@ -202,44 +188,23 @@ msgstr "" "požadováno, vytvořit nastavení. Používá settings.DEFAULT_USER_SETTINGS, " "které může být přepsáno pro váš případ." -#: helpdesk/management/commands/escalate_tickets.py:150 +#: third_party/django-helpdesk/helpdesk/management/commands/escalate_tickets.py:125 #, python-format msgid "Ticket escalated after %s days" msgstr "Priorita ticketu zvýšena po %s dnech" -#: helpdesk/management/commands/get_email.py:306 -msgid "Comment from e-mail" -msgstr "Komentář z e-mailu" - -#: helpdesk/management/commands/get_email.py:312 -msgid "Unknown Sender" -msgstr "Neznámý odesílatel" - -#: helpdesk/management/commands/get_email.py:369 -msgid "email_html_body.html" -msgstr "email_html_body.html" - -#: helpdesk/management/commands/get_email.py:481 -#, python-format -msgid "E-Mail Received from %(sender_email)s" -msgstr "E-mail obdržen od %(sender_email)s" - -#: helpdesk/management/commands/get_email.py:489 -#, python-format -msgid "Ticket Re-Opened by E-Mail Received from %(sender_email)s" -msgstr "Ticket znovu otevřen e-mailem od%(sender_email)s" - -#: helpdesk/models.py:35 helpdesk/models.py:392 helpdesk/models.py:651 -#: helpdesk/models.py:960 helpdesk/models.py:998 -#: helpdesk/templates/helpdesk/include/tickets.html:17 -#: helpdesk/templates/helpdesk/include/unassigned.html:17 -#: helpdesk/templates/helpdesk/ticket.html:209 -#: helpdesk/templates/helpdesk/ticket_list.html:79 -#: helpdesk/templates/helpdesk/ticket_list.html:222 helpdesk/views/staff.py:520 +#: third_party/django-helpdesk/helpdesk/models.py:79 +#: third_party/django-helpdesk/helpdesk/models.py:468 +#: third_party/django-helpdesk/helpdesk/models.py:829 +#: third_party/django-helpdesk/helpdesk/models.py:1215 +#: third_party/django-helpdesk/helpdesk/models.py:1268 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:172 +#: third_party/django-helpdesk/helpdesk/views/staff.py:565 msgid "Title" msgstr "Nadpis" -#: helpdesk/models.py:43 +#: third_party/django-helpdesk/helpdesk/models.py:87 msgid "" "This slug is used when building ticket ID's. Once set, try not to change it " "or e-mailing may get messy." @@ -248,13 +213,15 @@ msgstr "" "tvorbě ID ticketu. Pokud je jednou nastaven, již jej neměňte, protože " "nastane zmatek v e-mailech." -#: helpdesk/models.py:48 helpdesk/models.py:1208 helpdesk/models.py:1291 -#: helpdesk/models.py:1371 -#: helpdesk/templates/helpdesk/email_ignore_list.html:25 +#: third_party/django-helpdesk/helpdesk/models.py:92 +#: third_party/django-helpdesk/helpdesk/models.py:1513 +#: third_party/django-helpdesk/helpdesk/models.py:1595 +#: third_party/django-helpdesk/helpdesk/models.py:1674 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:25 msgid "E-Mail Address" msgstr "Adresa e-mailu" -#: helpdesk/models.py:51 +#: third_party/django-helpdesk/helpdesk/models.py:95 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." @@ -262,11 +229,12 @@ msgstr "" "Všechny odchozí e-maily této fronty budou odeslány z této e-mailové adresy. " "Pokud používáte IMAP nebo POP3, tato adresa je adresa Vašeho mailboxu." -#: helpdesk/models.py:57 helpdesk/models.py:936 +#: third_party/django-helpdesk/helpdesk/models.py:101 +#: third_party/django-helpdesk/helpdesk/models.py:1192 msgid "Locale" msgstr "Locale" -#: helpdesk/models.py:61 +#: third_party/django-helpdesk/helpdesk/models.py:105 msgid "" "Locale of this queue. All correspondence in this queue will be in this " "language." @@ -274,28 +242,28 @@ msgstr "" "Jazykové nastavení fronty. Veškerá korespondence této fronty bude používat " "tento jazyk." -#: helpdesk/models.py:66 +#: third_party/django-helpdesk/helpdesk/models.py:110 msgid "Allow Public Submission?" msgstr "Povolit veřejné podání?" -#: helpdesk/models.py:69 +#: third_party/django-helpdesk/helpdesk/models.py:113 msgid "Should this queue be listed on the public submission form?" msgstr "Má tato fronta být uvedena v seznamu veřejného formuláře pro podání?" -#: helpdesk/models.py:73 +#: third_party/django-helpdesk/helpdesk/models.py:117 msgid "Allow E-Mail Submission?" msgstr "Povolit e-mailové podání?" -#: helpdesk/models.py:76 +#: third_party/django-helpdesk/helpdesk/models.py:120 msgid "Do you want to poll the e-mail box below for new tickets?" msgstr "" "Má si tato fronta stahovat nové tickety z e-mailové schránky automaticky?" -#: helpdesk/models.py:81 +#: third_party/django-helpdesk/helpdesk/models.py:125 msgid "Escalation Days" msgstr "Počet dní do zvýšení priority" -#: helpdesk/models.py:84 +#: third_party/django-helpdesk/helpdesk/models.py:128 msgid "" "For tickets which are not held, how often do you wish to increase their " "priority? Set to 0 for no escalation." @@ -303,11 +271,11 @@ msgstr "" "Jak často chcete zvýšit prioritu ticketů, které nejsou pozdržené? Nastavte " "'0' pro ponechání původní priority." -#: helpdesk/models.py:89 +#: third_party/django-helpdesk/helpdesk/models.py:133 msgid "New Ticket CC Address" msgstr "CC adresa pro nové tickety" -#: helpdesk/models.py:93 +#: third_party/django-helpdesk/helpdesk/models.py:137 msgid "" "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-" @@ -316,11 +284,11 @@ msgstr "" "Pokud zadáte e-mailovou adresu, tato adresa bude dostávat upozornění na nové " "tickety této fronty. Více adres může být odděleno čárkou." -#: helpdesk/models.py:99 +#: third_party/django-helpdesk/helpdesk/models.py:143 msgid "Updated Ticket CC Address" msgstr "CC adresa pro aktualizaci ticketů" -#: helpdesk/models.py:103 +#: third_party/django-helpdesk/helpdesk/models.py:147 msgid "" "If an e-mail address is entered here, then it will receive notification of " "all activity (new tickets, closed tickets, updates, reassignments, etc) for " @@ -330,23 +298,34 @@ msgstr "" "všech aktualizacích ticketů této fronty (nové tickety, uzavřené tickety, " "aktualizace, přiřazení, atd.). Více adres může být odděleno čárkou." -#: helpdesk/models.py:110 +#: third_party/django-helpdesk/helpdesk/models.py:154 +msgid "Notify contacts when email updates arrive" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/models.py:157 +msgid "" +"When an email arrives to either create a ticket or to interact with an " +"existing discussion. Should email notifications be sent ? Note: the " +"new_ticket_cc and updated_ticket_cc work independently of this feature" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/models.py:163 msgid "E-Mail Box Type" msgstr "Typ mailové schránky" -#: helpdesk/models.py:112 +#: third_party/django-helpdesk/helpdesk/models.py:165 msgid "POP 3" msgstr "POP 3" -#: helpdesk/models.py:112 +#: third_party/django-helpdesk/helpdesk/models.py:165 msgid "IMAP" msgstr "IMAP" -#: helpdesk/models.py:112 +#: third_party/django-helpdesk/helpdesk/models.py:165 msgid "Local Directory" msgstr "" -#: helpdesk/models.py:115 +#: third_party/django-helpdesk/helpdesk/models.py:168 msgid "" "E-Mail server type for creating tickets automatically from a mailbox - both " "POP3 and IMAP are supported, as well as reading from a local directory." @@ -354,21 +333,21 @@ msgstr "" "Typ e-mailového serveru pro automatické vytváření ticketů - jsou podporovány " "protokoly IMAP a POP3, stejně jako čtená z lokální složky." -#: helpdesk/models.py:121 +#: third_party/django-helpdesk/helpdesk/models.py:174 msgid "E-Mail Hostname" msgstr "E-mail Hostname" -#: helpdesk/models.py:125 +#: third_party/django-helpdesk/helpdesk/models.py:178 msgid "" "Your e-mail server address - either the domain name or IP address. May be " "\"localhost\"." msgstr "Doména mail serveru nebo IP adresa. Může být i \"localhost\"." -#: helpdesk/models.py:130 +#: third_party/django-helpdesk/helpdesk/models.py:183 msgid "E-Mail Port" msgstr "Port" -#: helpdesk/models.py:133 +#: third_party/django-helpdesk/helpdesk/models.py:186 msgid "" "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 " @@ -378,37 +357,37 @@ msgstr "" "Některé servery mají vlastní nastavení. Pro použití výchozích hodnot " "ponechte prázdné." -#: helpdesk/models.py:139 +#: third_party/django-helpdesk/helpdesk/models.py:192 msgid "Use SSL for E-Mail?" msgstr "Použít SSL pro e-mail?" -#: helpdesk/models.py:142 +#: third_party/django-helpdesk/helpdesk/models.py:195 msgid "" "Whether to use SSL for IMAP or POP3 - the default ports when using SSL are " "993 for IMAP and 995 for POP3." msgstr "Pokud je použito SSL, výchozí port pro POP3 je 995 a pro IMAP je 993." -#: helpdesk/models.py:147 +#: third_party/django-helpdesk/helpdesk/models.py:200 msgid "E-Mail Username" msgstr "uživatelské jméno e-mailu" -#: helpdesk/models.py:151 +#: third_party/django-helpdesk/helpdesk/models.py:204 msgid "Username for accessing this mailbox." msgstr "Uživatel s právy k poštovní schránce." -#: helpdesk/models.py:155 +#: third_party/django-helpdesk/helpdesk/models.py:208 msgid "E-Mail Password" msgstr "Heslo k e-mailu" -#: helpdesk/models.py:159 +#: third_party/django-helpdesk/helpdesk/models.py:212 msgid "Password for the above username" msgstr "Heslo pro výše nastaveného uživatele." -#: helpdesk/models.py:163 +#: third_party/django-helpdesk/helpdesk/models.py:216 msgid "IMAP Folder" msgstr "Adresář pro IMAP" -#: helpdesk/models.py:167 +#: third_party/django-helpdesk/helpdesk/models.py:220 msgid "" "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 " @@ -418,94 +397,95 @@ msgstr "" "umožní použít jeden účet IMAP pro více front prostřednictvím filtrování " "zpráv na serveru IMAP do několika složek. Výchozí: INBOX" -#: helpdesk/models.py:174 +#: third_party/django-helpdesk/helpdesk/models.py:227 msgid "E-Mail Local Directory" msgstr "Lokální složka pro e-mail" -#: helpdesk/models.py:178 +#: third_party/django-helpdesk/helpdesk/models.py:231 msgid "" "If using a local directory, what directory path do you wish to poll for new " "email? Example: /var/lib/mail/helpdesk/" msgstr "" -#: helpdesk/models.py:184 +#: third_party/django-helpdesk/helpdesk/models.py:237 msgid "Django auth permission name" msgstr "" -#: helpdesk/models.py:189 +#: third_party/django-helpdesk/helpdesk/models.py:242 msgid "Name used in the django.contrib.auth permission system" msgstr "" -#: helpdesk/models.py:193 +#: third_party/django-helpdesk/helpdesk/models.py:246 msgid "E-Mail Check Interval" msgstr "Interval kontroly e-mailu" -#: helpdesk/models.py:194 +#: third_party/django-helpdesk/helpdesk/models.py:247 msgid "How often do you wish to check this mailbox? (in Minutes)" msgstr "Jak často si přejete kontrolovat mailbox? (minuty)" -#: helpdesk/models.py:208 +#: third_party/django-helpdesk/helpdesk/models.py:261 msgid "Socks Proxy Type" msgstr "" -#: helpdesk/models.py:210 +#: third_party/django-helpdesk/helpdesk/models.py:263 msgid "SOCKS4" msgstr "" -#: helpdesk/models.py:210 +#: third_party/django-helpdesk/helpdesk/models.py:263 msgid "SOCKS5" msgstr "" -#: helpdesk/models.py:213 +#: third_party/django-helpdesk/helpdesk/models.py:266 msgid "" "SOCKS4 or SOCKS5 allows you to proxy your connections through a SOCKS server." msgstr "" -#: helpdesk/models.py:217 +#: third_party/django-helpdesk/helpdesk/models.py:270 msgid "Socks Proxy Host" msgstr "" -#: helpdesk/models.py:220 +#: third_party/django-helpdesk/helpdesk/models.py:273 msgid "Socks proxy IP address. Default: 127.0.0.1" msgstr "" -#: helpdesk/models.py:224 +#: third_party/django-helpdesk/helpdesk/models.py:277 msgid "Socks Proxy Port" msgstr "" -#: helpdesk/models.py:227 +#: third_party/django-helpdesk/helpdesk/models.py:280 msgid "Socks proxy port number. Default: 9150 (default TOR port)" msgstr "" -#: helpdesk/models.py:231 +#: third_party/django-helpdesk/helpdesk/models.py:284 msgid "Logging Type" msgstr "" -#: helpdesk/models.py:234 helpdesk/templates/helpdesk/ticket_list.html:250 +#: third_party/django-helpdesk/helpdesk/models.py:287 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:81 msgid "None" msgstr "Žádný" -#: helpdesk/models.py:235 +#: third_party/django-helpdesk/helpdesk/models.py:288 msgid "Debug" msgstr "Debug" -#: helpdesk/models.py:236 +#: third_party/django-helpdesk/helpdesk/models.py:289 msgid "Information" msgstr "Informace" -#: helpdesk/models.py:237 +#: third_party/django-helpdesk/helpdesk/models.py:290 msgid "Warning" msgstr "Varování" -#: helpdesk/models.py:238 +#: third_party/django-helpdesk/helpdesk/models.py:291 msgid "Error" msgstr "Chyba" -#: helpdesk/models.py:239 +#: third_party/django-helpdesk/helpdesk/models.py:292 msgid "Critical" msgstr "Kritická" -#: helpdesk/models.py:243 +#: third_party/django-helpdesk/helpdesk/models.py:296 msgid "" "Set the default logging level. All messages at that level or above will be " "logged to the directory set below. If no level is set, logging will be " @@ -515,147 +495,171 @@ msgstr "" "nebo vyšší do složky nastavené níže. Pokud úroveň nenastavíte, bude logování " "vypnuto." -#: helpdesk/models.py:249 +#: third_party/django-helpdesk/helpdesk/models.py:302 msgid "Logging Directory" msgstr "Složka pro log soubory" -#: helpdesk/models.py:253 +#: third_party/django-helpdesk/helpdesk/models.py:306 msgid "" "If logging is enabled, what directory should we use to store log files for " "this queue? If no directory is set, default to /var/log/helpdesk/" msgstr "" -#: helpdesk/models.py:264 +#: third_party/django-helpdesk/helpdesk/models.py:317 msgid "Default owner" msgstr "Výchozí vlastník" -#: helpdesk/models.py:273 helpdesk/templates/helpdesk/email_ignore_list.html:27 +#: third_party/django-helpdesk/helpdesk/models.py:321 +msgid "Time to be spent on this Queue in total" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/models.py:331 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:27 msgid "Queues" msgstr "Fronty" -#: helpdesk/models.py:376 helpdesk/templates/helpdesk/report_index.html:40 -#: helpdesk/templates/helpdesk/ticket.html:160 +#: third_party/django-helpdesk/helpdesk/models.py:452 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:45 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:116 msgid "Open" msgstr "Otevřené" -#: helpdesk/models.py:377 helpdesk/templates/helpdesk/ticket.html:168 -#: helpdesk/templates/helpdesk/ticket.html:176 -#: helpdesk/templates/helpdesk/ticket.html:182 -#: helpdesk/templates/helpdesk/ticket.html:187 +#: third_party/django-helpdesk/helpdesk/models.py:453 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:99 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:107 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:113 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:118 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:124 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:132 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:138 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:143 msgid "Reopened" msgstr "Znovu otevřené" -#: helpdesk/models.py:378 helpdesk/templates/helpdesk/report_index.html:41 -#: helpdesk/templates/helpdesk/ticket.html:161 -#: helpdesk/templates/helpdesk/ticket.html:169 -#: helpdesk/templates/helpdesk/ticket.html:177 +#: third_party/django-helpdesk/helpdesk/models.py:454 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:100 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:108 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:46 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:117 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:125 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:133 msgid "Resolved" msgstr "Vyřešené" -#: helpdesk/models.py:379 helpdesk/templates/helpdesk/report_index.html:42 -#: helpdesk/templates/helpdesk/ticket.html:162 -#: helpdesk/templates/helpdesk/ticket.html:170 -#: helpdesk/templates/helpdesk/ticket.html:178 -#: helpdesk/templates/helpdesk/ticket.html:183 +#: third_party/django-helpdesk/helpdesk/models.py:455 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:101 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:109 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:114 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:47 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:118 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:126 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:134 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:139 msgid "Closed" msgstr "Uzavřené" -#: helpdesk/models.py:380 helpdesk/templates/helpdesk/ticket.html:163 -#: helpdesk/templates/helpdesk/ticket.html:171 -#: helpdesk/templates/helpdesk/ticket.html:188 +#: third_party/django-helpdesk/helpdesk/models.py:456 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:102 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:119 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:119 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:127 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:144 msgid "Duplicate" msgstr "Duplicitní" -#: helpdesk/models.py:384 +#: third_party/django-helpdesk/helpdesk/models.py:460 msgid "1. Critical" msgstr "1. kritická" -#: helpdesk/models.py:385 +#: third_party/django-helpdesk/helpdesk/models.py:461 msgid "2. High" msgstr "2. vysoká" -#: helpdesk/models.py:386 +#: third_party/django-helpdesk/helpdesk/models.py:462 msgid "3. Normal" msgstr "3. normální" -#: helpdesk/models.py:387 +#: third_party/django-helpdesk/helpdesk/models.py:463 msgid "4. Low" msgstr "4. nízká" -#: helpdesk/models.py:388 +#: third_party/django-helpdesk/helpdesk/models.py:464 msgid "5. Very Low" msgstr "5. velmi nízká" -#: helpdesk/models.py:403 -#: helpdesk/templates/helpdesk/include/unassigned.html:19 -#: helpdesk/templates/helpdesk/ticket_list.html:76 -#: helpdesk/templates/helpdesk/ticket_list.html:225 +#: third_party/django-helpdesk/helpdesk/models.py:479 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:10 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:17 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:66 msgid "Created" msgstr "Vytvořeno" -#: helpdesk/models.py:405 +#: third_party/django-helpdesk/helpdesk/models.py:481 msgid "Date this ticket was first created" msgstr "Datum prvního založení ticketu" -#: helpdesk/models.py:409 +#: third_party/django-helpdesk/helpdesk/models.py:485 msgid "Modified" msgstr "Změněno" -#: helpdesk/models.py:411 +#: third_party/django-helpdesk/helpdesk/models.py:487 msgid "Date this ticket was most recently changed." msgstr "Datum poslední změny ticketu" -#: helpdesk/models.py:418 +#: third_party/django-helpdesk/helpdesk/models.py:494 msgid "" "The submitter will receive an email for all public follow-ups left for this " "task." msgstr "" "Na zadavatelův e-mail budou zasílány všechny veřejné aktualizace ticketu." -#: helpdesk/models.py:428 +#: third_party/django-helpdesk/helpdesk/models.py:504 msgid "Assigned to" msgstr "Přiřazeno" -#: helpdesk/models.py:432 helpdesk/templates/helpdesk/include/tickets.html:19 -#: helpdesk/templates/helpdesk/ticket_list.html:64 -#: helpdesk/templates/helpdesk/ticket_list.html:85 -#: helpdesk/templates/helpdesk/ticket_list.html:224 helpdesk/views/staff.py:530 +#: third_party/django-helpdesk/helpdesk/models.py:508 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:19 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/tickets.html:17 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:65 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:172 +#: third_party/django-helpdesk/helpdesk/views/staff.py:575 msgid "Status" msgstr "Stav" -#: helpdesk/models.py:438 +#: third_party/django-helpdesk/helpdesk/models.py:514 msgid "On Hold" msgstr "Pozdrženo" -#: helpdesk/models.py:441 +#: third_party/django-helpdesk/helpdesk/models.py:517 msgid "If a ticket is on hold, it will not automatically be escalated." msgstr "Ticketu se stavem \"pozdrženo\" nebude automaticky zvýšena priorita." -#: helpdesk/models.py:445 helpdesk/models.py:969 -#: helpdesk/templates/helpdesk/public_view_ticket.html:42 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:29 +#: third_party/django-helpdesk/helpdesk/models.py:521 +#: third_party/django-helpdesk/helpdesk/models.py:1224 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:42 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:95 msgid "Description" msgstr "Popis" -#: helpdesk/models.py:448 +#: third_party/django-helpdesk/helpdesk/models.py:524 msgid "The content of the customers query." msgstr "Obsah zákaznického požadavku" -#: helpdesk/models.py:452 -#: helpdesk/templates/helpdesk/public_view_ticket.html:49 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:36 +#: third_party/django-helpdesk/helpdesk/models.py:528 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:49 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:100 msgid "Resolution" msgstr "Rozřešení" -#: helpdesk/models.py:455 +#: third_party/django-helpdesk/helpdesk/models.py:531 msgid "The resolution provided to the customer by our staff." msgstr "Rozřešení nastavené námi směrem k zákazníkům." -#: helpdesk/models.py:463 +#: third_party/django-helpdesk/helpdesk/models.py:539 msgid "1 = Highest Priority, 5 = Low Priority" msgstr "1 = nejvyšší priorita, 5 = nejnižší priorita" -#: helpdesk/models.py:476 +#: third_party/django-helpdesk/helpdesk/models.py:552 msgid "" "The date this ticket was last escalated - updated automatically by " "management/commands/escalate_tickets.py." @@ -663,46 +667,79 @@ msgstr "" "Datum, kdy byla priorita ticketu zvýšena - ticket byl automaticky " "aktualizován pomocí skriptu management/commands/escalte_tickets.py." -#: helpdesk/models.py:485 helpdesk/templates/helpdesk/ticket_desc_table.html:53 -#: helpdesk/views/feeds.py:93 helpdesk/views/feeds.py:118 -#: helpdesk/views/feeds.py:170 helpdesk/views/staff.py:492 +#: third_party/django-helpdesk/helpdesk/models.py:557 +msgid "Secret key needed for viewing/editing ticket by non-logged in users" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/models.py:567 +msgid "Knowledge base item the user was viewing when they created this ticket." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/models.py:639 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:35 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:93 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:118 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:170 +#: third_party/django-helpdesk/helpdesk/views/staff.py:535 msgid "Unassigned" msgstr "Nepřiřazeno" -#: helpdesk/models.py:525 +#: third_party/django-helpdesk/helpdesk/models.py:679 msgid " - On Hold" msgstr "- Pozdrženo" -#: helpdesk/models.py:528 +#: third_party/django-helpdesk/helpdesk/models.py:682 msgid " - Open dependencies" msgstr "- Otevřít závislosti" -#: helpdesk/models.py:585 helpdesk/models.py:642 helpdesk/models.py:1278 -#: helpdesk/models.py:1454 helpdesk/models.py:1489 -#: helpdesk/templates/helpdesk/public_homepage.html:79 -#: helpdesk/templates/helpdesk/public_view_form.html:12 +#: third_party/django-helpdesk/helpdesk/models.py:757 +#: third_party/django-helpdesk/helpdesk/models.py:820 +#: third_party/django-helpdesk/helpdesk/models.py:1582 +#: third_party/django-helpdesk/helpdesk/models.py:1755 +#: third_party/django-helpdesk/helpdesk/models.py:1789 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/tickets.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:89 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_form.html:12 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:62 msgid "Ticket" msgstr "Ticket" -#: helpdesk/models.py:586 helpdesk/templates/helpdesk/navigation.html:23 -#: helpdesk/templates/helpdesk/ticket_list.html:4 +#: third_party/django-helpdesk/helpdesk/models.py:758 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/create_ticket.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/delete_ticket.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/edit_ticket.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_add.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/followup_edit.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_del.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_add.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_del.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:19 msgid "Tickets" msgstr "Tickety" -#: helpdesk/models.py:646 helpdesk/models.py:880 helpdesk/models.py:1201 -#: helpdesk/models.py:1368 +#: third_party/django-helpdesk/helpdesk/models.py:824 +#: third_party/django-helpdesk/helpdesk/models.py:1137 +#: third_party/django-helpdesk/helpdesk/models.py:1506 +#: third_party/django-helpdesk/helpdesk/models.py:1671 msgid "Date" msgstr "Datum" -#: helpdesk/models.py:658 helpdesk/views/staff.py:509 +#: third_party/django-helpdesk/helpdesk/models.py:836 +#: third_party/django-helpdesk/helpdesk/views/staff.py:552 msgid "Comment" msgstr "Komentář" -#: helpdesk/models.py:664 +#: third_party/django-helpdesk/helpdesk/models.py:842 msgid "Public" msgstr "Veřejný" -#: helpdesk/models.py:667 +#: third_party/django-helpdesk/helpdesk/models.py:846 msgid "" "Public tickets are viewable by the submitter and all staff, but non-public " "tickets can only be seen by staff." @@ -710,100 +747,129 @@ msgstr "" "Veřejné tickety jsou viditelné zadavatelem a naším personálem, ale neveřejné " "tickety jsou viděny pouze naším personálem. " -#: helpdesk/models.py:676 helpdesk/models.py:1068 helpdesk/models.py:1287 -#: helpdesk/templates/helpdesk/ticket_cc_add.html:20 -#: helpdesk/views/staff.py:1228 helpdesk/views/staff.py:1234 -#: helpdesk/views/staff.py:1241 helpdesk/views/staff.py:1247 +#: third_party/django-helpdesk/helpdesk/models.py:856 +#: third_party/django-helpdesk/helpdesk/models.py:1347 +#: third_party/django-helpdesk/helpdesk/models.py:1591 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:31 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1186 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1192 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1199 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1205 msgid "User" msgstr "Uživatel" -#: helpdesk/models.py:680 helpdesk/templates/helpdesk/ticket.html:156 +#: third_party/django-helpdesk/helpdesk/models.py:860 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:112 msgid "New Status" msgstr "Nový stav" -#: helpdesk/models.py:684 +#: third_party/django-helpdesk/helpdesk/models.py:864 msgid "If the status was changed, what was it changed to?" msgstr "Pokud byl stav změněn, na co?" -#: helpdesk/models.py:691 helpdesk/models.py:717 helpdesk/models.py:780 +#: third_party/django-helpdesk/helpdesk/models.py:868 +#, fuzzy +#| msgid "E-Mail Port" +msgid "E-Mail ID" +msgstr "Port" + +#: third_party/django-helpdesk/helpdesk/models.py:872 +msgid "The Message ID of the submitter's email." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/models.py:879 +msgid "Time spent on this follow up" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/models.py:885 +#: third_party/django-helpdesk/helpdesk/models.py:917 +#: third_party/django-helpdesk/helpdesk/models.py:1034 msgid "Follow-up" msgstr "Aktualizace" -#: helpdesk/models.py:692 +#: third_party/django-helpdesk/helpdesk/models.py:886 msgid "Follow-ups" msgstr "Aktualizace" -#: helpdesk/models.py:721 helpdesk/models.py:1460 +#: third_party/django-helpdesk/helpdesk/models.py:921 +#: third_party/django-helpdesk/helpdesk/models.py:1761 msgid "Field" msgstr "Pole" -#: helpdesk/models.py:726 +#: third_party/django-helpdesk/helpdesk/models.py:926 msgid "Old Value" msgstr "Stará hodnota" -#: helpdesk/models.py:732 +#: third_party/django-helpdesk/helpdesk/models.py:932 msgid "New Value" msgstr "Nová hodnota" -#: helpdesk/models.py:740 +#: third_party/django-helpdesk/helpdesk/models.py:940 msgid "removed" msgstr "Smazáno" -#: helpdesk/models.py:742 +#: third_party/django-helpdesk/helpdesk/models.py:942 #, python-format msgid "set to %s" msgstr "nastaveno na %s" -#: helpdesk/models.py:744 +#: third_party/django-helpdesk/helpdesk/models.py:944 #, python-format msgid "changed from \"%(old_value)s\" to \"%(new_value)s\"" msgstr "změněno z \"%(old_value)s\" na \"%(new_value)s\"" -#: helpdesk/models.py:751 +#: third_party/django-helpdesk/helpdesk/models.py:951 msgid "Ticket change" msgstr "Změna ticketu" -#: helpdesk/models.py:752 +#: third_party/django-helpdesk/helpdesk/models.py:952 msgid "Ticket changes" msgstr "Změny ticketu" -#: helpdesk/models.py:784 +#: third_party/django-helpdesk/helpdesk/models.py:967 msgid "File" msgstr "Soubor" -#: helpdesk/models.py:790 +#: third_party/django-helpdesk/helpdesk/models.py:973 msgid "Filename" msgstr "Jméno souboru" -#: helpdesk/models.py:795 +#: third_party/django-helpdesk/helpdesk/models.py:979 msgid "MIME Type" msgstr "MIME Type" -#: helpdesk/models.py:800 +#: third_party/django-helpdesk/helpdesk/models.py:985 msgid "Size" msgstr "Velikost" -#: helpdesk/models.py:801 +#: third_party/django-helpdesk/helpdesk/models.py:987 msgid "Size of this file in bytes" msgstr "Velikost souboru [bytes]" -#: helpdesk/models.py:809 +#: third_party/django-helpdesk/helpdesk/models.py:1024 msgid "Attachment" msgstr "Příloha" -#: helpdesk/models.py:810 +#: third_party/django-helpdesk/helpdesk/models.py:1025 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:56 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:78 msgid "Attachments" msgstr "Přílohy" -#: helpdesk/models.py:827 +#: third_party/django-helpdesk/helpdesk/models.py:1056 +#: third_party/django-helpdesk/helpdesk/models.py:1315 +msgid "Knowledge base item" +msgstr "Položka znalostní báze" + +#: third_party/django-helpdesk/helpdesk/models.py:1085 msgid "Pre-set reply" msgstr "Přednastavená odpověď" -#: helpdesk/models.py:828 +#: third_party/django-helpdesk/helpdesk/models.py:1086 msgid "Pre-set replies" msgstr "Přednastavené odpovědi" -#: helpdesk/models.py:833 +#: third_party/django-helpdesk/helpdesk/models.py:1091 msgid "" "Leave blank to allow this reply to be used for all queues, or select those " "queues you wish to limit this reply to." @@ -811,23 +877,25 @@ msgstr "" "Ponechte prázdné aby bylo možno tuto odpověď použít pro všechny fronty nebo " "vyberte jednu z front, na kterou chcete tuto odpověď aplikovat." -#: helpdesk/models.py:838 helpdesk/models.py:875 helpdesk/models.py:1196 -#: helpdesk/templates/helpdesk/email_ignore_list.html:24 +#: third_party/django-helpdesk/helpdesk/models.py:1096 +#: third_party/django-helpdesk/helpdesk/models.py:1132 +#: third_party/django-helpdesk/helpdesk/models.py:1501 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:24 msgid "Name" msgstr "Název" -#: helpdesk/models.py:840 +#: third_party/django-helpdesk/helpdesk/models.py:1098 msgid "" "Only used to assist users with selecting a reply - not shown to the user." msgstr "" "Je použit pouze pro uživatele, aby vybrali správnou odpověď - jinak není " "zobrazen." -#: helpdesk/models.py:845 +#: third_party/django-helpdesk/helpdesk/models.py:1103 msgid "Body" msgstr "Obsah" -#: helpdesk/models.py:846 +#: third_party/django-helpdesk/helpdesk/models.py:1104 msgid "" "Context available: {{ ticket }} - ticket object (eg {{ ticket.title }}); " "{{ queue }} - The queue; and {{ user }} - the current user." @@ -835,7 +903,7 @@ msgstr "" "Dostupný kontext: {{ ticket }} - Ticket (např. {{ ticket.title }}); " "{{ queue }} - Fronta; and {{ user }} - současný uživatel." -#: helpdesk/models.py:870 +#: third_party/django-helpdesk/helpdesk/models.py:1127 msgid "" "Leave blank for this exclusion to be applied to all queues, or select those " "queues you wish to exclude with this entry." @@ -843,27 +911,27 @@ msgstr "" "Ponechte prázdné, pokud si přejete aplikovat na všechny fronty nebo vyberte " "frontu, na kterou se tento záznam vztáhne." -#: helpdesk/models.py:881 +#: third_party/django-helpdesk/helpdesk/models.py:1138 msgid "Date on which escalation should not happen" msgstr "Datum, kdy se priorita ticketu nemá zvyšovat." -#: helpdesk/models.py:888 +#: third_party/django-helpdesk/helpdesk/models.py:1145 msgid "Escalation exclusion" msgstr "Vynechání zvýšení priority" -#: helpdesk/models.py:889 +#: third_party/django-helpdesk/helpdesk/models.py:1146 msgid "Escalation exclusions" msgstr "Vynechání zvýšeních priority" -#: helpdesk/models.py:903 +#: third_party/django-helpdesk/helpdesk/models.py:1159 msgid "Template Name" msgstr "Název šablony" -#: helpdesk/models.py:908 +#: third_party/django-helpdesk/helpdesk/models.py:1164 msgid "Subject" msgstr "Předmět" -#: helpdesk/models.py:910 +#: third_party/django-helpdesk/helpdesk/models.py:1166 msgid "" "This will be prefixed with \"[ticket.ticket] ticket.title\". We recommend " "something simple such as \"(Updated\") or \"(Closed)\" - the same context is " @@ -873,11 +941,11 @@ msgstr "" "použít něco jednoduchého, jako např. \"(Aktualizováno\") nebo " "\"(Uzavřeno)\" - stejný obsah je dostupný jako prostý text níže." -#: helpdesk/models.py:916 +#: third_party/django-helpdesk/helpdesk/models.py:1172 msgid "Heading" msgstr "Nadpis" -#: helpdesk/models.py:918 +#: third_party/django-helpdesk/helpdesk/models.py:1174 msgid "" "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." @@ -885,11 +953,11 @@ msgstr "" "V HTML e-mailech bude toto použito zcela na začátku e-mailu - stejný obsah " "je použit jako prostý text níže." -#: helpdesk/models.py:924 +#: third_party/django-helpdesk/helpdesk/models.py:1180 msgid "Plain Text" msgstr "Prostý text" -#: helpdesk/models.py:925 +#: third_party/django-helpdesk/helpdesk/models.py:1181 msgid "" "The context available to you includes {{ ticket }}, {{ queue }}, and " "depending on the time of the call: {{ resolution }} or {{ comment }}." @@ -897,144 +965,208 @@ msgstr "" "Dostupný obsah obsahuje {{ ticket }}, {{ queue }}, a v závislosti na čase " "výzvy: {{ resolution }} nebo {{ comment }}." -#: helpdesk/models.py:931 +#: third_party/django-helpdesk/helpdesk/models.py:1187 msgid "HTML" msgstr "HTML" -#: helpdesk/models.py:932 +#: third_party/django-helpdesk/helpdesk/models.py:1188 msgid "The same context is available here as in plain_text, above." msgstr "Stejný obsah zde jako prostý text jako výše." -#: helpdesk/models.py:940 +#: third_party/django-helpdesk/helpdesk/models.py:1196 msgid "Locale of this template." msgstr "Nastavení Locale této šablony" -#: helpdesk/models.py:948 +#: third_party/django-helpdesk/helpdesk/models.py:1204 msgid "e-mail template" msgstr "šablona pro e-mail" -#: helpdesk/models.py:949 +#: third_party/django-helpdesk/helpdesk/models.py:1205 msgid "e-mail templates" msgstr "šablony pro e-mail" -#: helpdesk/models.py:977 -msgid "Knowledge base category" -msgstr "Katorie znalostní báze" +#: third_party/django-helpdesk/helpdesk/models.py:1232 +msgid "Default queue when creating a ticket after viewing this category." +msgstr "" -#: helpdesk/models.py:978 +#: third_party/django-helpdesk/helpdesk/models.py:1240 +msgid "Knowledge base category" +msgstr "Kategorie znalostní báze" + +#: third_party/django-helpdesk/helpdesk/models.py:1241 msgid "Knowledge base categories" msgstr "Kategorie znalostní báze" -#: helpdesk/models.py:994 helpdesk/templates/helpdesk/public_homepage.html:12 +#: third_party/django-helpdesk/helpdesk/models.py:1264 msgid "Category" msgstr "Kategorie" -#: helpdesk/models.py:1003 +#: third_party/django-helpdesk/helpdesk/models.py:1273 msgid "Question" msgstr "Otázka" -#: helpdesk/models.py:1007 +#: third_party/django-helpdesk/helpdesk/models.py:1277 msgid "Answer" msgstr "Odpověď" -#: helpdesk/models.py:1011 +#: third_party/django-helpdesk/helpdesk/models.py:1281 msgid "Votes" msgstr "Hlasy" -#: helpdesk/models.py:1012 +#: third_party/django-helpdesk/helpdesk/models.py:1282 msgid "Total number of votes cast for this item" msgstr "Celkový počet hlasů pro tuto položku" -#: helpdesk/models.py:1017 +#: third_party/django-helpdesk/helpdesk/models.py:1287 msgid "Positive Votes" msgstr "Pozitivní hlasy" -#: helpdesk/models.py:1018 +#: third_party/django-helpdesk/helpdesk/models.py:1288 msgid "Number of votes for this item which were POSITIVE." msgstr "Počet hlasů pro tuto položku, které byly POZITIVNÍ" -#: helpdesk/models.py:1023 +#: third_party/django-helpdesk/helpdesk/models.py:1293 msgid "Last Updated" msgstr "Naposledy aktualizováno" -#: helpdesk/models.py:1024 +#: third_party/django-helpdesk/helpdesk/models.py:1294 msgid "The date on which this question was most recently changed." msgstr "Datum poslední aktualizace této otázky" -#: helpdesk/models.py:1037 +#: third_party/django-helpdesk/helpdesk/models.py:1307 msgid "Unrated" msgstr "Nehodnoceno" -#: helpdesk/models.py:1045 -msgid "Knowledge base item" -msgstr "Položka znalostní báze" - -#: helpdesk/models.py:1046 +#: third_party/django-helpdesk/helpdesk/models.py:1316 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:175 msgid "Knowledge base items" msgstr "Položky znalostní báze" -#: helpdesk/models.py:1072 helpdesk/templates/helpdesk/ticket_list.html:160 +#: third_party/django-helpdesk/helpdesk/models.py:1351 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:233 msgid "Query Name" msgstr "Název dotazu" -#: helpdesk/models.py:1074 +#: third_party/django-helpdesk/helpdesk/models.py:1353 msgid "User-provided name for this query" msgstr "Název dotazu zadaný uživatelem" -#: helpdesk/models.py:1078 +#: third_party/django-helpdesk/helpdesk/models.py:1357 msgid "Shared With Other Users?" msgstr "Sdílet s dalšími uživateli?" -#: helpdesk/models.py:1081 +#: third_party/django-helpdesk/helpdesk/models.py:1360 msgid "Should other users see this query?" msgstr "Mohou i ostatní uživatelé vidět tento dataz?" -#: helpdesk/models.py:1085 +#: third_party/django-helpdesk/helpdesk/models.py:1364 msgid "Search Query" msgstr "Prohledat dotaz" -#: helpdesk/models.py:1086 +#: third_party/django-helpdesk/helpdesk/models.py:1365 msgid "Pickled query object. Be wary changing this." msgstr "Zabalený objekt dotazu. Toto měňte pouze s nevyšší opatrností." -#: helpdesk/models.py:1096 +#: third_party/django-helpdesk/helpdesk/models.py:1375 msgid "Saved search" msgstr "Uložené hledání" -#: helpdesk/models.py:1097 +#: third_party/django-helpdesk/helpdesk/models.py:1376 msgid "Saved searches" msgstr "Uložená hledání" -#: helpdesk/models.py:1116 -msgid "Settings Dictionary" +#: third_party/django-helpdesk/helpdesk/models.py:1418 +#, fuzzy +#| msgid "Settings Dictionary" +msgid "DEPRECATED! Settings Dictionary DEPRECATED!" msgstr "Slovník nastavení" -#: helpdesk/models.py:1117 +#: third_party/django-helpdesk/helpdesk/models.py:1419 +#, fuzzy +#| msgid "" +#| "This is a base64-encoded representation of a pickled Python dictionary. " +#| "Do not change this field via the admin." msgid "" -"This is a base64-encoded representation of a pickled Python dictionary. Do " -"not change this field via the admin." +"DEPRECATED! This is a base64-encoded representation of a pickled Python " +"dictionary. Do not change this field via the admin." msgstr "" "Toto je reprezentace zabaleného slovníku jazyka Python do base64. Toto pole " "rozhodně neměňte v administrativním rozhraní. " -#: helpdesk/models.py:1156 +#: third_party/django-helpdesk/helpdesk/models.py:1426 +msgid "Show Ticket List on Login?" +msgstr "Zobrazit seznam ticketů po přihlášení?" + +#: third_party/django-helpdesk/helpdesk/models.py:1427 +msgid "Display the ticket list upon login? Otherwise, the dashboard is shown." +msgstr "" +"Zobrazit seznam ticketů po přihlášení? V opačném případě bude zobrazena " +"nástěnka." + +#: third_party/django-helpdesk/helpdesk/models.py:1432 +msgid "E-mail me on ticket change?" +msgstr "Poslat mi e-mail při změně ticketu?" + +#: third_party/django-helpdesk/helpdesk/models.py:1433 +msgid "" +"If you're the ticket owner and the ticket is changed via the web by somebody " +"else, do you want to receive an e-mail?" +msgstr "" +"Přejete si dostat e-mail v případě, pokud jste vlastník ticketu a ticket je " +"změněn prostřednictvím webového formuláře někým dalším." + +#: third_party/django-helpdesk/helpdesk/models.py:1438 +msgid "E-mail me when assigned a ticket?" +msgstr "Poslat e-mail, pokud mi byl přiřazen ticket?" + +#: third_party/django-helpdesk/helpdesk/models.py:1439 +msgid "" +"If you are assigned a ticket via the web, do you want to receive an e-mail?" +msgstr "" +"Přejete si dostat e-mail, pokud Vám byl přiřazen ticket prostřednictvím " +"webového formuláře?" + +#: third_party/django-helpdesk/helpdesk/models.py:1444 +msgid "Number of tickets to show per page" +msgstr "Počet ticketů zobrazených na stránku" + +#: third_party/django-helpdesk/helpdesk/models.py:1445 +msgid "How many tickets do you want to see on the Ticket List page?" +msgstr "Kolik ticketů chcete vidět na stránce Seznam ticketů?" + +#: third_party/django-helpdesk/helpdesk/models.py:1451 +msgid "Use my e-mail address when submitting tickets?" +msgstr "Použít můj e-mail, pokud zadávám nový ticket?" + +#: third_party/django-helpdesk/helpdesk/models.py:1452 +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 "" +"V případě, že zadáte nový ticket, chcete, aby Váš e-mail byl automaticky " +"přiřazen jako e-mail zadavatele? Můžete také zadat jiný e-mail, pokud je to " +"potřeba, tato volba pouze nastaví výchozí hodnotu." + +#: third_party/django-helpdesk/helpdesk/models.py:1463 msgid "User Setting" msgstr "Uživatelskáé nastavení." -#: helpdesk/models.py:1157 helpdesk/templates/helpdesk/navigation.html:71 -#: helpdesk/templates/helpdesk/user_settings.html:6 +#: third_party/django-helpdesk/helpdesk/models.py:1464 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:49 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/user_settings.html:15 msgid "User Settings" msgstr "Uživatelská nastavení" -#: helpdesk/models.py:1185 +#: third_party/django-helpdesk/helpdesk/models.py:1490 msgid "Ignored e-mail address" msgstr "Ignorovaná e-mailová adresa" -#: helpdesk/models.py:1186 +#: third_party/django-helpdesk/helpdesk/models.py:1491 msgid "Ignored e-mail addresses" msgstr "Ignorované e-mailové adresy" -#: helpdesk/models.py:1191 +#: third_party/django-helpdesk/helpdesk/models.py:1496 msgid "" "Leave blank for this e-mail to be ignored on all queues, or select those " "queues you wish to ignore this e-mail for." @@ -1042,11 +1174,11 @@ msgstr "" "Ponechte prázdné pokud chcete, aby byl e-mail ignorován ve všech frontách a " "nebo vyberte fronty, pro které si přejete ignorovat e-mail." -#: helpdesk/models.py:1202 +#: third_party/django-helpdesk/helpdesk/models.py:1507 msgid "Date on which this e-mail address was added" msgstr "Datum přidání e-mailové adresy." -#: helpdesk/models.py:1210 +#: third_party/django-helpdesk/helpdesk/models.py:1515 msgid "" "Enter a full e-mail address, or portions with wildcards, eg *@domain.com or " "postmaster@*." @@ -1054,11 +1186,11 @@ msgstr "" "Přidejte plnou e-mailovou adresu nebo její část pomocí divokých znaků, např. " "*@doména.cz nebo postmaster@*." -#: helpdesk/models.py:1215 +#: third_party/django-helpdesk/helpdesk/models.py:1520 msgid "Save Emails in Mailbox?" msgstr "Ukládat e-maily do Mailboxu?" -#: helpdesk/models.py:1218 +#: third_party/django-helpdesk/helpdesk/models.py:1523 msgid "" "Do you want to save emails from this address in the mailbox? If this is " "unticked, emails from this address will be deleted." @@ -1066,35 +1198,35 @@ msgstr "" "Přejete si ukládat e-maily z této adresy do mailboxu? Pokud nezatrhnete, e-" "maily z této adresy budou mazány." -#: helpdesk/models.py:1286 +#: third_party/django-helpdesk/helpdesk/models.py:1590 msgid "User who wishes to receive updates for this ticket." msgstr "Uživatel, který si přeje být informován o tomto ticketu." -#: helpdesk/models.py:1294 +#: third_party/django-helpdesk/helpdesk/models.py:1598 msgid "For non-user followers, enter their e-mail address" msgstr "Pro neregistrované uživatele zadejte jejich e-mail" -#: helpdesk/models.py:1298 +#: third_party/django-helpdesk/helpdesk/models.py:1602 msgid "Can View Ticket?" msgstr "Může vidět ticket?" -#: helpdesk/models.py:1301 +#: third_party/django-helpdesk/helpdesk/models.py:1605 msgid "Can this CC login to view the ticket details?" msgstr "Může tento uživatel v kopii vidět detaily ticketu?" -#: helpdesk/models.py:1305 +#: third_party/django-helpdesk/helpdesk/models.py:1609 msgid "Can Update Ticket?" msgstr "Může aktualizovat?" -#: helpdesk/models.py:1308 +#: third_party/django-helpdesk/helpdesk/models.py:1612 msgid "Can this CC login and update the ticket?" msgstr "Může tento uživatel v kopii aktualizovat ticket?" -#: helpdesk/models.py:1342 +#: third_party/django-helpdesk/helpdesk/models.py:1645 msgid "Field Name" msgstr "Název pole" -#: helpdesk/models.py:1343 +#: third_party/django-helpdesk/helpdesk/models.py:1646 msgid "" "As used in the database and behind the scenes. Must be unique and consist of " "only lowercase letters with no punctuation." @@ -1102,87 +1234,87 @@ msgstr "" "Bude použito v databázi na pozadí. Musí být unikátní a obsahovat pouze malá " "písmena a žádnou interpunkci." -#: helpdesk/models.py:1349 +#: third_party/django-helpdesk/helpdesk/models.py:1652 msgid "Label" msgstr "Štítek" -#: helpdesk/models.py:1351 +#: third_party/django-helpdesk/helpdesk/models.py:1654 msgid "The display label for this field" msgstr "Zobrazený štítek pro toto pole" -#: helpdesk/models.py:1355 +#: third_party/django-helpdesk/helpdesk/models.py:1658 msgid "Help Text" msgstr "Nápověda" -#: helpdesk/models.py:1356 +#: third_party/django-helpdesk/helpdesk/models.py:1659 msgid "Shown to the user when editing the ticket" msgstr "Zobrazí se uživateli při editaci ticketu" -#: helpdesk/models.py:1362 +#: third_party/django-helpdesk/helpdesk/models.py:1665 msgid "Character (single line)" msgstr "Řetězec znaků (jeden řádek)" -#: helpdesk/models.py:1363 +#: third_party/django-helpdesk/helpdesk/models.py:1666 msgid "Text (multi-line)" msgstr "Text (více řádků)" -#: helpdesk/models.py:1364 +#: third_party/django-helpdesk/helpdesk/models.py:1667 msgid "Integer" msgstr "Celé číslo" -#: helpdesk/models.py:1365 +#: third_party/django-helpdesk/helpdesk/models.py:1668 msgid "Decimal" msgstr "Číslo s plovoucí desetinnou čárkou" -#: helpdesk/models.py:1366 +#: third_party/django-helpdesk/helpdesk/models.py:1669 msgid "List" msgstr "Seznam" -#: helpdesk/models.py:1367 +#: third_party/django-helpdesk/helpdesk/models.py:1670 msgid "Boolean (checkbox yes/no)" msgstr "Pravda/nepravda (zaškrtávátko ano/ne)" -#: helpdesk/models.py:1369 +#: third_party/django-helpdesk/helpdesk/models.py:1672 msgid "Time" msgstr "Čas" -#: helpdesk/models.py:1370 +#: third_party/django-helpdesk/helpdesk/models.py:1673 msgid "Date & Time" msgstr "Datum a čas" -#: helpdesk/models.py:1372 +#: third_party/django-helpdesk/helpdesk/models.py:1675 msgid "URL" msgstr "URL" -#: helpdesk/models.py:1373 +#: third_party/django-helpdesk/helpdesk/models.py:1676 msgid "IP Address" msgstr "IP Adresa" -#: helpdesk/models.py:1378 +#: third_party/django-helpdesk/helpdesk/models.py:1681 msgid "Data Type" msgstr "Datový typ" -#: helpdesk/models.py:1380 +#: third_party/django-helpdesk/helpdesk/models.py:1683 msgid "Allows you to restrict the data entered into this field" msgstr "Umožní omezit vstup tohoto pole" -#: helpdesk/models.py:1385 +#: third_party/django-helpdesk/helpdesk/models.py:1688 msgid "Maximum Length (characters)" msgstr "Maximální počet znaků" -#: helpdesk/models.py:1391 +#: third_party/django-helpdesk/helpdesk/models.py:1694 msgid "Decimal Places" msgstr "Počet desetinných míst" -#: helpdesk/models.py:1392 +#: third_party/django-helpdesk/helpdesk/models.py:1695 msgid "Only used for decimal fields" msgstr "Použito pouze pro pole typu Číslo s plovoucí desetinnou čárkou" -#: helpdesk/models.py:1398 +#: third_party/django-helpdesk/helpdesk/models.py:1701 msgid "Add empty first choice to List?" msgstr "Přiřadit první prázdnou volbu do seznamu?" -#: helpdesk/models.py:1400 +#: third_party/django-helpdesk/helpdesk/models.py:1703 msgid "" "Only for List: adds an empty first entry to the choices list, which enforces " "that the user makes an active choice." @@ -1190,70 +1322,84 @@ msgstr "" "Pouze pro seznamy: přidá prázdnou volbu jako první položku seznamu, což " "uživatele přiměje k aktivnímu výběru některé z možností." -#: helpdesk/models.py:1405 +#: third_party/django-helpdesk/helpdesk/models.py:1708 msgid "List Values" msgstr "Položky seznamu" -#: helpdesk/models.py:1406 +#: third_party/django-helpdesk/helpdesk/models.py:1709 msgid "For list fields only. Enter one option per line." msgstr "Pouze pro pole typu Seznam. Zadejte volby na zvláštní řádek." -#: helpdesk/models.py:1412 +#: third_party/django-helpdesk/helpdesk/models.py:1715 msgid "Ordering" msgstr "Řazení" -#: helpdesk/models.py:1413 +#: third_party/django-helpdesk/helpdesk/models.py:1716 msgid "Lower numbers are displayed first; higher numbers are listed later" msgstr "Nižší hodnoty se zobrazí první; vyšší hodnoty až nakonec" -#: helpdesk/models.py:1427 +#: third_party/django-helpdesk/helpdesk/models.py:1729 msgid "Required?" msgstr "Poviné pole?" -#: helpdesk/models.py:1428 +#: third_party/django-helpdesk/helpdesk/models.py:1730 msgid "Does the user have to enter a value for this field?" msgstr "Musí uživatel toto pole vyplnit?" -#: helpdesk/models.py:1433 +#: third_party/django-helpdesk/helpdesk/models.py:1735 msgid "Staff Only?" msgstr "Pouze pro naše pracovníky?" -#: helpdesk/models.py:1434 +#: third_party/django-helpdesk/helpdesk/models.py:1736 msgid "" "If this is ticked, then the public submission form will NOT show this field" msgstr "" "Pokud je zaškrtnuto, toto pole NEBUDE zobrazeno ve formuláři pro veřejné " "zadávání." -#: helpdesk/models.py:1445 +#: third_party/django-helpdesk/helpdesk/models.py:1747 msgid "Custom field" msgstr "Vlastní pole" -#: helpdesk/models.py:1446 +#: third_party/django-helpdesk/helpdesk/models.py:1748 msgid "Custom fields" msgstr "Vlastní pole" -#: helpdesk/models.py:1470 +#: third_party/django-helpdesk/helpdesk/models.py:1771 msgid "Ticket custom field value" msgstr "Hodnota vlastního pole u ticketu" -#: helpdesk/models.py:1471 +#: third_party/django-helpdesk/helpdesk/models.py:1772 msgid "Ticket custom field values" msgstr "Hodnoty vlastních polí u ticketu" -#: helpdesk/models.py:1483 +#: third_party/django-helpdesk/helpdesk/models.py:1783 msgid "Ticket dependency" msgstr "Vzájemná závislost ticketů" -#: helpdesk/models.py:1484 +#: third_party/django-helpdesk/helpdesk/models.py:1784 msgid "Ticket dependencies" msgstr "Vzájemné závislosti ticketů" -#: helpdesk/models.py:1496 +#: third_party/django-helpdesk/helpdesk/models.py:1796 msgid "Depends On Ticket" msgstr "Závisí na ticketu" -#: helpdesk/templates/helpdesk/attribution.html:2 +#: third_party/django-helpdesk/helpdesk/query.py:201 +msgid "No text" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/query.py:202 +#, fuzzy +#| msgid "View Ticket" +msgid "View ticket" +msgstr "Prohlédnout ticket" + +#: third_party/django-helpdesk/helpdesk/query.py:204 +msgid "Messages" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/attribution.html:6 msgid "" "django-" "helpdesk." @@ -1261,43 +1407,37 @@ msgstr "" "django-" "helpdesk." -#: helpdesk/templates/helpdesk/base.html:18 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/base-head.html:14 msgid "Powered by django-helpdesk" msgstr "Powered by django-helpdesk" -#: helpdesk/templates/helpdesk/base.html:75 -#: helpdesk/templates/helpdesk/rss_list.html:10 -#: helpdesk/templates/helpdesk/rss_list.html:36 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/base-head.html:46 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:21 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:47 msgid "My Open Tickets" msgstr "Mé otevřené tickety" -#: helpdesk/templates/helpdesk/base.html:76 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/base-head.html:47 msgid "All Recent Activity" msgstr "Veškerá poslední aktivita" -#: helpdesk/templates/helpdesk/base.html:77 -#: helpdesk/templates/helpdesk/include/unassigned.html:7 -#: helpdesk/templates/helpdesk/rss_list.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/base-head.html:48 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:27 msgid "Unassigned Tickets" msgstr "Nepřiřazené tickety" -#: helpdesk/templates/helpdesk/base.html:117 -#: helpdesk/templates/helpdesk/navigation.html:12 -#: helpdesk/templates/helpdesk/public_base.html:16 -#: helpdesk/templates/helpdesk/public_base.html:50 -msgid "Helpdesk" -msgstr "Helpdesk" - -#: helpdesk/templates/helpdesk/confirm_delete_saved_query.html:3 -#: helpdesk/templates/helpdesk/ticket_list.html:140 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/confirm_delete_saved_query.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/confirm_delete_saved_query.html:10 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:208 msgid "Delete Saved Query" msgstr "Smazat Uložený dotaz" -#: helpdesk/templates/helpdesk/confirm_delete_saved_query.html:6 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/confirm_delete_saved_query.html:13 msgid "Delete Query" msgstr "Smazat Dotaz" -#: helpdesk/templates/helpdesk/confirm_delete_saved_query.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/confirm_delete_saved_query.html:15 #, python-format msgid "" "Are you sure you want to delete this saved filter (%(query_title)s%(ticket_title)s)? All " @@ -1403,19 +1547,20 @@ msgstr "" "Jste si jisti smazáním ticketu (%(ticket_title)s)? Všechny stopy " "ticketu včetně návazností, příloh a aktualizací budou nenávratně odstraněny." -#: helpdesk/templates/helpdesk/edit_ticket.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/edit_ticket.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/edit_ticket.html:12 msgid "Edit Ticket" msgstr "Změnit ticket" -#: helpdesk/templates/helpdesk/edit_ticket.html:9 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/edit_ticket.html:19 msgid "Edit a Ticket" msgstr "Změnit ticket" -#: helpdesk/templates/helpdesk/edit_ticket.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/edit_ticket.html:23 msgid "Note" msgstr "Poznámka" -#: helpdesk/templates/helpdesk/edit_ticket.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/edit_ticket.html:23 msgid "" "Editing a ticket does not send an e-mail to the ticket owner or " "submitter. No new details should be entered, this form should only be used " @@ -1425,17 +1570,18 @@ msgstr "" "zadavateli. Neměly by být vloženy žádné nové detaily. Tento formulář by měl " "být použít pouze pro opravu nesprávných detailů nebo vyčištění zadání.." -#: helpdesk/templates/helpdesk/edit_ticket.html:33 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/edit_ticket.html:43 msgid "Save Changes" msgstr "Uložit změny" -#: helpdesk/templates/helpdesk/email_ignore_add.html:3 -#: helpdesk/templates/helpdesk/email_ignore_add.html:6 -#: helpdesk/templates/helpdesk/email_ignore_add.html:23 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_add.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_add.html:9 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_add.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_add.html:30 msgid "Ignore E-Mail Address" msgstr "Ignorovat e-mailové adresy" -#: helpdesk/templates/helpdesk/email_ignore_add.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_add.html:15 msgid "" "To ignore an e-mail address and prevent any emails from that address " "creating tickets automatically, enter the e-mail address below." @@ -1443,7 +1589,7 @@ msgstr "" "Pro ignorování e-mailvoé adresy a zajištění, aby z této adresy nebyly " "automaticky vytvářeny žádné tickety, vložte níže tuto adresu." -#: helpdesk/templates/helpdesk/email_ignore_add.html:10 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_add.html:17 msgid "" "You can either enter a whole e-mail address such as email@domain.com or a portion of an e-mail address with a wildcard, such as *@domain." @@ -1452,15 +1598,15 @@ msgstr "" "Můžete vložit celou adresu jako např. email@domena.cz nebo použít " "divoké znaky, jako např. *@domena.cz nebo uzivatel@*." -#: helpdesk/templates/helpdesk/email_ignore_del.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_del.html:3 msgid "Delete Ignored E-Mail Address" msgstr "Smazat ignorovanou e-mailovou adresu" -#: helpdesk/templates/helpdesk/email_ignore_del.html:6 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_del.html:6 msgid "Un-Ignore E-Mail Address" msgstr "Přestat ignorovat e-mailovou adresu." -#: helpdesk/templates/helpdesk/email_ignore_del.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_del.html:8 #, python-format msgid "" "Are you sure you wish to stop removing this email address (" @@ -1471,20 +1617,20 @@ msgstr "" "automaticky vytvářet tickety ve vašem systému? Tuto adresu můžete samozřejmě " "přidat zpět kdykoliv v budoucnu." -#: helpdesk/templates/helpdesk/email_ignore_del.html:10 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_del.html:10 msgid "Keep Ignoring It" msgstr "Pokračovat v ignorování" -#: helpdesk/templates/helpdesk/email_ignore_del.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_del.html:13 msgid "Stop Ignoring It" msgstr "Přestat ignorovat" -#: helpdesk/templates/helpdesk/email_ignore_list.html:3 -#: helpdesk/templates/helpdesk/email_ignore_list.html:15 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:15 msgid "Ignored E-Mail Addresses" msgstr "Ignorované e-mailové adresy" -#: helpdesk/templates/helpdesk/email_ignore_list.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:5 msgid "" "\n" "

Ignored E-Mail Addresses

\n" @@ -1499,40 +1645,38 @@ msgstr "" "

Tyto e-maillové adresy jsou procesorem ignorovány. Můžete přidat na " "seznam nové adresy nebo smazat některou z položek níže.

" -#: helpdesk/templates/helpdesk/email_ignore_list.html:19 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:19 msgid "Add an Email" msgstr "Přidat e-mail" -#: helpdesk/templates/helpdesk/email_ignore_list.html:26 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:26 msgid "Date Added" msgstr "Přidáno datum" -#: helpdesk/templates/helpdesk/email_ignore_list.html:28 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:28 msgid "Keep in mailbox?" msgstr "Ponechat v mailboxu?" -#: helpdesk/templates/helpdesk/email_ignore_list.html:29 -#: helpdesk/templates/helpdesk/email_ignore_list.html:40 -#: helpdesk/templates/helpdesk/include/unassigned.html:33 -#: helpdesk/templates/helpdesk/ticket.html:103 -#: helpdesk/templates/helpdesk/ticket.html:119 -#: helpdesk/templates/helpdesk/ticket_cc_list.html:28 -#: helpdesk/templates/helpdesk/ticket_cc_list.html:37 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:17 -#: helpdesk/templates/helpdesk/ticket_list.html:254 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:29 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:40 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:30 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:38 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:47 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:90 msgid "Delete" msgstr "Smazat" -#: helpdesk/templates/helpdesk/email_ignore_list.html:38 -#: helpdesk/templates/helpdesk/ticket_list.html:249 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:38 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:78 msgid "All" msgstr "Všechny" -#: helpdesk/templates/helpdesk/email_ignore_list.html:39 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:39 msgid "Keep" msgstr "Ponechat" -#: helpdesk/templates/helpdesk/email_ignore_list.html:56 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/email_ignore_list.html:56 msgid "" "Note: If the 'Keep' option is not selected, emails sent " "from that address will be deleted permanently." @@ -1540,103 +1684,184 @@ msgstr "" "Poznámka: Pokud volba 'Ponechat' není zatržena, jsou e-" "maily automaticky mazány ze serveru." -#: helpdesk/templates/helpdesk/followup_edit.html:2 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/date.html:4 +msgid "Date (From)" +msgstr "Datum (Od)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/date.html:10 +msgid "Date (To)" +msgstr "Datum (Do)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/date.html:19 +#, fuzzy +#| msgid "Use YYYY-MM-DD date format, eg 2011-05-29" +msgid "Use YYYY-MM-DD date format, eg 2018-01-30" +msgstr "Použijte formát RRRR-MM-DD, např. 2011-05-29" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/kbitems.html:6 +#, fuzzy +#| msgid "Knowledge base items" +msgid "Knowledge base item(s)" +msgstr "Položky znalostní báze" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/kbitems.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/queue.html:18 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/status.html:14 +msgid "Ctrl-click to select multiple options" +msgstr "Ctrl-klik pro výběr více možností" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/keywords.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:173 +msgid "Keywords" +msgstr "Klíčová slova" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/keywords.html:12 +msgid "" +"Keywords are case-insensitive, and will be looked for pretty much everywhere " +"possible. Prepend with 'queue:' or 'priority:' to search by queue or " +"priority. You can also use the keyword OR to combine multiple searches." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/owner.html:6 +msgid "Owner(s)" +msgstr "Vlastník(ci)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/owner.html:12 +msgid "(ME)" +msgstr "(Já)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/owner.html:20 +msgid "Ctrl-Click to select multiple options" +msgstr "Ctrl-Klik pro výběr více voleb" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/queue.html:6 +msgid "Queue(s)" +msgstr "Fronta(y)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:169 +msgid "Sorting" +msgstr "Řazení" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:25 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:175 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:68 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:170 +#: third_party/django-helpdesk/helpdesk/views/staff.py:584 +msgid "Owner" +msgstr "Vlastník" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:30 +msgid "Reverse" +msgstr "Převrátit směr řazení" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/sorting.html:38 +msgid "Ordering applied to tickets" +msgstr "Řazení použité na tickety" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/filters/status.html:6 +msgid "Status(es)" +msgstr "Stav(y)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/followup_edit.html:2 msgid "Edit followup" msgstr "Editovat návazné" -#: helpdesk/templates/helpdesk/followup_edit.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/followup_edit.html:20 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/followup_edit.html:30 msgid "Edit FollowUp" msgstr "Editovat návazné" -#: helpdesk/templates/helpdesk/followup_edit.html:21 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/followup_edit.html:37 msgid "Reassign ticket:" msgstr "Znovu přiřadit ticket" -#: helpdesk/templates/helpdesk/followup_edit.html:23 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/followup_edit.html:39 msgid "Title:" msgstr "Nadpis:" -#: helpdesk/templates/helpdesk/followup_edit.html:25 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/followup_edit.html:41 msgid "Comment:" msgstr "Komentář" -#: helpdesk/templates/helpdesk/include/stats.html:7 -msgid "Helpdesk Summary" -msgstr "Souhrn Helpdesku" - -#: helpdesk/templates/helpdesk/include/stats.html:27 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/stats.html:15 msgid "View Tickets" msgstr "Prohlédnout tickety" -#: helpdesk/templates/helpdesk/include/stats.html:27 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/stats.html:15 msgid "No tickets in this range" msgstr "V tomto rozsahu nejsou žádné tickety" -#: helpdesk/templates/helpdesk/include/tickets.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/tickets.html:7 msgid "Your Tickets" msgstr "Vaše Tickety" -#: helpdesk/templates/helpdesk/include/tickets.html:16 -#: helpdesk/templates/helpdesk/include/unassigned.html:16 -#: helpdesk/templates/helpdesk/ticket_list.html:221 -msgid "Pr" -msgstr "Pr" - -#: helpdesk/templates/helpdesk/include/tickets.html:20 -#: helpdesk/templates/helpdesk/kb_category.html:30 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/tickets.html:18 msgid "Last Update" msgstr "Poslední aktualizace" -#: helpdesk/templates/helpdesk/include/tickets.html:34 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/tickets.html:31 msgid "You do not have any pending tickets." msgstr "" -#: helpdesk/templates/helpdesk/include/unassigned.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:7 msgid "(pick up a ticket if you start to work on it)" msgstr "(převzít ticket, pokud na něm začnete pracovat)" -#: helpdesk/templates/helpdesk/include/unassigned.html:32 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:53 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:15 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:63 +msgid "Prority" +msgstr "Priorita" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:18 +msgid "Actions" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:29 msgid "Take" msgstr "Převzít" -#: helpdesk/templates/helpdesk/include/unassigned.html:37 -#: helpdesk/templates/helpdesk/report_index.html:54 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/include/unassigned.html:34 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:61 msgid "There are no unassigned tickets." msgstr "Nejsou žádné nepřiřazené tickety" -#: helpdesk/templates/helpdesk/kb_category.html:4 -msgid "Knowledgebase Category" -msgstr "Katorie znalostní báze" - -#: helpdesk/templates/helpdesk/kb_category.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category.html:10 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category_base.html:2 #, python-format msgid "%(kbcat)s" msgstr "%(kbcat)s" -#: helpdesk/templates/helpdesk/kb_category.html:8 -#, python-format -msgid "You are viewing all items in the %(kbcat)s category." -msgstr "Díváte se na všechny položky kategorie %(kbcat)s" - -#: helpdesk/templates/helpdesk/kb_category.html:26 -#, python-format -msgid "View Answer " -msgstr "" -"Prohlédnout Odpověď " - -#: helpdesk/templates/helpdesk/kb_category.html:29 -msgid "Rating" -msgstr "Hodnocení" - -#: helpdesk/templates/helpdesk/kb_index.html:4 -#: helpdesk/templates/helpdesk/kb_item.html:4 -#: helpdesk/templates/helpdesk/navigation.html:33 -#: helpdesk/templates/helpdesk/navigation.html:101 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_index.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_index.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_index.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:53 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:75 msgid "Knowledgebase" msgstr "Znalostní báze" -#: helpdesk/templates/helpdesk/kb_index.html:6 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category_base.html:2 +msgid "Knowledgebase Category" +msgstr "Kategorie znalostní báze" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category_base.html:27 +msgid "open tickets" +msgstr "otevřené tickety" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category_base.html:32 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category_base.html:46 +msgid "Contact a human" +msgstr "Napište nám" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_category_base.html:36 +#, python-format +msgid "%(recommendations)s people found this answer useful of %(votes)s" +msgstr "" +"%(recommendations)s z %(votes)s lidí si myslí, že tato odpoveď je užitečná" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_index.html:15 msgid "" "We have listed a number of Knowledgebase articles for your perusal in the " "following categories. Please check to see if any of these articles address " @@ -1646,152 +1871,137 @@ msgstr "" "podívejte se, jestli některé články neřeší Váš problém před tím, než " "otevřete nový ticket" -#: helpdesk/templates/helpdesk/kb_index.html:20 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/kb_index.html:26 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:26 msgid "View articles" msgstr "Prohlédnout články" -#: helpdesk/templates/helpdesk/kb_item.html:4 -#, python-format -msgid "%(item)s" -msgstr "%(item)s" +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:5 +msgid "Helpdesk" +msgstr "Helpdesk" -#: helpdesk/templates/helpdesk/kb_item.html:17 -msgid "Did you find this article useful?" -msgstr "Pomohl Vám tento článek?" - -#: helpdesk/templates/helpdesk/kb_item.html:28 -msgid "The results of voting by other readers of this article are below:" -msgstr "Výsledky hlasování dalších čtenářů jsou níže" - -#: helpdesk/templates/helpdesk/kb_item.html:30 -#, python-format -msgid "Recommendations: %(recommendations)s" -msgstr "Doporučení: %(recommendations)s" - -#: helpdesk/templates/helpdesk/kb_item.html:31 -#, python-format -msgid "Votes: %(votes)s" -msgstr "Hlasování: %(votes)s" - -#: helpdesk/templates/helpdesk/kb_item.html:32 -#, python-format -msgid "Overall Rating: %(score)s" -msgstr "Celkové hodnocení: %(score)s" - -#: helpdesk/templates/helpdesk/kb_item.html:40 -#, python-format -msgid "" -"View other %(category_title)s articles, or continue viewing other knowledgebase articles." -msgstr "" -"Prohlédnout další %(category_title)s " -"články, nebo pokračovat v prohlížení dalších článků " -"znalostní báze." - -#: helpdesk/templates/helpdesk/navigation.html:7 -msgid "Toggle navigation" -msgstr "" - -#: helpdesk/templates/helpdesk/navigation.html:20 -#: helpdesk/templates/helpdesk/navigation.html:94 -msgid "Dashboard" -msgstr "Nástěnka" - -#: helpdesk/templates/helpdesk/navigation.html:26 -msgid "New Ticket" -msgstr "Nový ticket" - -#: helpdesk/templates/helpdesk/navigation.html:29 -msgid "Stats" -msgstr "Statistiky" - -#: helpdesk/templates/helpdesk/navigation.html:38 -msgid "Saved Query" -msgstr "Uložené dotazy" - -#: helpdesk/templates/helpdesk/navigation.html:53 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:15 msgid "Search..." msgstr "Vyhledávat..." -#: helpdesk/templates/helpdesk/navigation.html:53 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:15 msgid "Enter a keyword, or a ticket number to jump straight to that ticket." msgstr "Vložte klíčové slovo, číslo ticketu nebo skočte rovnou na ticket." -#: helpdesk/templates/helpdesk/navigation.html:57 -#: helpdesk/templates/helpdesk/ticket_list.html:254 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:19 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:100 msgid "Go" msgstr "" -#: helpdesk/templates/helpdesk/navigation.html:73 -#: helpdesk/templates/helpdesk/rss_list.html:3 -#: helpdesk/templates/helpdesk/rss_list.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:50 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:16 msgid "RSS Feeds" msgstr "RSS kanály" -#: helpdesk/templates/helpdesk/navigation.html:75 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:52 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password.html:2 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password_done.html:2 msgid "Change password" msgstr "Změnit heslo" -#: helpdesk/templates/helpdesk/navigation.html:79 -#: helpdesk/templates/helpdesk/system_settings.html:6 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:56 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:15 msgid "System Settings" msgstr "Systémová nastavení" -#: helpdesk/templates/helpdesk/navigation.html:82 -#: helpdesk/templates/helpdesk/navigation.html:103 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:59 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:78 msgid "Logout" msgstr "Odhlásit" -#: helpdesk/templates/helpdesk/navigation.html:103 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:66 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:9 +msgid "Dashboard" +msgstr "Nástěnka" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-header.html:80 msgid "Log In" msgstr "Přihlásit" -#: helpdesk/templates/helpdesk/public_change_language.html:2 -#: helpdesk/templates/helpdesk/public_homepage.html:74 -#: helpdesk/templates/helpdesk/public_view_form.html:4 -#: helpdesk/templates/helpdesk/public_view_ticket.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:15 +msgid "All Tickets" +msgstr "Všechny tickety" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:21 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:23 +msgid "Saved Queries" +msgstr "Uložené dotazy" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:33 +msgid "" +"No saved queries currently available. You can create one in the All Tickets " +"page." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:40 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:68 +msgid "New Ticket" +msgstr "Nový ticket" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:46 +#, fuzzy +#| msgid "Reports By User" +msgid "Reports" +msgstr "Zprávy na uživatele" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/navigation-sidebar.html:62 +msgid "Homepage" +msgstr "Domovská stránka" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_change_language.html:2 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:84 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_form.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:3 msgid "View a Ticket" msgstr "Prohlédnout ticket" -#: helpdesk/templates/helpdesk/public_change_language.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_change_language.html:5 msgid "Change the display language" msgstr "Změnit zobrazený jazyk" -#: helpdesk/templates/helpdesk/public_homepage.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_create_ticket_base.html:12 +msgid "" +"Public ticket submission is disabled. Please contact the administrator for " +"assistance." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:4 +msgid "Welcome to Helpdesk" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:20 msgid "Knowledgebase Articles" msgstr "Články znalostní báze" -#: helpdesk/templates/helpdesk/public_homepage.html:10 -msgid "Knowledgebase Categories" -msgstr "Kategorie znalostní báze" - -#: helpdesk/templates/helpdesk/public_homepage.html:29 -msgid "All fields are required." -msgstr "Všechny položky jsou vyžadovány." - -#: helpdesk/templates/helpdesk/public_homepage.html:67 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:77 msgid "Please use button at upper right to login first." msgstr "Prosím použijte tlačítko vpravo-nahoře pro přihlášení." -#: helpdesk/templates/helpdesk/public_homepage.html:83 -#: helpdesk/templates/helpdesk/public_view_form.html:15 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:93 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_form.html:15 msgid "Your E-mail Address" msgstr "Váš e-mail" -#: helpdesk/templates/helpdesk/public_homepage.html:87 -#: helpdesk/templates/helpdesk/public_view_form.html:19 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_homepage.html:97 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_form.html:19 msgid "View Ticket" msgstr "Prohlédnout ticket" -#: helpdesk/templates/helpdesk/public_spam.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_spam.html:4 msgid "Unable To Open Ticket" msgstr "Nelze otevřít ticket" -#: helpdesk/templates/helpdesk/public_spam.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_spam.html:5 msgid "Sorry, but there has been an error trying to submit your ticket." msgstr "Promiňte, při ukládání ticketu se vyskytla chyba." -#: helpdesk/templates/helpdesk/public_spam.html:6 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_spam.html:6 msgid "" "Our system has marked your submission as spam, so we are " "unable to save it. If this is not spam, please press back and re-type your " @@ -1803,7 +2013,7 @@ msgstr "" "Pokuste se neznít 'jako spam', např. pokud máte hodně linků, zkuste je " "odstranit pokud je to možné." -#: helpdesk/templates/helpdesk/public_spam.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_spam.html:7 msgid "" "We are sorry for any inconvenience, however this check is required to avoid " "our helpdesk resources being overloaded by spammers." @@ -1811,45 +2021,156 @@ msgstr "" "Omlouváme se za potíže, tato kontrola je nutná, aby nedošlo k zaspamování " "helpdesku." -#: helpdesk/templates/helpdesk/public_view_form.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_form.html:8 msgid "Error:" msgstr "Chyba:" -#: helpdesk/templates/helpdesk/public_view_ticket.html:10 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:10 #, python-format msgid "Queue: %(queue_name)s" msgstr "Fronta: %(queue_name)s" -#: helpdesk/templates/helpdesk/public_view_ticket.html:14 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:47 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:30 msgid "Submitted On" msgstr "Zadáno dne" -#: helpdesk/templates/helpdesk/public_view_ticket.html:36 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:36 msgid "Tags" msgstr "Tagy" -#: helpdesk/templates/helpdesk/public_view_ticket.html:49 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:36 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:49 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:100 msgid "Accept and Close" msgstr "Akceptovat a zavřít" -#: helpdesk/templates/helpdesk/public_view_ticket.html:58 -#: helpdesk/templates/helpdesk/ticket.html:80 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:58 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:38 msgid "Follow-Ups" msgstr "Následovníci" -#: helpdesk/templates/helpdesk/public_view_ticket.html:66 -#: helpdesk/templates/helpdesk/ticket.html:97 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:66 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:53 #, python-format msgid "Changed %(field)s from %(old_value)s to %(new_value)s." msgstr "Změněno %(field)s z %(old_value)s na %(new_value)s." -#: helpdesk/templates/helpdesk/registration/logged_out.html:2 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:84 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:103 +msgid "Use a Pre-set Reply" +msgstr "Použít přednastavenou odpověď" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:84 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:103 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:152 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:160 +msgid "(Optional)" +msgstr "(Volitelné)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:86 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:105 +msgid "" +"Selecting a pre-set reply will over-write your comment below. You can then " +"modify the pre-set reply to your liking before saving this update." +msgstr "" +"Pokud vyberete přednastavenou odpověď, přepíšete Vaše komentáře níže. " +"Přednastavený text můžete následně upravit, než jej uložíte jako aktualizaci." + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:89 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:108 +msgid "Comment / Resolution" +msgstr "Komentáře / usnesení" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:91 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:110 +msgid "" +"You can insert ticket and queue details in your message. For more " +"information, see the context help page." +msgstr "" +"Do zprávy můžete vložit detaily fronty a zprávy. Pro více informací se " +"podívejte na stránku kontextové nápovědy." + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:93 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:113 +msgid "" +"This ticket cannot be resolved or closed until the tickets it depends on are " +"resolved." +msgstr "" +"Tento ticket nelze rozřešit nebo uzavřít dokud nejsou rozřešeny tickety na " +"kterých závisí." + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:128 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:188 +msgid "Attach File(s) »" +msgstr "Přidat soubor(y) »" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:133 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:193 +msgid "Attach a File" +msgstr "Přidat soubor" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:138 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:199 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:261 +msgid "No files selected." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/public_view_ticket.html:147 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:208 +msgid "Update This Ticket" +msgstr "Aktualizovat ticket" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password.html:6 +#, fuzzy +#| msgid "Change password" +msgid "Change Password" +msgstr "Změnit heslo" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password.html:12 +msgid "Please correct the error below." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password.html:12 +msgid "Please correct the errors below." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password.html:17 +msgid "" +"Please enter your old password, for security's sake, and then enter your new " +"password twice so we can verify you typed it in correctly." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password.html:45 +#, fuzzy +#| msgid "Change password" +msgid "Change my password" +msgstr "Změnit heslo" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password_done.html:6 +msgid "Success!" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/change_password_done.html:8 +msgid "Your password was changed." +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/logged_out.html:2 msgid "Logged Out" msgstr "Odhlášení" -#: helpdesk/templates/helpdesk/registration/logged_out.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/logged_out.html:4 +#, fuzzy +#| msgid "" +#| "\n" +#| "\n" +#| "
\n" +#| "
\n" +#| "

Successfully Logged Out

\n" +#| "

Thanks for being here. Hopefully you've helped resolve a " +#| "few tickets and make the world a better place.

\n" +#| "
\n" +#| "
\n" +#| "\n" msgid "" "\n" "\n" @@ -1857,7 +2178,7 @@ msgid "" "
\n" "

Successfully Logged Out

\n" "

Thanks for being here. Hopefully you've helped resolve a few " -"tickets and make the world a better place.

\n" +"tickets and made the world a better place.

\n" "
\n" " \n" "\n" @@ -1873,46 +2194,48 @@ msgstr "" " \n" "\n" -#: helpdesk/templates/helpdesk/registration/login.html:2 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/login.html:2 msgid "Helpdesk Login" msgstr "Přihlášení do Helpdesku" -#: helpdesk/templates/helpdesk/registration/login.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/login.html:12 msgid "Please Sign In" msgstr "" -#: helpdesk/templates/helpdesk/registration/login.html:18 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/login.html:16 msgid "Your username and password didn't match. Please try again." msgstr "Uživatelské jméno a heslo nesedí. Zkuste to prosím ještě jednou" -#: helpdesk/templates/helpdesk/registration/login.html:29 -msgid "Remember Me" +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/login.html:34 +msgid "Remember Password" msgstr "" -#: helpdesk/templates/helpdesk/registration/login.html:32 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/registration/login.html:38 msgid "Login" msgstr "Přihlášení" -#: helpdesk/templates/helpdesk/report_index.html:3 -#: helpdesk/templates/helpdesk/report_index.html:6 -#: helpdesk/templates/helpdesk/report_output.html:4 -#: helpdesk/templates/helpdesk/report_output.html:29 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:12 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:18 msgid "Reports & Statistics" msgstr "Zprávy a statistiky" -#: helpdesk/templates/helpdesk/report_index.html:9 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:16 msgid "You haven't created any tickets yet, so you cannot run any reports." msgstr "Zatím jste nevytvořili žádné tickety, takže nemůžete mít žádné zprávy." -#: helpdesk/templates/helpdesk/report_index.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:22 msgid "Current Ticket Stats" msgstr "Aktulání stav ticketu" -#: helpdesk/templates/helpdesk/report_index.html:24 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:29 msgid "Average number of days until ticket is closed (all tickets): " msgstr "Průměrný počet dní do zavření ticketu (všechny tickety):" -#: helpdesk/templates/helpdesk/report_index.html:28 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:33 msgid "" "Average number of days until ticket is closed (tickets opened in last 60 " "days): " @@ -1920,70 +2243,71 @@ msgstr "" "Průměrný počet dní do zavření ticketu (tickety otevřené v posledních 60 " "dnech):" -#: helpdesk/templates/helpdesk/report_index.html:29 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:34 msgid "Click" msgstr "Klik" -#: helpdesk/templates/helpdesk/report_index.html:29 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:34 msgid "for detailed average by month." msgstr "pro detailní průměr po měsících" -#: helpdesk/templates/helpdesk/report_index.html:71 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:48 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:160 +msgid "Time spent" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:75 msgid "Generate Report" msgstr "Generovat zprávu" -#: helpdesk/templates/helpdesk/report_index.html:76 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:79 msgid "Reports By User" msgstr "Zprávy na uživatele" -#: helpdesk/templates/helpdesk/report_index.html:78 -#: helpdesk/templates/helpdesk/report_index.html:86 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:81 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:89 msgid "by Priority" msgstr "podle Priority" -#: helpdesk/templates/helpdesk/report_index.html:79 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:82 msgid "by Queue" msgstr "podle Fronty" -#: helpdesk/templates/helpdesk/report_index.html:80 -#: helpdesk/templates/helpdesk/report_index.html:87 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:83 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:90 msgid "by Status" msgstr "podle Stavu" -#: helpdesk/templates/helpdesk/report_index.html:81 -#: helpdesk/templates/helpdesk/report_index.html:88 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:84 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:91 msgid "by Month" msgstr "podle Měsíce" -#: helpdesk/templates/helpdesk/report_index.html:84 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:87 msgid "Reports By Queue" msgstr "Zprávy podle Fronty" -#: helpdesk/templates/helpdesk/report_index.html:89 -#: helpdesk/views/staff.py:1270 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_index.html:92 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1228 msgid "Days until ticket closed by Month" msgstr "Počet dní do zavření ticketu podle Měsíce" -#: helpdesk/templates/helpdesk/report_output.html:35 -msgid "Saved Queries" -msgstr "Uložené dotazy" - -#: helpdesk/templates/helpdesk/report_output.html:40 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:27 msgid "" "You can run this query on filtered data by using one of your saved queries." msgstr "" "Tento dotaz můžete pustit na filtrovaná data tak, že použijete některý z " "uložených dotazů." -#: helpdesk/templates/helpdesk/report_output.html:42 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:29 msgid "Select Query:" msgstr "Vybrat dotaz:" -#: helpdesk/templates/helpdesk/report_output.html:47 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:34 msgid "Filter Report" msgstr "Zpráva z filtru" -#: helpdesk/templates/helpdesk/report_output.html:50 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/report_output.html:37 msgid "" "Want to filter this report to just show a subset of data? Go to the Ticket " "List, filter your query, and save your query." @@ -1991,7 +2315,7 @@ msgstr "" "Potřebujete filtrovat ještě menší podmnožinu dat? Jděte na Seznam ticketů, " "nastavte filtr a uložte jej." -#: helpdesk/templates/helpdesk/rss_list.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:18 msgid "" "The following RSS feeds are available for you to monitor using your " "preferred RSS software. With the exception of the 'Latest Activity' feed, " @@ -2003,7 +2327,7 @@ msgstr "" "otevřených a znovu otevřených případech. To má zajistit, aby Vaše čtečka " "nebyla přeplněna informacemi o zavřených a historických úlohách." -#: helpdesk/templates/helpdesk/rss_list.html:11 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:22 msgid "" "A summary of your open tickets - useful for getting alerted to new tickets " "opened for you" @@ -2011,11 +2335,11 @@ msgstr "" "Přehled Vašich otevřených ticketů - to je užitečné, pokud checete být " "informován o nově otevřených ticketech." -#: helpdesk/templates/helpdesk/rss_list.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:24 msgid "Latest Activity" msgstr "Nejnovější aktivita" -#: helpdesk/templates/helpdesk/rss_list.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:25 msgid "" "A summary of all helpdesk activity - including comments, emails, " "attachments, and more" @@ -2023,7 +2347,7 @@ msgstr "" "Přehled veškeré aktivity na helpdesku - včetně komentářů, e-mailů, příloh a " "dalšího" -#: helpdesk/templates/helpdesk/rss_list.html:17 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:28 msgid "" "All unassigned tickets - useful for being alerted to new tickets opened by " "the public via the web or via e-mail" @@ -2031,7 +2355,7 @@ msgstr "" "Všechny nepřiřazené tickety - užitečné propřehled o nových ticketech " "otevřených prostřednictvím veřejného formuláře nebo e-mailem." -#: helpdesk/templates/helpdesk/rss_list.html:20 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:31 msgid "" "These RSS feeds allow you to view a summary of either your own tickets, or " "all tickets, for each of the queues in your helpdesk. For example, if you " @@ -2043,155 +2367,111 @@ msgstr "" "řídíte Vaše kolegy využíající určitou frontu, tento kanál Vám dá přehled o " "nových přicházejících ticketech." -#: helpdesk/templates/helpdesk/rss_list.html:26 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:37 msgid "Per-Queue Feeds" msgstr "RSS kanály pro každou frontu" -#: helpdesk/templates/helpdesk/rss_list.html:35 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/rss_list.html:46 msgid "All Open Tickets" msgstr "Všechny otevřené tickety" -#: helpdesk/templates/helpdesk/system_settings.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/success_iframe.html:3 +msgid "" +"Ticket submitted successfully! We will reply via email as soon as we get the " +"chance." +msgstr "Ticket odeslán úspešně! Pokusíme se Vám odpovědět co nejdříve." + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:3 msgid "Change System Settings" msgstr "Změnit nastavení systému" -#: helpdesk/templates/helpdesk/system_settings.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:7 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/user_settings.html:7 +#, fuzzy +#| msgid "User Settings" +msgid "Settings" +msgstr "Uživatelská nastavení" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:17 msgid "The following items can be maintained by you or other superusers:" msgstr "Následující položky lze spravovat Vámi nebo dalšími superuživateli:" -#: helpdesk/templates/helpdesk/system_settings.html:11 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:20 msgid "E-Mail Ignore list" msgstr "Seznam ignorovaných e-mailů" -#: helpdesk/templates/helpdesk/system_settings.html:12 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:21 msgid "Maintain Queues" msgstr "Spravovat fronty" -#: helpdesk/templates/helpdesk/system_settings.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:22 msgid "Maintain Pre-Set Replies" msgstr "Spravovat přednastavené odpovědi" -#: helpdesk/templates/helpdesk/system_settings.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:23 msgid "Maintain Knowledgebase Categories" msgstr "Spravovat kategorie znalostní báze" -#: helpdesk/templates/helpdesk/system_settings.html:15 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:24 msgid "Maintain Knowledgebase Items" msgstr "Spravovat položky znalostní báze" -#: helpdesk/templates/helpdesk/system_settings.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:25 msgid "Maintain E-Mail Templates" msgstr "Spravovat e-mailové šablony" -#: helpdesk/templates/helpdesk/system_settings.html:17 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/system_settings.html:26 msgid "Maintain Users" msgstr "Spravovat uživatele" -#: helpdesk/templates/helpdesk/ticket.html:4 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:7 msgid "View Ticket Details" msgstr "Zobrazit detaily ticketu" -#: helpdesk/templates/helpdesk/ticket.html:44 -#: helpdesk/templates/helpdesk/ticket.html:236 -msgid "No files selected." +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:45 +msgid "time spent" msgstr "" -#: helpdesk/templates/helpdesk/ticket.html:91 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:45 msgid "Private" msgstr "Soukromý" -#: helpdesk/templates/helpdesk/ticket.html:115 -#: helpdesk/templates/helpdesk/ticket_desc_table.html:16 -msgid "Edit" -msgstr "" - -#: helpdesk/templates/helpdesk/ticket.html:140 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:95 msgid "Respond to this ticket" msgstr "Odpovědět na ticket" -#: helpdesk/templates/helpdesk/ticket.html:147 -msgid "Use a Pre-set Reply" -msgstr "Použít přednastavenou odpověď" - -#: helpdesk/templates/helpdesk/ticket.html:149 -msgid "" -"Selecting a pre-set reply will over-write your comment below. You can then " -"modify the pre-set reply to your liking before saving this update." -msgstr "" -"Pokud vyberete přednastavenou odpověď, přepíšete Vaše komentáře níže. " -"Přednastavený text můžete následně upravit, než jej uložíte jako aktualizaci." - -#: helpdesk/templates/helpdesk/ticket.html:152 -msgid "Comment / Resolution" -msgstr "Komentáře / usnesení" - -#: helpdesk/templates/helpdesk/ticket.html:154 -msgid "" -"You can insert ticket and queue details in your message. For more " -"information, see the context help page." -msgstr "" -"Do zprávy můžete vložit detaily fronty a zprávy. Pro více informací se " -"podívejte na stránku kontextové nápovědy." - -#: helpdesk/templates/helpdesk/ticket.html:157 -msgid "" -"This ticket cannot be resolved or closed until the tickets it depends on are " -"resolved." -msgstr "" -"Tento ticket nelze rozřešit nebo uzavřít dokud nejsou rozřešeny tickety na " -"kterých závisí." - -#: helpdesk/templates/helpdesk/ticket.html:196 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:152 msgid "Is this update public?" msgstr "Jedná se o veřejnou aktualizaci?" -#: helpdesk/templates/helpdesk/ticket.html:198 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:154 msgid "Yes, make this update public." msgstr "Ano, ať je tato aktualizace veřejná." -#: helpdesk/templates/helpdesk/ticket.html:199 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:155 msgid "" "If this is public, the submitter will be e-mailed your comment or resolution." msgstr "" "Pokud se jedná o veřejnou aktualizaci, zadavatel dostane e-mail s Vaším " "komentářem nebo rozřešením." -#: helpdesk/templates/helpdesk/ticket.html:203 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:166 msgid "Change Further Details »" msgstr "Změnit další detaily »" -#: helpdesk/templates/helpdesk/ticket.html:212 -#: helpdesk/templates/helpdesk/ticket_list.html:62 -#: helpdesk/templates/helpdesk/ticket_list.html:91 -#: helpdesk/templates/helpdesk/ticket_list.html:227 helpdesk/views/staff.py:539 -msgid "Owner" -msgstr "Vlastník" - -#: helpdesk/templates/helpdesk/ticket.html:213 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:176 msgid "Unassign" msgstr "Odstoupit" -#: helpdesk/templates/helpdesk/ticket.html:225 -msgid "Attach File(s) »" -msgstr "Přidat soubor(y) »" - -#: helpdesk/templates/helpdesk/ticket.html:230 -msgid "Attach a File" -msgstr "Přidat soubor" - -#: helpdesk/templates/helpdesk/ticket.html:233 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket.html:196 msgid "Add Another File" msgstr "Přidat další soubor" -#: helpdesk/templates/helpdesk/ticket.html:245 -msgid "Update This Ticket" -msgstr "Aktualizovat ticket" - -#: helpdesk/templates/helpdesk/ticket_attachment_del.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_attachment_del.html:3 msgid "Delete Ticket Attachment" msgstr "Smazat přílohu ticketu" -#: helpdesk/templates/helpdesk/ticket_attachment_del.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_attachment_del.html:5 #, python-format msgid "" "\n" @@ -2202,23 +2482,37 @@ msgid "" "database, but the attachment itself will still exist on the server.

\n" msgstr "" -#: helpdesk/templates/helpdesk/ticket_attachment_del.html:11 -#: helpdesk/templates/helpdesk/ticket_cc_del.html:12 -#: helpdesk/templates/helpdesk/ticket_dependency_del.html:11 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_attachment_del.html:11 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_del.html:25 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_del.html:21 msgid "Don't Delete" msgstr "Neodstraňovat" -#: helpdesk/templates/helpdesk/ticket_attachment_del.html:14 -#: helpdesk/templates/helpdesk/ticket_dependency_del.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_attachment_del.html:14 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_del.html:24 msgid "Yes, I Understand - Delete" msgstr "" -#: helpdesk/templates/helpdesk/ticket_cc_add.html:3 -#: helpdesk/templates/helpdesk/ticket_cc_add.html:6 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:19 msgid "Add Ticket CC" msgstr "Přidat CC k ticketu" -#: helpdesk/templates/helpdesk/ticket_cc_add.html:12 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_del.html:13 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:12 +#, fuzzy +#| msgid "Ticket CC Settings" +msgid "CC Settings" +msgstr "Nastavení CC k ticketu" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:15 +#, fuzzy +#| msgid "Add Ticket CC" +msgid "Add CC" +msgstr "Přidat CC k ticketu" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:24 msgid "" "To automatically send an email to a user or e-mail address when this ticket " "is updated, select the user or enter an e-mail address below." @@ -2226,28 +2520,34 @@ msgstr "" "Pro automatické zaslání zprávy uživateli nebo na e-mail pokaždé, když je " "ticket aktualizován, vyberte uživatele nebo zadejte jeho adresu níže." -#: helpdesk/templates/helpdesk/ticket_cc_add.html:18 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:29 msgid "Email" msgstr "" -#: helpdesk/templates/helpdesk/ticket_cc_add.html:27 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:38 msgid "Add Email" msgstr "" -#: helpdesk/templates/helpdesk/ticket_cc_add.html:37 -#: helpdesk/templates/helpdesk/ticket_cc_add.html:51 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:48 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:62 msgid "Save Ticket CC" msgstr "Uložit CC k ticketu" -#: helpdesk/templates/helpdesk/ticket_cc_add.html:41 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_add.html:52 msgid "Add User" msgstr "Přidat uživatele" -#: helpdesk/templates/helpdesk/ticket_cc_del.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_del.html:3 msgid "Delete Ticket CC" msgstr "Odhlásit odběr CC ticketu" -#: helpdesk/templates/helpdesk/ticket_cc_del.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_del.html:15 +#, fuzzy +#| msgid "Delete" +msgid "Delete CC" +msgstr "Smazat" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_del.html:18 #, python-format msgid "" "\n" @@ -2263,15 +2563,15 @@ msgstr "" "

Určitě chcete odstranit CC (%(email_address)s) z ticketu? Na " "daný e-mail přestanou chodit oznámení o aktualizacích.

\n" -#: helpdesk/templates/helpdesk/ticket_cc_del.html:15 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_del.html:28 msgid "Yes I Understand - Delete" msgstr "Ano rozumím - Odstranit" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:3 msgid "Ticket CC Settings" msgstr "Nastavení CC k ticketu" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:15 #, python-format msgid "" "\n" @@ -2294,36 +2594,37 @@ msgstr "" "

Můžete přidat novou adresu na seznam nebo smazat některou z položek níže." "

" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:16 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:26 msgid "Ticket CC List" msgstr "Seznam CC pro ticket" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:20 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:30 msgid "Add an Email or Helpdesk User" msgstr "" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:25 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:35 msgid "E-Mail Address or Helpdesk User" msgstr "Adresa e-mailu nebo uživatel Helpdesku" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:26 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:36 msgid "View?" msgstr "Prohlédnout?" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:27 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:37 msgid "Update?" msgstr "Aktualizovat?" -#: helpdesk/templates/helpdesk/ticket_cc_list.html:53 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_cc_list.html:63 #, python-format msgid "Return to %(ticket_title)s" msgstr "Návrat do %(ticket_title)s" -#: helpdesk/templates/helpdesk/ticket_dependency_add.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_add.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_add.html:12 msgid "Add Ticket Dependency" msgstr "Přidat závislost" -#: helpdesk/templates/helpdesk/ticket_dependency_add.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_add.html:15 msgid "" "\n" "

Add Ticket Dependency

\n" @@ -2337,15 +2638,16 @@ msgstr "" "

Přidáním závislosti Vám znemožní ticket rozřešit, dokue nebudou všechny " "podřízené tickety rozřešeny nebo uzavřeny

" -#: helpdesk/templates/helpdesk/ticket_dependency_add.html:21 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_add.html:31 msgid "Save Ticket Dependency" msgstr "Uložit závislost" -#: helpdesk/templates/helpdesk/ticket_dependency_del.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_del.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_del.html:12 msgid "Delete Ticket Dependency" msgstr "Smazat závislost" -#: helpdesk/templates/helpdesk/ticket_dependency_del.html:5 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_dependency_del.html:15 msgid "" "\n" "

Delete Ticket Dependency

\n" @@ -2357,41 +2659,37 @@ msgstr "" "\n" "

Jste si jisti odstraněním závislosti na ticketu?

\n" -#: helpdesk/templates/helpdesk/ticket_desc_table.html:8 -msgid "Ticket Summary" -msgstr "Souhrn ticketu" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:18 -msgid "Unhold" -msgstr "Aktivovat" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:18 -msgid "Hold" -msgstr "Pozdržet" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:20 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:13 #, python-format msgid "Queue: %(queue)s" msgstr "Fronta: %(queue)s" -#: helpdesk/templates/helpdesk/ticket_desc_table.html:43 -#: helpdesk/templates/helpdesk/ticket_list.html:226 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:15 +msgid "Edit" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:17 +msgid "Unhold" +msgstr "Aktivovat" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:17 +msgid "Hold" +msgstr "Pozdržet" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:27 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:67 msgid "Due Date" msgstr "Datum do kdy" -#: helpdesk/templates/helpdesk/ticket_desc_table.html:52 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:34 msgid "Assigned To" msgstr "Přiřazeno" -#: helpdesk/templates/helpdesk/ticket_desc_table.html:58 -msgid "Ignore" -msgstr "Ingorovat" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:67 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:52 msgid "Copies To" msgstr "Kopie na" -#: helpdesk/templates/helpdesk/ticket_desc_table.html:68 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:53 msgid "" "Click here to add / remove people who should receive an e-mail whenever this " "ticket is updated." @@ -2399,11 +2697,7 @@ msgstr "" "Pro přidání a nebo odebrání lidí, kteří by měli dostávat e-mail kdykoliv je " "ticket aktualizován, klikněte zde." -#: helpdesk/templates/helpdesk/ticket_desc_table.html:68 -msgid "Manage" -msgstr "Spravovat" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:68 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:53 msgid "" "Click here to subscribe yourself to this ticket, if you want to receive an e-" "mail whenever this ticket is updated." @@ -2411,29 +2705,11 @@ msgstr "" "Klikněte zde pro vaše přihlášení k tomuto ticketu, pokud chcete dostávat " "kopie e-mailů kdykoliv je ticket aktualizován." -#: helpdesk/templates/helpdesk/ticket_desc_table.html:68 -msgid "Subscribe" -msgstr "Přihlásit" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:72 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:57 msgid "Dependencies" msgstr "Závislosti" -#: helpdesk/templates/helpdesk/ticket_desc_table.html:74 -msgid "" -"This ticket cannot be resolved until the following ticket(s) are resolved" -msgstr "" -"Tento ticket nelze rozřešit, dokud nejsou rozřešeny následující tickety" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:75 -msgid "Remove Dependency" -msgstr "Odstranit závislost" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:78 -msgid "This ticket has no dependencies." -msgstr "Tento ticket nemá žádnou závislost" - -#: helpdesk/templates/helpdesk/ticket_desc_table.html:80 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:59 msgid "" "Click on 'Add Dependency', if you want to make this ticket dependent on " "another ticket. A ticket may not be closed until all tickets it depends on " @@ -2443,100 +2719,129 @@ msgstr "" "'Přidat závislost'. Ticket pak nebude možné uzavřít, dokud nebudou uzavřeny " "všechny tickety na kterých závisí." -#: helpdesk/templates/helpdesk/ticket_desc_table.html:80 -msgid "Add Dependency" -msgstr "Přidat závislost" +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:61 +msgid "" +"This ticket cannot be resolved until the following ticket(s) are resolved" +msgstr "" +"Tento ticket nelze rozřešit, dokud nejsou rozřešeny následující tickety" -#: helpdesk/templates/helpdesk/ticket_list.html:13 -msgid "No Tickets Match Your Selection" -msgstr "Vašemu výběru neodpovídá žádný ticket." +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:65 +msgid "This ticket has no dependencies." +msgstr "Tento ticket nemá žádnou závislost" -#: helpdesk/templates/helpdesk/ticket_list.html:46 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:68 +msgid "Total time spent" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:73 +#, fuzzy +#| msgid "Knowledge base item" +msgid "Knowlegebase item" +msgstr "Položka znalostní báze" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_desc_table.html:107 +#, fuzzy +#| msgid "Edit Ticket" +msgid "Edit details" +msgstr "Změnit ticket" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:22 +msgid "Saved Query" +msgstr "Uložené dotazy" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:37 +msgid "Query Results" +msgstr "Výsledek dotazu" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:42 +msgid "Table" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:48 +#, fuzzy +#| msgid "Time" +msgid "Timeline" +msgstr "Čas" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:69 +#, fuzzy +#| msgid "Submitted On" +msgid "Submitter" +msgstr "Zadáno dne" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:70 +msgid "Time Spent" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:75 +msgid "Select:" +msgstr "Vybrat" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:83 +msgid "Invert" +msgstr "Obrátit" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:87 +msgid "With Selected Tickets:" +msgstr "Provézt s vybranými tickety:" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:89 +msgid "Take (Assign to me)" +msgstr "Převízt (přiřadit mě)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:91 +msgid "Close" +msgstr "Uzavřít" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:92 +msgid "Close (Don't Send E-Mail)" +msgstr "Uzavřít (bez odeslání e-mailu)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:93 +msgid "Close (Send E-Mail)" +msgstr "Uzavřít (a odeslat e-mail)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:95 +msgid "Assign To" +msgstr "Přiřadit" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:96 +msgid "Nobody (Unassign)" +msgstr "Nikomu (odstranit přiřazení)" + +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:146 msgid "Query Selection" msgstr "Výběr" -#: helpdesk/templates/helpdesk/ticket_list.html:54 -msgid "Change Query" -msgstr "Změnit dotaz" +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:156 +#, fuzzy +#| msgid "Apply Filter" +msgid "Filters" +msgstr "Použit filtr" -#: helpdesk/templates/helpdesk/ticket_list.html:61 -#: helpdesk/templates/helpdesk/ticket_list.html:73 -msgid "Sorting" -msgstr "Řazení" +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:165 +#, fuzzy +#| msgid "Add User" +msgid "Add filter" +msgstr "Přidat uživatele" -#: helpdesk/templates/helpdesk/ticket_list.html:65 -#: helpdesk/templates/helpdesk/ticket_list.html:133 -msgid "Keywords" -msgstr "Klíčová slova" - -#: helpdesk/templates/helpdesk/ticket_list.html:66 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:174 msgid "Date Range" msgstr "Časový rozsah" -#: helpdesk/templates/helpdesk/ticket_list.html:94 -msgid "Reverse" -msgstr "Převrátit směr řazení" - -#: helpdesk/templates/helpdesk/ticket_list.html:96 -msgid "Ordering applied to tickets" -msgstr "Řazení použité na tickety" - -#: helpdesk/templates/helpdesk/ticket_list.html:101 -msgid "Owner(s)" -msgstr "Vlastník(ci)" - -#: helpdesk/templates/helpdesk/ticket_list.html:105 -msgid "(ME)" -msgstr "(Já)" - -#: helpdesk/templates/helpdesk/ticket_list.html:109 -msgid "Ctrl-Click to select multiple options" -msgstr "Ctrl-Klik pro výběr více voleb" - -#: helpdesk/templates/helpdesk/ticket_list.html:114 -msgid "Queue(s)" -msgstr "Fronta(y)" - -#: helpdesk/templates/helpdesk/ticket_list.html:115 -#: helpdesk/templates/helpdesk/ticket_list.html:121 -msgid "Ctrl-click to select multiple options" -msgstr "Ctrl-klik pro výběr více možností" - -#: helpdesk/templates/helpdesk/ticket_list.html:120 -msgid "Status(es)" -msgstr "Stav(y)" - -#: helpdesk/templates/helpdesk/ticket_list.html:126 -msgid "Date (From)" -msgstr "Datum (Od)" - -#: helpdesk/templates/helpdesk/ticket_list.html:127 -msgid "Date (To)" -msgstr "Datum (Do)" - -#: helpdesk/templates/helpdesk/ticket_list.html:128 -msgid "Use YYYY-MM-DD date format, eg 2011-05-29" -msgstr "Použijte formát RRRR-MM-DD, např. 2011-05-29" - -#: helpdesk/templates/helpdesk/ticket_list.html:134 -msgid "" -"Keywords are case-insensitive, and will be looked for in the title, body and " -"submitter fields." -msgstr "" -"Klíčová slova mohou být napsána velkým i malým písmem. Prohledává se nadpis, " -"tělo ticketu a zadavatel." - -#: helpdesk/templates/helpdesk/ticket_list.html:138 -msgid "Apply Filter" +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:206 +#, fuzzy +#| msgid "Apply Filter" +msgid "Apply Filters" msgstr "Použit filtr" -#: helpdesk/templates/helpdesk/ticket_list.html:140 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:208 #, python-format msgid "" "You are currently viewing saved query \"%(query_name)s\"." msgstr "Prohlížíte uložený výběr \"%(query_name)s\"." -#: helpdesk/templates/helpdesk/ticket_list.html:143 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:211 #, python-format msgid "" "Run a report on this " @@ -2545,12 +2850,12 @@ msgstr "" "Spustit hlášení na tento " "výběr a uvidíte statistiku a grafy pro níže vypsaná data." -#: helpdesk/templates/helpdesk/ticket_list.html:152 -#: helpdesk/templates/helpdesk/ticket_list.html:170 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:224 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:243 msgid "Save Query" msgstr "Uložit výběr" -#: helpdesk/templates/helpdesk/ticket_list.html:162 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:235 msgid "" "This name appears in the drop-down list of saved queries. If you share your " "query, other users will see this name, so choose something clear and " @@ -2560,15 +2865,15 @@ msgstr "" "výběr sdílet, uvidí tento název i ostatní uživatelé, takže zvolte něco na " "první pohled jasného!" -#: helpdesk/templates/helpdesk/ticket_list.html:164 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:237 msgid "Shared?" msgstr "Sdíleno?" -#: helpdesk/templates/helpdesk/ticket_list.html:165 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:238 msgid "Yes, share this query with other users." msgstr "Ano, sdílet tento výběr s dalšími uživateli." -#: helpdesk/templates/helpdesk/ticket_list.html:166 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:239 msgid "" "If you share this query, it will be visible by all other logged-in " "users." @@ -2576,63 +2881,27 @@ msgstr "" "Pokud budete tento výběr sdílet, bude viditelný všemi dalšími " "přihlášenými uživateli." -#: helpdesk/templates/helpdesk/ticket_list.html:179 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:255 msgid "Use Saved Query" msgstr "Použít uložený výběr" -#: helpdesk/templates/helpdesk/ticket_list.html:185 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:262 msgid "Query" msgstr "Výběr" -#: helpdesk/templates/helpdesk/ticket_list.html:190 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:267 msgid "Run Query" msgstr "Spustit výběr" -#: helpdesk/templates/helpdesk/ticket_list.html:210 -msgid "Query Results" -msgstr "Výsledek dotazu" +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/ticket_list.html:294 +msgid "No Tickets Match Your Selection" +msgstr "Vašemu výběru neodpovídá žádný ticket." -#: helpdesk/templates/helpdesk/ticket_list.html:248 -msgid "Select:" -msgstr "Vybrat" - -#: helpdesk/templates/helpdesk/ticket_list.html:251 -msgid "Invert" -msgstr "Obrátit" - -#: helpdesk/templates/helpdesk/ticket_list.html:254 -msgid "With Selected Tickets:" -msgstr "Provézt s vybranými tickety:" - -#: helpdesk/templates/helpdesk/ticket_list.html:254 -msgid "Take (Assign to me)" -msgstr "Převízt (přiřadit mě)" - -#: helpdesk/templates/helpdesk/ticket_list.html:254 -msgid "Close" -msgstr "Uzavřít" - -#: helpdesk/templates/helpdesk/ticket_list.html:254 -msgid "Close (Don't Send E-Mail)" -msgstr "Uzavřít (bez odeslání e-mailu)" - -#: helpdesk/templates/helpdesk/ticket_list.html:254 -msgid "Close (Send E-Mail)" -msgstr "Uzavřít (a odeslat e-mail)" - -#: helpdesk/templates/helpdesk/ticket_list.html:254 -msgid "Assign To" -msgstr "Přiřadit" - -#: helpdesk/templates/helpdesk/ticket_list.html:254 -msgid "Nobody (Unassign)" -msgstr "Nikomu (odstranit přiřazení)" - -#: helpdesk/templates/helpdesk/user_settings.html:3 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/user_settings.html:3 msgid "Change User Settings" msgstr "Změnit uživatelská nastevení" -#: helpdesk/templates/helpdesk/user_settings.html:8 +#: third_party/django-helpdesk/helpdesk/templates/helpdesk/user_settings.html:17 msgid "" "Use the following options to change the way your helpdesk system works for " "you. These settings do not impact any other user." @@ -2640,43 +2909,39 @@ msgstr "" "Zvolte následující možnosti pro upravení chování helpdesku. Tato Vaše " "nastavení se neprojeví ostatním uživatelům." -#: helpdesk/templates/helpdesk/user_settings.html:13 -msgid "Save Options" -msgstr "Uložit změny" - -#: helpdesk/views/feeds.py:37 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:37 #, python-format msgid "Helpdesk: Open Tickets in queue %(queue)s for %(username)s" msgstr "Helpdesk: Otevřít tickety ve frontě %(queue)s pro %(username)s" -#: helpdesk/views/feeds.py:42 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:42 #, python-format msgid "Helpdesk: Open Tickets for %(username)s" msgstr "Helpdesk: Otevřít tickety pro %(username)s" -#: helpdesk/views/feeds.py:48 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:48 #, python-format msgid "Open and Reopened Tickets in queue %(queue)s for %(username)s" msgstr "Otevřít a znovu otevřít tickety ve frontě %(queue)s pro %(username)s" -#: helpdesk/views/feeds.py:53 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:53 #, python-format msgid "Open and Reopened Tickets for %(username)s" msgstr "Otevřít a znovu otevřít tickety pro %(username)s" -#: helpdesk/views/feeds.py:100 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:100 msgid "Helpdesk: Unassigned Tickets" msgstr "Helpdesk: Nepřiřazené tickety" -#: helpdesk/views/feeds.py:101 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:101 msgid "Unassigned Open and Reopened tickets" msgstr "Nepřiřazené Otevřené a Znovu otevřené tickety" -#: helpdesk/views/feeds.py:125 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:125 msgid "Helpdesk: Recent Followups" msgstr "Helpdesk: Nejčerstvější návazné" -#: helpdesk/views/feeds.py:126 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:126 msgid "" "Recent FollowUps, such as e-mail replies, comments, attachments and " "resolutions" @@ -2684,55 +2949,63 @@ msgstr "" "Nejčerstvější návazné akce, jako jsou odpovědi z e-mailů, komentáře, přílohy " "a rozřešení" -#: helpdesk/views/feeds.py:141 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:141 #, python-format msgid "Helpdesk: Open Tickets in queue %(queue)s" msgstr "Helpdesk: Otevřít tickety ve frontě %(queue)s" -#: helpdesk/views/feeds.py:146 +#: third_party/django-helpdesk/helpdesk/views/feeds.py:146 #, python-format msgid "Open and Reopened Tickets in queue %(queue)s" msgstr "Otevřít a znovu otevřít tickety ve frontě %(queue)s" -#: helpdesk/views/public.py:112 helpdesk/views/public.py:114 -msgid "Invalid ticket ID or e-mail address. Please try again." -msgstr "Špatné ID ticketu nebo e-mailová adresa. Zkuste to znovu prosím." - -#: helpdesk/views/public.py:130 -msgid "Submitter accepted resolution and closed ticket" -msgstr "Zadavatel akceptoval rozřešení a uzavřel ticket" - -#: helpdesk/views/public.py:151 +#: third_party/django-helpdesk/helpdesk/views/public.py:159 msgid "Missing ticket ID or e-mail address. Please try again." msgstr "Chybí ID ticketu nebo e-mailová adresa. Zkuste to znovu prosím." -#: helpdesk/views/staff.py:317 +#: third_party/django-helpdesk/helpdesk/views/public.py:168 +msgid "Invalid ticket ID or e-mail address. Please try again." +msgstr "Špatné ID ticketu nebo e-mailová adresa. Zkuste to znovu prosím." + +#: third_party/django-helpdesk/helpdesk/views/public.py:184 +msgid "Submitter accepted resolution and closed ticket" +msgstr "Zadavatel akceptoval rozřešení a uzavřel ticket" + +#: third_party/django-helpdesk/helpdesk/views/staff.py:306 msgid "Accepted resolution and closed ticket" msgstr "Rozřešení akceptováno a ticket uzavřen." -#: helpdesk/views/staff.py:485 +#: third_party/django-helpdesk/helpdesk/views/staff.py:394 +#, python-format +msgid "" +"When you add somebody on Cc, you must provide either a User or a valid " +"email. Email: %s" +msgstr "" + +#: third_party/django-helpdesk/helpdesk/views/staff.py:528 #, python-format msgid "Assigned to %(username)s" msgstr "Přiřazeno %(username)s" -#: helpdesk/views/staff.py:511 +#: third_party/django-helpdesk/helpdesk/views/staff.py:554 msgid "Updated" msgstr "Aktualizováno" -#: helpdesk/views/staff.py:711 +#: third_party/django-helpdesk/helpdesk/views/staff.py:723 #, python-format msgid "Assigned to %(username)s in bulk update" msgstr "Přiřazeno %(username)s v rámci hromadné aktualizace" -#: helpdesk/views/staff.py:722 +#: third_party/django-helpdesk/helpdesk/views/staff.py:734 msgid "Unassigned in bulk update" msgstr "Vlastník odstraněn v rámci hromadné aktualizace" -#: helpdesk/views/staff.py:731 helpdesk/views/staff.py:741 +#: third_party/django-helpdesk/helpdesk/views/staff.py:743 +#: third_party/django-helpdesk/helpdesk/views/staff.py:753 msgid "Closed in bulk update" msgstr "Uzavřeno v rámci hromadné aktualizace" -#: helpdesk/views/staff.py:963 +#: third_party/django-helpdesk/helpdesk/views/staff.py:907 msgid "" "

Note: Your keyword search is case sensitive because of " "your database. This means the search will not be accurate. " @@ -2749,42 +3022,127 @@ msgstr "" "#sqlite-string-matching\">Dokumentaci k Djangu o vyhledávání textu v SQLite." -#: helpdesk/views/staff.py:1085 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1057 msgid "Ticket taken off hold" msgstr "Ticket znovu aktivní" -#: helpdesk/views/staff.py:1088 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1060 msgid "Ticket placed on hold" msgstr "Ticket pozdržen" -#: helpdesk/views/staff.py:1227 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1185 msgid "User by Priority" msgstr "Uživatelé podle priority" -#: helpdesk/views/staff.py:1233 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1191 msgid "User by Queue" msgstr "Uživatelé podle fronty" -#: helpdesk/views/staff.py:1240 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1198 msgid "User by Status" msgstr "Uživatelé podle stavu" -#: helpdesk/views/staff.py:1246 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1204 msgid "User by Month" msgstr "Uživatel podle měsíce" -#: helpdesk/views/staff.py:1252 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1210 msgid "Queue by Priority" msgstr "Fronta podle priority" -#: helpdesk/views/staff.py:1258 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1216 msgid "Queue by Status" msgstr "Fronta podle stavu" -#: helpdesk/views/staff.py:1264 +#: third_party/django-helpdesk/helpdesk/views/staff.py:1222 msgid "Queue by Month" msgstr "Fronta podle měsíce" +#~ msgid "Helpdesk Summary" +#~ msgstr "Souhrn Helpdesku" + +#~ msgid "Pr" +#~ msgstr "Pr" + +#~ msgid "You are viewing all items in the %(kbcat)s category." +#~ msgstr "Díváte se na všechny položky kategorie %(kbcat)s" + +#~ msgid "" +#~ "View Answer " +#~ msgstr "" +#~ "Prohlédnout Odpověď " + +#~ msgid "Rating" +#~ msgstr "Hodnocení" + +#~ msgid "%(item)s" +#~ msgstr "%(item)s" + +#~ msgid "Did you find this article useful?" +#~ msgstr "Pomohl Vám tento článek?" + +#~ msgid "The results of voting by other readers of this article are below:" +#~ msgstr "Výsledky hlasování dalších čtenářů jsou níže" + +#~ msgid "Recommendations: %(recommendations)s" +#~ msgstr "Doporučení: %(recommendations)s" + +#~ msgid "Votes: %(votes)s" +#~ msgstr "Hlasování: %(votes)s" + +#~ msgid "Overall Rating: %(score)s" +#~ msgstr "Celkové hodnocení: %(score)s" + +#~ msgid "" +#~ "View other %(category_title)s " +#~ "articles, or continue viewing other knowledgebase " +#~ "articles." +#~ msgstr "" +#~ "Prohlédnout další %(category_title)s " +#~ "články, nebo pokračovat v prohlížení dalších článků " +#~ "znalostní báze." + +#~ msgid "Stats" +#~ msgstr "Statistiky" + +#~ msgid "Knowledgebase Categories" +#~ msgstr "Kategorie znalostní báze" + +#~ msgid "All fields are required." +#~ msgstr "Všechny položky jsou vyžadovány." + +#~ msgid "Ticket Summary" +#~ msgstr "Souhrn ticketu" + +#~ msgid "Ignore" +#~ msgstr "Ingorovat" + +#~ msgid "Manage" +#~ msgstr "Spravovat" + +#~ msgid "Subscribe" +#~ msgstr "Přihlásit" + +#~ msgid "Remove Dependency" +#~ msgstr "Odstranit závislost" + +#~ msgid "Add Dependency" +#~ msgstr "Přidat závislost" + +#~ msgid "Change Query" +#~ msgstr "Změnit dotaz" + +#~ msgid "" +#~ "Keywords are case-insensitive, and will be looked for in the title, body " +#~ "and submitter fields." +#~ msgstr "" +#~ "Klíčová slova mohou být napsána velkým i malým písmem. Prohledává se " +#~ "nadpis, tělo ticketu a zadavatel." + +#~ msgid "Save Options" +#~ msgstr "Uložit změny" + #~ msgid "Description of Issue" #~ msgstr "Popis problému" @@ -2862,9 +3220,6 @@ msgstr "Fronta podle měsíce" #~ msgid "Accept" #~ msgstr "Akceptovat" -#~ msgid "Open Tickets" -#~ msgstr "Otevřené tickety" - #~ msgid "Attach another File" #~ msgstr "Přiřadit další soubor" diff --git a/helpdesk/management/commands/escalate_tickets.py b/helpdesk/management/commands/escalate_tickets.py index 122333f0..edbf7307 100644 --- a/helpdesk/management/commands/escalate_tickets.py +++ b/helpdesk/management/commands/escalate_tickets.py @@ -105,7 +105,7 @@ def escalate_tickets(queues, verbose): t.send( {'submitter': ('escalated_submitter', context), 'ticket_cc': ('escalated_cc', context), - 'assigned_to': ('escalated_owner', context)} + 'assigned_to': ('escalated_owner', context)}, fail_silently=True, ) diff --git a/helpdesk/migrations/0027_auto_20200107_1221.py b/helpdesk/migrations/0027_auto_20200107_1221.py new file mode 100644 index 00000000..dbd50149 --- /dev/null +++ b/helpdesk/migrations/0027_auto_20200107_1221.py @@ -0,0 +1,71 @@ +# Generated by Django 2.2.6 on 2020-01-07 12:21 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('helpdesk', '0026_kbitem_attachments'), + ] + + operations = [ + migrations.AddField( + model_name='kbcategory', + name='queue', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='helpdesk.Queue', verbose_name='Default queue when creating a ticket after viewing this category.'), + ), + migrations.AddField( + model_name='kbitem', + name='downvoted_by', + field=models.ManyToManyField(related_name='downvotes', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='ticket', + name='kbitem', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='helpdesk.KBItem', verbose_name='Knowledge base item the user was viewing when they created this ticket.'), + ), + migrations.AlterField( + model_name='followupattachment', + name='filename', + field=models.CharField(blank=True, max_length=1000, verbose_name='Filename'), + ), + migrations.AlterField( + model_name='followupattachment', + name='mime_type', + field=models.CharField(blank=True, max_length=255, verbose_name='MIME Type'), + ), + migrations.AlterField( + model_name='followupattachment', + name='size', + field=models.IntegerField(blank=True, help_text='Size of this file in bytes', verbose_name='Size'), + ), + migrations.AlterField( + model_name='kbiattachment', + name='filename', + field=models.CharField(blank=True, max_length=1000, verbose_name='Filename'), + ), + migrations.AlterField( + model_name='kbiattachment', + name='mime_type', + field=models.CharField(blank=True, max_length=255, verbose_name='MIME Type'), + ), + migrations.AlterField( + model_name='kbiattachment', + name='size', + field=models.IntegerField(blank=True, help_text='Size of this file in bytes', verbose_name='Size'), + ), + migrations.AlterField( + model_name='kbitem', + name='voted_by', + field=models.ManyToManyField(related_name='votes', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='queue', + name='enable_notifications_on_email_events', + field=models.BooleanField(blank=True, default=False, help_text='When an email arrives to either create a ticket or to interact with an existing discussion. Should email notifications be sent ? Note: the new_ticket_cc and updated_ticket_cc work independently of this feature', verbose_name='Notify contacts when email updates arrive'), + ), + ] diff --git a/helpdesk/migrations/0028_kbitem_team.py b/helpdesk/migrations/0028_kbitem_team.py new file mode 100644 index 00000000..7801e585 --- /dev/null +++ b/helpdesk/migrations/0028_kbitem_team.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.9 on 2020-01-27 15:01 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('pinax_teams', '0004_auto_20170511_0856'), + ('helpdesk', '0027_auto_20200107_1221'), + ] + + operations = [ + migrations.AddField( + model_name='kbitem', + name='team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='pinax_teams.Team', verbose_name='Team'), + ), + ] diff --git a/helpdesk/migrations/0029_kbcategory_public.py b/helpdesk/migrations/0029_kbcategory_public.py new file mode 100644 index 00000000..1cca37be --- /dev/null +++ b/helpdesk/migrations/0029_kbcategory_public.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.9 on 2020-01-27 16:00 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0028_kbitem_team'), + ] + + operations = [ + migrations.AddField( + model_name='kbcategory', + name='public', + field=models.BooleanField(default=True, verbose_name='Is KBCategory publicly visible?'), + ), + ] diff --git a/helpdesk/migrations/0030_add_kbcategory_name.py b/helpdesk/migrations/0030_add_kbcategory_name.py new file mode 100644 index 00000000..908fdf17 --- /dev/null +++ b/helpdesk/migrations/0030_add_kbcategory_name.py @@ -0,0 +1,33 @@ +# Generated by Django 2.2.10 on 2020-02-25 11:21 + +from django.db import migrations, models + +def copy_title(apps, schema_editor): + KBCategory = apps.get_model("helpdesk", "KBCategory") + KBCategory.objects.update(name=models.F('title')) + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0029_kbcategory_public'), + ] + + operations = [ + migrations.AddField( + model_name='kbcategory', + name='name', + field=models.CharField(blank=True, max_length=100, null=True, verbose_name='Name of the category'), + ), + migrations.AlterField( + model_name='kbcategory', + name='title', + field=models.CharField(max_length=100, verbose_name='Title on knowledgebase page'), + ), + migrations.RunPython(copy_title, migrations.RunPython.noop), + migrations.AlterField( + model_name='kbcategory', + name='name', + field=models.CharField(blank=False, max_length=100, null=False, verbose_name='Name of the category'), + ), + ] diff --git a/helpdesk/migrations/0031_auto_20200225_1440.py b/helpdesk/migrations/0031_auto_20200225_1440.py new file mode 100644 index 00000000..c287f06f --- /dev/null +++ b/helpdesk/migrations/0031_auto_20200225_1440.py @@ -0,0 +1,22 @@ +# Generated by Django 2.2.10 on 2020-02-25 13:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0030_add_kbcategory_name'), + ] + + operations = [ + migrations.AlterModelOptions( + name='kbitem', + options={'ordering': ('order', 'title'), 'verbose_name': 'Knowledge base item', 'verbose_name_plural': 'Knowledge base items'}, + ), + migrations.AddField( + model_name='kbitem', + name='order', + field=models.PositiveIntegerField(blank=True, null=True, verbose_name='Order'), + ), + ] diff --git a/helpdesk/migrations/0032_kbitem_enabled.py b/helpdesk/migrations/0032_kbitem_enabled.py new file mode 100644 index 00000000..7868bfe1 --- /dev/null +++ b/helpdesk/migrations/0032_kbitem_enabled.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.10 on 2020-02-25 13:44 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('helpdesk', '0031_auto_20200225_1440'), + ] + + operations = [ + migrations.AddField( + model_name='kbitem', + name='enabled', + field=models.BooleanField(default=True, verbose_name='Enabled to display to users'), + ), + ] diff --git a/helpdesk/models.py b/helpdesk/models.py index 339f4c9f..7e4b61c5 100644 --- a/helpdesk/models.py +++ b/helpdesk/models.py @@ -25,6 +25,8 @@ from django.utils.safestring import mark_safe from markdown import markdown from markdown.extensions import Extension +import pinax.teams.models + import uuid @@ -35,9 +37,9 @@ from .templated_email import send_templated_mail def format_time_spent(time_spent): if time_spent: - time_spent = "{0:02d}h:{0:02d}m".format( - int(time_spent.total_seconds() // (3600)), - int((time_spent.total_seconds() % 3600) / 60) + time_spent = "{0:02d}h:{1:02d}m".format( + time_spent.seconds // 3600, + time_spent.seconds // 60 ) else: time_spent = "" @@ -559,6 +561,14 @@ class Ticket(models.Model): default=mk_secret, ) + kbitem = models.ForeignKey( + "KBItem", + blank=True, + null=True, + on_delete=models.CASCADE, + verbose_name=_('Knowledge base item the user was viewing when they created this ticket.'), + ) + @property def time_spent(self): """Return back total time spent on the ticket. This is calculated value @@ -605,6 +615,8 @@ class Ticket(models.Model): if dont_send_to is not None: recipients.update(dont_send_to) + recipients.add(self.queue.email_address) + def should_receive(email): return email and email not in recipients @@ -1203,8 +1215,13 @@ class KBCategory(models.Model): listing of questions & answers. """ + name = models.CharField( + _('Name of the category'), + max_length=100, + ) + title = models.CharField( - _('Title'), + _('Title on knowledgebase page'), max_length=100, ) @@ -1216,8 +1233,21 @@ class KBCategory(models.Model): _('Description'), ) + queue = models.ForeignKey( + Queue, + blank=True, + null=True, + on_delete=models.CASCADE, + verbose_name=_('Default queue when creating a ticket after viewing this category.'), + ) + + public = models.BooleanField( + default=True, + verbose_name=_("Is KBCategory publicly visible?") + ) + def __str__(self): - return '%s' % self.title + return '%s' % self.name class Meta: ordering = ('title',) @@ -1234,7 +1264,14 @@ class KBItem(models.Model): An item within the knowledgebase. Very straightforward question/answer style system. """ - voted_by = models.ManyToManyField(settings.AUTH_USER_MODEL) + voted_by = models.ManyToManyField( + settings.AUTH_USER_MODEL, + related_name='votes', + ) + downvoted_by = models.ManyToManyField( + settings.AUTH_USER_MODEL, + related_name='downvotes', + ) category = models.ForeignKey( KBCategory, on_delete=models.CASCADE, @@ -1272,6 +1309,25 @@ class KBItem(models.Model): blank=True, ) + team = models.ForeignKey( + pinax.teams.models.Team, + on_delete=models.CASCADE, + verbose_name=_('Team'), + blank=True, + null=True, + ) + + order = models.PositiveIntegerField( + _('Order'), + blank=True, + null=True, + ) + + enabled = models.BooleanField( + _('Enabled to display to users'), + default=True, + ) + def save(self, *args, **kwargs): if not self.last_updated: self.last_updated = timezone.now() @@ -1285,16 +1341,26 @@ class KBItem(models.Model): score = property(_score) def __str__(self): - return '%s' % self.title + return '%s: %s' % (self.category.title, self.title) class Meta: - ordering = ('title',) + ordering = ('order', 'title',) verbose_name = _('Knowledge base item') verbose_name_plural = _('Knowledge base items') def get_absolute_url(self): from django.urls import reverse - return reverse('helpdesk:kb_item', args=(self.id,)) + return str(reverse('helpdesk:kb_category', args=(self.category.slug,))) + "?kbitem=" + str(self.pk) + + def query_url(self): + from django.urls import reverse + return str(reverse('helpdesk:list')) + "?kbitem=" + str(self.pk) + + def num_open_tickets(self): + return Ticket.objects.filter(kbitem=self, status__in=(1, 2)).count() + + def unassigned_tickets(self): + return Ticket.objects.filter(kbitem=self, status__in=(1, 2), assigned_to__isnull=True) def get_markdown(self): return get_markdown(self.answer) diff --git a/helpdesk/query.py b/helpdesk/query.py index a2263326..8e42dcf1 100644 --- a/helpdesk/query.py +++ b/helpdesk/query.py @@ -1,12 +1,16 @@ from django.db.models import Q from django.core.cache import cache - -from model_utils import Choices +from django.urls import reverse +from django.utils.translation import ugettext as _ from base64 import b64encode from base64 import b64decode import json +from model_utils import Choices + +from helpdesk.serializers import DatatablesTicketSerializer + def query_to_base64(query): """ @@ -47,110 +51,173 @@ def query_to_dict(results, descriptions): return output -def apply_query(queryset, params): - """ - Apply a dict-based set of filters & parameters to a queryset. +def get_search_filter_args(search): + if search.startswith('queue:'): + return Q(queue__title__icontains=search[len('queue:'):]) + if search.startswith('priority:'): + return Q(priority__icontains=search[len('priority:'):]) + filter = Q() + for subsearch in search.split("OR"): + subsearch = subsearch.strip() + filter = ( + filter | + Q(id__icontains=subsearch) | + Q(title__icontains=subsearch) | + Q(description__icontains=subsearch) | + Q(priority__icontains=subsearch) | + Q(resolution__icontains=subsearch) | + Q(submitter_email__icontains=subsearch) | + Q(assigned_to__email__icontains=subsearch) | + Q(ticketcustomfieldvalue__value__icontains=subsearch) | + Q(created__icontains=subsearch) | + Q(due_date__icontains=subsearch) + ) + return filter - queryset is a Django queryset, eg MyModel.objects.all() or - MyModel.objects.filter(user=request.user) - params is a dictionary that contains the following: - filtering: A dict of Django ORM filters, eg: +DATATABLES_ORDER_COLUMN_CHOICES = Choices( + ('0', 'id'), + ('1', 'title'), + ('2', 'priority'), + ('3', 'queue'), + ('4', 'status'), + ('5', 'created'), + ('6', 'due_date'), + ('7', 'assigned_to'), + ('8', 'submitter_email'), + # ('9', 'time_spent'), + ('10', 'kbitem'), +) + + +def get_query_class(): + from django.conf import settings + + def _get_query_class(): + return __Query__ + return getattr(settings, + 'HELPDESK_QUERY_CLASS', + _get_query_class)() + + +class __Query__: + def __init__(self, huser, base64query=None, query_params=None): + self.huser = huser + self.params = query_params if query_params else query_from_base64(base64query) + self.base64 = base64query if base64query else query_to_base64(query_params) + self.result = None + + def get_search_filter_args(self): + search = self.params.get('search_string', '') + return get_search_filter_args(search) + + def __run__(self, queryset): + """ + Apply a dict-based set of filters & parameters to a queryset. + + queryset is a Django queryset, eg MyModel.objects.all() or + MyModel.objects.filter(user=request.user) + + params is a dictionary that contains the following: + filtering: A dict of Django ORM filters, eg: {'user__id__in': [1, 3, 103], 'title__contains': 'foo'} search_string: A freetext search string sorting: The name of the column to sort by - """ - for key in params['filtering'].keys(): - filter = {key: params['filtering'][key]} - queryset = queryset.filter(**filter) + """ + filter = self.params.get('filtering', {}) + filter_or = self.params.get('filtering_or', {}) + queryset = queryset.filter((Q(**filter) | Q(**filter_or)) & self.get_search_filter_args()) + sorting = self.params.get('sorting', None) + if sorting: + sortreverse = self.params.get('sortreverse', None) + if sortreverse: + sorting = "-%s" % sorting + queryset = queryset.order_by(sorting) + return queryset.distinct() # https://stackoverflow.com/questions/30487056/django-queryset-contains-duplicate-entries - search = params.get('search_string', '') - if search: - qset = ( - Q(title__icontains=search) | - Q(description__icontains=search) | - Q(resolution__icontains=search) | - Q(submitter_email__icontains=search) | - Q(ticketcustomfieldvalue__value__icontains=search) - ) + def get_cache_key(self): + return str(self.huser.user.pk) + ":" + self.base64 - queryset = queryset.filter(qset) + def refresh_query(self): + tickets = self.huser.get_tickets_in_queues().select_related() + ticket_qs = self.__run__(tickets) + cache.set(self.get_cache_key(), ticket_qs, timeout=3600) + return ticket_qs - sorting = params.get('sorting', None) - if sorting: - sortreverse = params.get('sortreverse', None) - if sortreverse: - sorting = "-%s" % sorting - queryset = queryset.order_by(sorting) + def get(self): + # Prefilter the allowed tickets + objects = cache.get(self.get_cache_key()) + if objects is not None: + return objects + return self.refresh_query() - return queryset + def get_datatables_context(self, **kwargs): + """ + This function takes in a list of ticket objects from the views and throws it + to the datatables on ticket_list.html. If a search string was entered, this + function filters existing dataset on search string and returns a filtered + filtered list. The `draw`, `length` etc parameters are for datatables to + display meta data on the table contents. The returning queryset is passed + to a Serializer called DatatablesTicketSerializer in serializers.py. + """ + objects = self.get() + order_by = '-date_created' + draw = int(kwargs.get('draw', [0])[0]) + length = int(kwargs.get('length', [25])[0]) + start = int(kwargs.get('start', [0])[0]) + search_value = kwargs.get('search[value]', [""])[0] + order_column = kwargs.get('order[0][column]', ['5'])[0] + order = kwargs.get('order[0][dir]', ["asc"])[0] + order_column = DATATABLES_ORDER_COLUMN_CHOICES[order_column] + # django orm '-' -> desc + if order == 'desc': + order_column = '-' + order_column -def get_query(query, huser): - # Prefilter the allowed tickets - objects = cache.get(huser.user.email + query) - if objects is not None: - return objects - tickets = huser.get_tickets_in_queues().select_related() - query_params = query_from_base64(query) - ticket_qs = apply_query(tickets, query_params) - cache.set(huser.user.email + query, ticket_qs, timeout=3600) - return ticket_qs + queryset = objects.all().order_by(order_by) + total = queryset.count() + if search_value: # Dead code currently + queryset = queryset.filter(get_search_filter_args(search_value)) -ORDER_COLUMN_CHOICES = Choices( - ('0', 'id'), - ('2', 'priority'), - ('3', 'title'), - ('4', 'queue'), - ('5', 'status'), - ('6', 'created'), - ('7', 'due_date'), - ('8', 'assigned_to') -) + count = queryset.count() + queryset = queryset.order_by(order_column)[start:start + length] + return { + 'data': DatatablesTicketSerializer(queryset, many=True).data, + 'recordsFiltered': count, + 'recordsTotal': total, + 'draw': draw + } + def get_timeline_context(self): + events = [] -def query_tickets_by_args(objects, order_by, **kwargs): - """ - This function takes in a list of ticket objects from the views and throws it - to the datatables on ticket_list.html. If a search string was entered, this - function filters existing dataset on search string and returns a filtered - filtered list. The `draw`, `length` etc parameters are for datatables to - display meta data on the table contents. The returning queryset is passed - to a Serializer called DatatablesTicketSerializer in serializers.py. - """ - draw = int(kwargs.get('draw', None)[0]) - length = int(kwargs.get('length', None)[0]) - start = int(kwargs.get('start', None)[0]) - search_value = kwargs.get('search[value]', None)[0] - order_column = kwargs.get('order[0][column]', None)[0] - order = kwargs.get('order[0][dir]', None)[0] + for ticket in self.get(): + for followup in ticket.followup_set.all(): + event = { + 'start_date': self.mk_timeline_date(followup.date), + 'text': { + 'headline': ticket.title + ' - ' + followup.title, + 'text': (followup.comment if followup.comment else _('No text')) + '
%s' % + (reverse('helpdesk:view', kwargs={'ticket_id': ticket.pk}), _("View ticket")), + }, + 'group': _('Messages'), + } + events.append(event) - order_column = ORDER_COLUMN_CHOICES[order_column] - # django orm '-' -> desc - if order == 'desc': - order_column = '-' + order_column + return { + 'events': events, + } - queryset = objects.all().order_by(order_by) - total = queryset.count() - - if search_value: - queryset = queryset.filter(Q(id__icontains=search_value) | - Q(priority__icontains=search_value) | - Q(title__icontains=search_value) | - Q(queue__title__icontains=search_value) | - Q(status__icontains=search_value) | - Q(created__icontains=search_value) | - Q(due_date__icontains=search_value) | - Q(assigned_to__email__icontains=search_value)) - - count = queryset.count() - queryset = queryset.order_by(order_column)[start:start + length] - return { - 'items': queryset, - 'count': count, - 'total': total, - 'draw': draw - } + def mk_timeline_date(self, date): + return { + 'year': date.year, + 'month': date.month, + 'day': date.day, + 'hour': date.hour, + 'minute': date.minute, + 'second': date.second, + 'second': date.second, + } diff --git a/helpdesk/serializers.py b/helpdesk/serializers.py index c3b311b5..c96f5b86 100644 --- a/helpdesk/serializers.py +++ b/helpdesk/serializers.py @@ -15,19 +15,21 @@ datatables for ticket_list.html. Called from staff.datatables_ticket_list. class DatatablesTicketSerializer(serializers.ModelSerializer): ticket = serializers.SerializerMethodField() assigned_to = serializers.SerializerMethodField() + submitter = serializers.SerializerMethodField() created = serializers.SerializerMethodField() due_date = serializers.SerializerMethodField() status = serializers.SerializerMethodField() row_class = serializers.SerializerMethodField() time_spent = serializers.SerializerMethodField() queue = serializers.SerializerMethodField() + kbitem = serializers.SerializerMethodField() class Meta: model = Ticket # fields = '__all__' fields = ('ticket', 'id', 'priority', 'title', 'queue', 'status', - 'created', 'due_date', 'assigned_to', 'row_class', - 'time_spent') + 'created', 'due_date', 'assigned_to', 'submitter', 'row_class', + 'time_spent', 'kbitem') def get_queue(self, obj): return ({"title": obj.queue.title, "id": obj.queue.id}) @@ -46,15 +48,21 @@ class DatatablesTicketSerializer(serializers.ModelSerializer): def get_assigned_to(self, obj): if obj.assigned_to: - if obj.assigned_to.first_name: - return (obj.assigned_to.first_name) + if obj.assigned_to.get_full_name(): + return (obj.assigned_to.get_full_name()) else: return (obj.assigned_to.email) else: return ("None") + def get_submitter(self, obj): + return obj.submitter_email + def get_time_spent(self, obj): return format_time_spent(obj.time_spent) def get_row_class(self, obj): return (obj.get_priority_css_class) + + def get_kbitem(self, obj): + return obj.kbitem.title if obj.kbitem else "" diff --git a/helpdesk/static/helpdesk/css/sb-admin.css b/helpdesk/static/helpdesk/css/sb-admin.css index f015c714..cad0a66e 100644 --- a/helpdesk/static/helpdesk/css/sb-admin.css +++ b/helpdesk/static/helpdesk/css/sb-admin.css @@ -242,6 +242,10 @@ body.fixed-nav.sidebar-toggled #content-wrapper { overflow-y: auto; } +.card-text { + font-weight: bold; +} + .card-body-icon { position: absolute; z-index: 0; diff --git a/helpdesk/static/helpdesk/vendor/datatables/css/buttons.dataTables.css b/helpdesk/static/helpdesk/vendor/datatables/css/buttons.dataTables.css new file mode 100644 index 00000000..d8e63ed7 --- /dev/null +++ b/helpdesk/static/helpdesk/vendor/datatables/css/buttons.dataTables.css @@ -0,0 +1,380 @@ +@keyframes dtb-spinner { + 100% { + transform: rotate(360deg); + } +} +@-o-keyframes dtb-spinner { + 100% { + -o-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-ms-keyframes dtb-spinner { + 100% { + -ms-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-webkit-keyframes dtb-spinner { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} +@-moz-keyframes dtb-spinner { + 100% { + -moz-transform: rotate(360deg); + transform: rotate(360deg); + } +} +div.dt-button-info { + position: fixed; + top: 50%; + left: 50%; + width: 400px; + margin-top: -100px; + margin-left: -200px; + background-color: white; + border: 2px solid #111; + box-shadow: 3px 3px 8px rgba(0, 0, 0, 0.3); + border-radius: 3px; + text-align: center; + z-index: 21; +} +div.dt-button-info h2 { + padding: 0.5em; + margin: 0; + font-weight: normal; + border-bottom: 1px solid #ddd; + background-color: #f3f3f3; +} +div.dt-button-info > div { + padding: 1em; +} + +div.dt-button-collection-title { + text-align: center; + padding: 0.3em 0 0.5em; + font-size: 0.9em; +} + +div.dt-button-collection-title:empty { + display: none; +} + +button.dt-button, +div.dt-button, +a.dt-button { + position: relative; + display: inline-block; + box-sizing: border-box; + margin-right: 0.333em; + margin-bottom: 0.333em; + padding: 0.5em 1em; + border: 1px solid #999; + border-radius: 2px; + cursor: pointer; + font-size: 0.88em; + line-height: 1.6em; + color: black; + white-space: nowrap; + overflow: hidden; + background-color: #e9e9e9; + /* Fallback */ + background-image: -webkit-linear-gradient(top, white 0%, #e9e9e9 100%); + /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, white 0%, #e9e9e9 100%); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, white 0%, #e9e9e9 100%); + /* IE10 */ + background-image: -o-linear-gradient(top, white 0%, #e9e9e9 100%); + /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, white 0%, #e9e9e9 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='white', EndColorStr='#e9e9e9'); + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + text-decoration: none; + outline: none; + text-overflow: ellipsis; +} +button.dt-button.disabled, +div.dt-button.disabled, +a.dt-button.disabled { + color: #999; + border: 1px solid #d0d0d0; + cursor: default; + background-color: #f9f9f9; + /* Fallback */ + background-image: -webkit-linear-gradient(top, #ffffff 0%, #f9f9f9 100%); + /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #ffffff 0%, #f9f9f9 100%); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #ffffff 0%, #f9f9f9 100%); + /* IE10 */ + background-image: -o-linear-gradient(top, #ffffff 0%, #f9f9f9 100%); + /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #ffffff 0%, #f9f9f9 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#ffffff', EndColorStr='#f9f9f9'); +} +button.dt-button:active:not(.disabled), button.dt-button.active:not(.disabled), +div.dt-button:active:not(.disabled), +div.dt-button.active:not(.disabled), +a.dt-button:active:not(.disabled), +a.dt-button.active:not(.disabled) { + background-color: #e2e2e2; + /* Fallback */ + background-image: -webkit-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%); + /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%); + /* IE10 */ + background-image: -o-linear-gradient(top, #f3f3f3 0%, #e2e2e2 100%); + /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #f3f3f3 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f3f3f3', EndColorStr='#e2e2e2'); + box-shadow: inset 1px 1px 3px #999999; +} +button.dt-button:active:not(.disabled):hover:not(.disabled), button.dt-button.active:not(.disabled):hover:not(.disabled), +div.dt-button:active:not(.disabled):hover:not(.disabled), +div.dt-button.active:not(.disabled):hover:not(.disabled), +a.dt-button:active:not(.disabled):hover:not(.disabled), +a.dt-button.active:not(.disabled):hover:not(.disabled) { + box-shadow: inset 1px 1px 3px #999999; + background-color: #cccccc; + /* Fallback */ + background-image: -webkit-linear-gradient(top, #eaeaea 0%, #cccccc 100%); + /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #eaeaea 0%, #cccccc 100%); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #eaeaea 0%, #cccccc 100%); + /* IE10 */ + background-image: -o-linear-gradient(top, #eaeaea 0%, #cccccc 100%); + /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #eaeaea 0%, #cccccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#eaeaea', EndColorStr='#cccccc'); +} +button.dt-button:hover, +div.dt-button:hover, +a.dt-button:hover { + text-decoration: none; +} +button.dt-button:hover:not(.disabled), +div.dt-button:hover:not(.disabled), +a.dt-button:hover:not(.disabled) { + border: 1px solid #666; + background-color: #e0e0e0; + /* Fallback */ + background-image: -webkit-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%); + /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%); + /* IE10 */ + background-image: -o-linear-gradient(top, #f9f9f9 0%, #e0e0e0 100%); + /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #f9f9f9 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f9f9f9', EndColorStr='#e0e0e0'); +} +button.dt-button:focus:not(.disabled), +div.dt-button:focus:not(.disabled), +a.dt-button:focus:not(.disabled) { + border: 1px solid #426c9e; + text-shadow: 0 1px 0 #c4def1; + outline: none; + background-color: #79ace9; + /* Fallback */ + background-image: -webkit-linear-gradient(top, #bddef4 0%, #79ace9 100%); + /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #bddef4 0%, #79ace9 100%); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #bddef4 0%, #79ace9 100%); + /* IE10 */ + background-image: -o-linear-gradient(top, #bddef4 0%, #79ace9 100%); + /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #bddef4 0%, #79ace9 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#bddef4', EndColorStr='#79ace9'); +} + +.dt-button embed { + outline: none; +} + +div.dt-buttons { + position: relative; + float: left; +} +div.dt-buttons.buttons-right { + float: right; +} + +div.dt-button-collection { + position: absolute; + top: 0; + left: 0; + width: 150px; + margin-top: 3px; + padding: 8px 8px 4px 8px; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.4); + background-color: white; + overflow: hidden; + z-index: 2002; + border-radius: 5px; + box-shadow: 3px 3px 5px rgba(0, 0, 0, 0.3); + box-sizing: border-box; +} +div.dt-button-collection button.dt-button, +div.dt-button-collection div.dt-button, +div.dt-button-collection a.dt-button { + position: relative; + left: 0; + right: 0; + width: 100%; + display: block; + float: none; + margin-bottom: 4px; + margin-right: 0; +} +div.dt-button-collection button.dt-button:active:not(.disabled), div.dt-button-collection button.dt-button.active:not(.disabled), +div.dt-button-collection div.dt-button:active:not(.disabled), +div.dt-button-collection div.dt-button.active:not(.disabled), +div.dt-button-collection a.dt-button:active:not(.disabled), +div.dt-button-collection a.dt-button.active:not(.disabled) { + background-color: #dadada; + /* Fallback */ + background-image: -webkit-linear-gradient(top, #f0f0f0 0%, #dadada 100%); + /* Chrome 10+, Saf5.1+, iOS 5+ */ + background-image: -moz-linear-gradient(top, #f0f0f0 0%, #dadada 100%); + /* FF3.6 */ + background-image: -ms-linear-gradient(top, #f0f0f0 0%, #dadada 100%); + /* IE10 */ + background-image: -o-linear-gradient(top, #f0f0f0 0%, #dadada 100%); + /* Opera 11.10+ */ + background-image: linear-gradient(to bottom, #f0f0f0 0%, #dadada 100%); + filter: progid:DXImageTransform.Microsoft.gradient(GradientType=0,StartColorStr='#f0f0f0', EndColorStr='#dadada'); + box-shadow: inset 1px 1px 3px #666; +} +div.dt-button-collection.fixed { + position: fixed; + top: 50%; + left: 50%; + margin-left: -75px; + border-radius: 0; +} +div.dt-button-collection.fixed.two-column { + margin-left: -200px; +} +div.dt-button-collection.fixed.three-column { + margin-left: -225px; +} +div.dt-button-collection.fixed.four-column { + margin-left: -300px; +} +div.dt-button-collection > :last-child { + display: block !important; + -webkit-column-gap: 8px; + -moz-column-gap: 8px; + -ms-column-gap: 8px; + -o-column-gap: 8px; + column-gap: 8px; +} +div.dt-button-collection > :last-child > * { + -webkit-column-break-inside: avoid; + break-inside: avoid; +} +div.dt-button-collection.two-column { + width: 400px; +} +div.dt-button-collection.two-column > :last-child { + padding-bottom: 1px; + -webkit-column-count: 2; + -moz-column-count: 2; + -ms-column-count: 2; + -o-column-count: 2; + column-count: 2; +} +div.dt-button-collection.three-column { + width: 450px; +} +div.dt-button-collection.three-column > :last-child { + padding-bottom: 1px; + -webkit-column-count: 3; + -moz-column-count: 3; + -ms-column-count: 3; + -o-column-count: 3; + column-count: 3; +} +div.dt-button-collection.four-column { + width: 600px; +} +div.dt-button-collection.four-column > :last-child { + padding-bottom: 1px; + -webkit-column-count: 4; + -moz-column-count: 4; + -ms-column-count: 4; + -o-column-count: 4; + column-count: 4; +} +div.dt-button-collection .dt-button { + border-radius: 0; +} + +div.dt-button-background { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: rgba(0, 0, 0, 0.7); + /* Fallback */ + background: -ms-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); + /* IE10 Consumer Preview */ + background: -moz-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); + /* Firefox */ + background: -o-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); + /* Opera */ + background: -webkit-gradient(radial, center center, 0, center center, 497, color-stop(0, rgba(0, 0, 0, 0.3)), color-stop(1, rgba(0, 0, 0, 0.7))); + /* Webkit (Safari/Chrome 10) */ + background: -webkit-radial-gradient(center, ellipse farthest-corner, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); + /* Webkit (Chrome 11+) */ + background: radial-gradient(ellipse farthest-corner at center, rgba(0, 0, 0, 0.3) 0%, rgba(0, 0, 0, 0.7) 100%); + /* W3C Markup, IE10 Release Preview */ + z-index: 2001; +} + +@media screen and (max-width: 640px) { + div.dt-buttons { + float: none !important; + text-align: center; + } +} +button.dt-button.processing, +div.dt-button.processing, +a.dt-button.processing { + color: rgba(0, 0, 0, 0.2); +} +button.dt-button.processing:after, +div.dt-button.processing:after, +a.dt-button.processing:after { + position: absolute; + top: 50%; + left: 50%; + width: 16px; + height: 16px; + margin: -8px 0 0 -8px; + box-sizing: border-box; + display: block; + content: ' '; + border: 2px solid #282828; + border-radius: 50%; + border-left-color: transparent; + border-right-color: transparent; + animation: dtb-spinner 1500ms infinite linear; + -o-animation: dtb-spinner 1500ms infinite linear; + -ms-animation: dtb-spinner 1500ms infinite linear; + -webkit-animation: dtb-spinner 1500ms infinite linear; + -moz-animation: dtb-spinner 1500ms infinite linear; +} diff --git a/helpdesk/static/helpdesk/vendor/datatables/js/buttons.colVis.js b/helpdesk/static/helpdesk/vendor/datatables/js/buttons.colVis.js new file mode 100644 index 00000000..b9529d29 --- /dev/null +++ b/helpdesk/static/helpdesk/vendor/datatables/js/buttons.colVis.js @@ -0,0 +1,206 @@ +/*! + * Column visibility buttons for Buttons and DataTables. + * 2016 SpryMedia Ltd - datatables.net/license + */ + +(function( factory ){ + if ( typeof define === 'function' && define.amd ) { + // AMD + define( ['jquery', 'datatables.net', 'datatables.net-buttons'], function ( $ ) { + return factory( $, window, document ); + } ); + } + else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = function (root, $) { + if ( ! root ) { + root = window; + } + + if ( ! $ || ! $.fn.dataTable ) { + $ = require('datatables.net')(root, $).$; + } + + if ( ! $.fn.dataTable.Buttons ) { + require('datatables.net-buttons')(root, $); + } + + return factory( $, root, root.document ); + }; + } + else { + // Browser + factory( jQuery, window, document ); + } +}(function( $, window, document, undefined ) { +'use strict'; +var DataTable = $.fn.dataTable; + + +$.extend( DataTable.ext.buttons, { + // A collection of column visibility buttons + colvis: function ( dt, conf ) { + return { + extend: 'collection', + text: function ( dt ) { + return dt.i18n( 'buttons.colvis', 'Column visibility' ); + }, + className: 'buttons-colvis', + buttons: [ { + extend: 'columnsToggle', + columns: conf.columns, + columnText: conf.columnText + } ] + }; + }, + + // Selected columns with individual buttons - toggle column visibility + columnsToggle: function ( dt, conf ) { + var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) { + return { + extend: 'columnToggle', + columns: idx, + columnText: conf.columnText + }; + } ).toArray(); + + return columns; + }, + + // Single button to toggle column visibility + columnToggle: function ( dt, conf ) { + return { + extend: 'columnVisibility', + columns: conf.columns, + columnText: conf.columnText + }; + }, + + // Selected columns with individual buttons - set column visibility + columnsVisibility: function ( dt, conf ) { + var columns = dt.columns( conf.columns ).indexes().map( function ( idx ) { + return { + extend: 'columnVisibility', + columns: idx, + visibility: conf.visibility, + columnText: conf.columnText + }; + } ).toArray(); + + return columns; + }, + + // Single button to set column visibility + columnVisibility: { + columns: undefined, // column selector + text: function ( dt, button, conf ) { + return conf._columnText( dt, conf ); + }, + className: 'buttons-columnVisibility', + action: function ( e, dt, button, conf ) { + var col = dt.columns( conf.columns ); + var curr = col.visible(); + + col.visible( conf.visibility !== undefined ? + conf.visibility : + ! (curr.length ? curr[0] : false ) + ); + }, + init: function ( dt, button, conf ) { + var that = this; + button.attr( 'data-cv-idx', conf.columns ); + + dt + .on( 'column-visibility.dt'+conf.namespace, function (e, settings) { + if ( ! settings.bDestroying && settings.nTable == dt.settings()[0].nTable ) { + that.active( dt.column( conf.columns ).visible() ); + } + } ) + .on( 'column-reorder.dt'+conf.namespace, function (e, settings, details) { + if ( dt.columns( conf.columns ).count() !== 1 ) { + return; + } + + // This button controls the same column index but the text for the column has + // changed + button.text( conf._columnText( dt, conf ) ); + + // Since its a different column, we need to check its visibility + that.active( dt.column( conf.columns ).visible() ); + } ); + + this.active( dt.column( conf.columns ).visible() ); + }, + destroy: function ( dt, button, conf ) { + dt + .off( 'column-visibility.dt'+conf.namespace ) + .off( 'column-reorder.dt'+conf.namespace ); + }, + + _columnText: function ( dt, conf ) { + // Use DataTables' internal data structure until this is presented + // is a public API. The other option is to use + // `$( column(col).node() ).text()` but the node might not have been + // populated when Buttons is constructed. + var idx = dt.column( conf.columns ).index(); + var title = dt.settings()[0].aoColumns[ idx ].sTitle + .replace(/\n/g," ") // remove new lines + .replace(//gi, " ") // replace line breaks with spaces + .replace(//g, "") // remove select tags, including options text + .replace(//g, "") // strip HTML comments + .replace(/<.*?>/g, "") // strip HTML + .replace(/^\s+|\s+$/g,""); // trim + + return conf.columnText ? + conf.columnText( dt, idx, title ) : + title; + } + }, + + + colvisRestore: { + className: 'buttons-colvisRestore', + + text: function ( dt ) { + return dt.i18n( 'buttons.colvisRestore', 'Restore visibility' ); + }, + + init: function ( dt, button, conf ) { + conf._visOriginal = dt.columns().indexes().map( function ( idx ) { + return dt.column( idx ).visible(); + } ).toArray(); + }, + + action: function ( e, dt, button, conf ) { + dt.columns().every( function ( i ) { + // Take into account that ColReorder might have disrupted our + // indexes + var idx = dt.colReorder && dt.colReorder.transpose ? + dt.colReorder.transpose( i, 'toOriginal' ) : + i; + + this.visible( conf._visOriginal[ idx ] ); + } ); + } + }, + + + colvisGroup: { + className: 'buttons-colvisGroup', + + action: function ( e, dt, button, conf ) { + dt.columns( conf.show ).visible( true, false ); + dt.columns( conf.hide ).visible( false, false ); + + dt.columns.adjust(); + }, + + show: [], + + hide: [] + } +} ); + + +return DataTable.Buttons; +})); diff --git a/helpdesk/static/helpdesk/vendor/datatables/js/dataTables.buttons.js b/helpdesk/static/helpdesk/vendor/datatables/js/dataTables.buttons.js new file mode 100644 index 00000000..045bb8ce --- /dev/null +++ b/helpdesk/static/helpdesk/vendor/datatables/js/dataTables.buttons.js @@ -0,0 +1,2015 @@ +/*! Buttons for DataTables 1.6.1 + * ©2016-2019 SpryMedia Ltd - datatables.net/license + */ + +(function( factory ){ + if ( typeof define === 'function' && define.amd ) { + // AMD + define( ['jquery', 'datatables.net'], function ( $ ) { + return factory( $, window, document ); + } ); + } + else if ( typeof exports === 'object' ) { + // CommonJS + module.exports = function (root, $) { + if ( ! root ) { + root = window; + } + + if ( ! $ || ! $.fn.dataTable ) { + $ = require('datatables.net')(root, $).$; + } + + return factory( $, root, root.document ); + }; + } + else { + // Browser + factory( jQuery, window, document ); + } +}(function( $, window, document, undefined ) { +'use strict'; +var DataTable = $.fn.dataTable; + + +// Used for namespacing events added to the document by each instance, so they +// can be removed on destroy +var _instCounter = 0; + +// Button namespacing counter for namespacing events on individual buttons +var _buttonCounter = 0; + +var _dtButtons = DataTable.ext.buttons; + +/** + * [Buttons description] + * @param {[type]} + * @param {[type]} + */ +var Buttons = function( dt, config ) +{ + // If not created with a `new` keyword then we return a wrapper function that + // will take the settings object for a DT. This allows easy use of new instances + // with the `layout` option - e.g. `topLeft: $.fn.dataTable.Buttons( ... )`. + if ( !(this instanceof Buttons) ) { + return function (settings) { + return new Buttons( settings, dt ).container(); + }; + } + + // If there is no config set it to an empty object + if ( typeof( config ) === 'undefined' ) { + config = {}; + } + + // Allow a boolean true for defaults + if ( config === true ) { + config = {}; + } + + // For easy configuration of buttons an array can be given + if ( $.isArray( config ) ) { + config = { buttons: config }; + } + + this.c = $.extend( true, {}, Buttons.defaults, config ); + + // Don't want a deep copy for the buttons + if ( config.buttons ) { + this.c.buttons = config.buttons; + } + + this.s = { + dt: new DataTable.Api( dt ), + buttons: [], + listenKeys: '', + namespace: 'dtb'+(_instCounter++) + }; + + this.dom = { + container: $('<'+this.c.dom.container.tag+'/>') + .addClass( this.c.dom.container.className ) + }; + + this._constructor(); +}; + + +$.extend( Buttons.prototype, { + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Public methods + */ + + /** + * Get the action of a button + * @param {int|string} Button index + * @return {function} + *//** + * Set the action of a button + * @param {node} node Button element + * @param {function} action Function to set + * @return {Buttons} Self for chaining + */ + action: function ( node, action ) + { + var button = this._nodeToButton( node ); + + if ( action === undefined ) { + return button.conf.action; + } + + button.conf.action = action; + + return this; + }, + + /** + * Add an active class to the button to make to look active or get current + * active state. + * @param {node} node Button element + * @param {boolean} [flag] Enable / disable flag + * @return {Buttons} Self for chaining or boolean for getter + */ + active: function ( node, flag ) { + var button = this._nodeToButton( node ); + var klass = this.c.dom.button.active; + var jqNode = $(button.node); + + if ( flag === undefined ) { + return jqNode.hasClass( klass ); + } + + jqNode.toggleClass( klass, flag === undefined ? true : flag ); + + return this; + }, + + /** + * Add a new button + * @param {object} config Button configuration object, base string name or function + * @param {int|string} [idx] Button index for where to insert the button + * @return {Buttons} Self for chaining + */ + add: function ( config, idx ) + { + var buttons = this.s.buttons; + + if ( typeof idx === 'string' ) { + var split = idx.split('-'); + var base = this.s; + + for ( var i=0, ien=split.length-1 ; i=0 ; i-- ) { + this.remove( button.buttons[i].node ); + } + } + + // Allow the button to remove event handlers, etc + if ( button.conf.destroy ) { + button.conf.destroy.call( dt.button(node), dt, $(node), button.conf ); + } + + this._removeKey( button.conf ); + + $(button.node).remove(); + + var idx = $.inArray( button, host ); + host.splice( idx, 1 ); + + return this; + }, + + /** + * Get the text for a button + * @param {int|string} node Button index + * @return {string} Button text + *//** + * Set the text for a button + * @param {int|string|function} node Button index + * @param {string} label Text + * @return {Buttons} Self for chaining + */ + text: function ( node, label ) + { + var button = this._nodeToButton( node ); + var buttonLiner = this.c.dom.collection.buttonLiner; + var linerTag = button.inCollection && buttonLiner && buttonLiner.tag ? + buttonLiner.tag : + this.c.dom.buttonLiner.tag; + var dt = this.s.dt; + var jqNode = $(button.node); + var text = function ( opt ) { + return typeof opt === 'function' ? + opt( dt, jqNode, button.conf ) : + opt; + }; + + if ( label === undefined ) { + return text( button.conf.text ); + } + + button.conf.text = label; + + if ( linerTag ) { + jqNode.children( linerTag ).html( text(label) ); + } + else { + jqNode.html( text(label) ); + } + + return this; + }, + + + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Constructor + */ + + /** + * Buttons constructor + * @private + */ + _constructor: function () + { + var that = this; + var dt = this.s.dt; + var dtSettings = dt.settings()[0]; + var buttons = this.c.buttons; + + if ( ! dtSettings._buttons ) { + dtSettings._buttons = []; + } + + dtSettings._buttons.push( { + inst: this, + name: this.c.name + } ); + + for ( var i=0, ien=buttons.length ; i'); + + built.conf._collection = built.collection; + + this._expandButton( built.buttons, built.conf.buttons, true, attachPoint ); + } + + // init call is made here, rather than buildButton as it needs to + // be selectable, and for that it needs to be in the buttons array + if ( conf.init ) { + conf.init.call( dt.button( built.node ), dt, $(built.node), conf ); + } + + buttonCounter++; + } + }, + + /** + * Create an individual button + * @param {object} config Resolved button configuration + * @param {boolean} inCollection `true` if a collection button + * @return {jQuery} Created button node (jQuery) + * @private + */ + _buildButton: function ( config, inCollection ) + { + var buttonDom = this.c.dom.button; + var linerDom = this.c.dom.buttonLiner; + var collectionDom = this.c.dom.collection; + var dt = this.s.dt; + var text = function ( opt ) { + return typeof opt === 'function' ? + opt( dt, button, config ) : + opt; + }; + + if ( inCollection && collectionDom.button ) { + buttonDom = collectionDom.button; + } + + if ( inCollection && collectionDom.buttonLiner ) { + linerDom = collectionDom.buttonLiner; + } + + // Make sure that the button is available based on whatever requirements + // it has. For example, Flash buttons require Flash + if ( config.available && ! config.available( dt, config ) ) { + return false; + } + + var action = function ( e, dt, button, config ) { + config.action.call( dt.button( button ), e, dt, button, config ); + + $(dt.table().node()).triggerHandler( 'buttons-action.dt', [ + dt.button( button ), dt, button, config + ] ); + }; + + var tag = config.tag || buttonDom.tag; + var clickBlurs = config.clickBlurs === undefined ? true : config.clickBlurs + var button = $('<'+tag+'/>') + .addClass( buttonDom.className ) + .attr( 'tabindex', this.s.dt.settings()[0].iTabIndex ) + .attr( 'aria-controls', this.s.dt.table().node().id ) + .on( 'click.dtb', function (e) { + e.preventDefault(); + + if ( ! button.hasClass( buttonDom.disabled ) && config.action ) { + action( e, dt, button, config ); + } + if( clickBlurs ) { + button.blur(); + } + } ) + .on( 'keyup.dtb', function (e) { + if ( e.keyCode === 13 ) { + if ( ! button.hasClass( buttonDom.disabled ) && config.action ) { + action( e, dt, button, config ); + } + } + } ); + + // Make `a` tags act like a link + if ( tag.toLowerCase() === 'a' ) { + button.attr( 'href', '#' ); + } + + // Button tags should have `type=button` so they don't have any default behaviour + if ( tag.toLowerCase() === 'button' ) { + button.attr( 'type', 'button' ); + } + + if ( linerDom.tag ) { + var liner = $('<'+linerDom.tag+'/>') + .html( text( config.text ) ) + .addClass( linerDom.className ); + + if ( linerDom.tag.toLowerCase() === 'a' ) { + liner.attr( 'href', '#' ); + } + + button.append( liner ); + } + else { + button.html( text( config.text ) ); + } + + if ( config.enabled === false ) { + button.addClass( buttonDom.disabled ); + } + + if ( config.className ) { + button.addClass( config.className ); + } + + if ( config.titleAttr ) { + button.attr( 'title', text( config.titleAttr ) ); + } + + if ( config.attr ) { + button.attr( config.attr ); + } + + if ( ! config.namespace ) { + config.namespace = '.dt-button-'+(_buttonCounter++); + } + + var buttonContainer = this.c.dom.buttonContainer; + var inserter; + if ( buttonContainer && buttonContainer.tag ) { + inserter = $('<'+buttonContainer.tag+'/>') + .addClass( buttonContainer.className ) + .append( button ); + } + else { + inserter = button; + } + + this._addKey( config ); + + // Style integration callback for DOM manipulation + // Note that this is _not_ documented. It is currently + // for style integration only + if( this.c.buttonCreated ) { + inserter = this.c.buttonCreated( config, inserter ); + } + + return { + conf: config, + node: button.get(0), + inserter: inserter, + buttons: [], + inCollection: inCollection, + collection: null + }; + }, + + /** + * Get the button object from a node (recursive) + * @param {node} node Button node + * @param {array} [buttons] Button array, uses base if not defined + * @return {object} Button object + * @private + */ + _nodeToButton: function ( node, buttons ) + { + if ( ! buttons ) { + buttons = this.s.buttons; + } + + for ( var i=0, ien=buttons.length ; i 30 ) { + // Protect against misconfiguration killing the browser + throw 'Buttons: Too many iterations'; + } + } + + return $.isArray( base ) ? + base : + $.extend( {}, base ); + }; + + conf = toConfObject( conf ); + + while ( conf && conf.extend ) { + // Use `toConfObject` in case the button definition being extended + // is itself a string or a function + if ( ! _dtButtons[ conf.extend ] ) { + throw 'Cannot extend unknown button type: '+conf.extend; + } + + var objArray = toConfObject( _dtButtons[ conf.extend ] ); + if ( $.isArray( objArray ) ) { + return objArray; + } + else if ( ! objArray ) { + // This is a little brutal as it might be possible to have a + // valid button without the extend, but if there is no extend + // then the host button would be acting in an undefined state + return false; + } + + // Stash the current class name + var originalClassName = objArray.className; + + conf = $.extend( {}, objArray, conf ); + + // The extend will have overwritten the original class name if the + // `conf` object also assigned a class, but we want to concatenate + // them so they are list that is combined from all extended buttons + if ( originalClassName && conf.className !== originalClassName ) { + conf.className = originalClassName+' '+conf.className; + } + + // Buttons to be added to a collection -gives the ability to define + // if buttons should be added to the start or end of a collection + var postfixButtons = conf.postfixButtons; + if ( postfixButtons ) { + if ( ! conf.buttons ) { + conf.buttons = []; + } + + for ( i=0, ien=postfixButtons.length ; i') + .addClass('dt-button-collection') + .addClass(options.collectionLayout) + .css('display', 'none'); + + content = $(content) + .addClass(options.contentClassName) + .attr('role', 'menu') + .appendTo(display); + + hostNode.attr( 'aria-expanded', 'true' ); + + if ( hostNode.parents('body')[0] !== document.body ) { + hostNode = document.body.lastChild; + } + + if ( options.collectionTitle ) { + display.prepend('

'+options.collectionTitle+'
'); + } + + display + .insertAfter( hostNode ) + .fadeIn( options.fade ); + + var tableContainer = $( hostButton.table().container() ); + var position = display.css( 'position' ); + + if ( options.align === 'dt-container' ) { + hostNode = hostNode.parent(); + display.css('width', tableContainer.width()); + } + + if ( position === 'absolute' ) { + var hostPosition = hostNode.position(); + + display.css( { + top: hostPosition.top + hostNode.outerHeight(), + left: hostPosition.left + } ); + + // calculate overflow when positioned beneath + var collectionHeight = display.outerHeight(); + var collectionWidth = display.outerWidth(); + var tableBottom = tableContainer.offset().top + tableContainer.height(); + var listBottom = hostPosition.top + hostNode.outerHeight() + collectionHeight; + var bottomOverflow = listBottom - tableBottom; + + // calculate overflow when positioned above + var listTop = hostPosition.top - collectionHeight; + var tableTop = tableContainer.offset().top; + var topOverflow = tableTop - listTop; + + // if bottom overflow is larger, move to the top because it fits better, or if dropup is requested + var moveTop = hostPosition.top - collectionHeight - 5; + if ( (bottomOverflow > topOverflow || options.dropup) && -moveTop < tableTop ) { + display.css( 'top', moveTop); + } + + // Right alignment is enabled on a class, e.g. bootstrap: + // $.fn.dataTable.Buttons.defaults.dom.collection.className += " dropdown-menu-right"; + if ( display.hasClass( options.rightAlignClassName ) || options.align === 'button-right' ) { + display.css( 'left', hostPosition.left + hostNode.outerWidth() - collectionWidth ); + } + + // Right alignment in table container + var listRight = hostPosition.left + collectionWidth; + var tableRight = tableContainer.offset().left + tableContainer.width(); + if ( listRight > tableRight ) { + display.css( 'left', hostPosition.left - ( listRight - tableRight ) ); + } + + // Right alignment to window + var listOffsetRight = hostNode.offset().left + collectionWidth; + if ( listOffsetRight > $(window).width() ) { + display.css( 'left', hostPosition.left - (listOffsetRight-$(window).width()) ); + } + } + else { + // Fix position - centre on screen + var top = display.height() / 2; + if ( top > $(window).height() / 2 ) { + top = $(window).height() / 2; + } + + display.css( 'marginTop', top*-1 ); + } + + if ( options.background ) { + Buttons.background( true, options.backgroundClassName, options.fade, hostNode ); + } + + // This is bonkers, but if we don't have a click listener on the + // background element, iOS Safari will ignore the body click + // listener below. An empty function here is all that is + // required to make it work... + $('div.dt-button-background').on( 'click.dtb-collection', function () {} ); + + $('body') + .on( 'click.dtb-collection', function (e) { + // andSelf is deprecated in jQ1.8, but we want 1.7 compat + var back = $.fn.addBack ? 'addBack' : 'andSelf'; + + if ( ! $(e.target).parents()[back]().filter( content ).length ) { + close(); + } + } ) + .on( 'keyup.dtb-collection', function (e) { + if ( e.keyCode === 27 ) { + close(); + } + } ); + + if ( options.autoClose ) { + setTimeout( function () { + dt.on( 'buttons-action.b-internal', function (e, btn, dt, node) { + if ( node[0] === hostNode[0] ) { + return; + } + close(); + } ); + }, 0); + } + } +} ); + + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * Statics + */ + +/** + * Show / hide a background layer behind a collection + * @param {boolean} Flag to indicate if the background should be shown or + * hidden + * @param {string} Class to assign to the background + * @static + */ +Buttons.background = function ( show, className, fade, insertPoint ) { + if ( fade === undefined ) { + fade = 400; + } + if ( ! insertPoint ) { + insertPoint = document.body; + } + + if ( show ) { + $('
') + .addClass( className ) + .css( 'display', 'none' ) + .insertAfter( insertPoint ) + .stop() + .fadeIn( fade ); + } + else { + $('div.'+className) + .stop() + .fadeOut( fade, function () { + $(this) + .removeClass( className ) + .remove(); + } ); + } +}; + +/** + * Instance selector - select Buttons instances based on an instance selector + * value from the buttons assigned to a DataTable. This is only useful if + * multiple instances are attached to a DataTable. + * @param {string|int|array} Instance selector - see `instance-selector` + * documentation on the DataTables site + * @param {array} Button instance array that was attached to the DataTables + * settings object + * @return {array} Buttons instances + * @static + */ +Buttons.instanceSelector = function ( group, buttons ) +{ + if ( group === undefined || group === null ) { + return $.map( buttons, function ( v ) { + return v.inst; + } ); + } + + var ret = []; + var names = $.map( buttons, function ( v ) { + return v.name; + } ); + + // Flatten the group selector into an array of single options + var process = function ( input ) { + if ( $.isArray( input ) ) { + for ( var i=0, ien=input.length ; i` in IE - it has to be `` + tag: 'ActiveXObject' in window ? + 'a' : + 'button', + className: 'dt-button', + active: 'active', + disabled: 'disabled' + }, + buttonLiner: { + tag: 'span', + className: '' + } + } +}; + +/** + * Version information + * @type {string} + * @static + */ +Buttons.version = '1.6.1'; + + +$.extend( _dtButtons, { + collection: { + text: function ( dt ) { + return dt.i18n( 'buttons.collection', 'Collection' ); + }, + className: 'buttons-collection', + init: function ( dt, button, config ) { + button.attr( 'aria-expanded', false ); + }, + action: function ( e, dt, button, config ) { + e.stopPropagation(); + + if ( config._collection.parents('body').length ) { + this.popover(false, config); + } + else { + this.popover(config._collection, config); + } + }, + attr: { + 'aria-haspopup': true + } + // Also the popover options, defined in Buttons.popover + }, + copy: function ( dt, conf ) { + if ( _dtButtons.copyHtml5 ) { + return 'copyHtml5'; + } + if ( _dtButtons.copyFlash && _dtButtons.copyFlash.available( dt, conf ) ) { + return 'copyFlash'; + } + }, + csv: function ( dt, conf ) { + // Common option that will use the HTML5 or Flash export buttons + if ( _dtButtons.csvHtml5 && _dtButtons.csvHtml5.available( dt, conf ) ) { + return 'csvHtml5'; + } + if ( _dtButtons.csvFlash && _dtButtons.csvFlash.available( dt, conf ) ) { + return 'csvFlash'; + } + }, + excel: function ( dt, conf ) { + // Common option that will use the HTML5 or Flash export buttons + if ( _dtButtons.excelHtml5 && _dtButtons.excelHtml5.available( dt, conf ) ) { + return 'excelHtml5'; + } + if ( _dtButtons.excelFlash && _dtButtons.excelFlash.available( dt, conf ) ) { + return 'excelFlash'; + } + }, + pdf: function ( dt, conf ) { + // Common option that will use the HTML5 or Flash export buttons + if ( _dtButtons.pdfHtml5 && _dtButtons.pdfHtml5.available( dt, conf ) ) { + return 'pdfHtml5'; + } + if ( _dtButtons.pdfFlash && _dtButtons.pdfFlash.available( dt, conf ) ) { + return 'pdfFlash'; + } + }, + pageLength: function ( dt ) { + var lengthMenu = dt.settings()[0].aLengthMenu; + var vals = $.isArray( lengthMenu[0] ) ? lengthMenu[0] : lengthMenu; + var lang = $.isArray( lengthMenu[0] ) ? lengthMenu[1] : lengthMenu; + var text = function ( dt ) { + return dt.i18n( 'buttons.pageLength', { + "-1": 'Show all rows', + _: 'Show %d rows' + }, dt.page.len() ); + }; + + return { + extend: 'collection', + text: text, + className: 'buttons-page-length', + autoClose: true, + buttons: $.map( vals, function ( val, i ) { + return { + text: lang[i], + className: 'button-page-length', + action: function ( e, dt ) { + dt.page.len( val ).draw(); + }, + init: function ( dt, node, conf ) { + var that = this; + var fn = function () { + that.active( dt.page.len() === val ); + }; + + dt.on( 'length.dt'+conf.namespace, fn ); + fn(); + }, + destroy: function ( dt, node, conf ) { + dt.off( 'length.dt'+conf.namespace ); + } + }; + } ), + init: function ( dt, node, conf ) { + var that = this; + dt.on( 'length.dt'+conf.namespace, function () { + that.text( conf.text ); + } ); + }, + destroy: function ( dt, node, conf ) { + dt.off( 'length.dt'+conf.namespace ); + } + }; + } +} ); + + +/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * + * DataTables API + * + * For complete documentation, please refer to the docs/api directory or the + * DataTables site + */ + +// Buttons group and individual button selector +DataTable.Api.register( 'buttons()', function ( group, selector ) { + // Argument shifting + if ( selector === undefined ) { + selector = group; + group = undefined; + } + + this.selector.buttonGroup = group; + + var res = this.iterator( true, 'table', function ( ctx ) { + if ( ctx._buttons ) { + return Buttons.buttonSelector( + Buttons.instanceSelector( group, ctx._buttons ), + selector + ); + } + }, true ); + + res._groupSelector = group; + return res; +} ); + +// Individual button selector +DataTable.Api.register( 'button()', function ( group, selector ) { + // just run buttons() and truncate + var buttons = this.buttons( group, selector ); + + if ( buttons.length > 1 ) { + buttons.splice( 1, buttons.length ); + } + + return buttons; +} ); + +// Active buttons +DataTable.Api.registerPlural( 'buttons().active()', 'button().active()', function ( flag ) { + if ( flag === undefined ) { + return this.map( function ( set ) { + return set.inst.active( set.node ); + } ); + } + + return this.each( function ( set ) { + set.inst.active( set.node, flag ); + } ); +} ); + +// Get / set button action +DataTable.Api.registerPlural( 'buttons().action()', 'button().action()', function ( action ) { + if ( action === undefined ) { + return this.map( function ( set ) { + return set.inst.action( set.node ); + } ); + } + + return this.each( function ( set ) { + set.inst.action( set.node, action ); + } ); +} ); + +// Enable / disable buttons +DataTable.Api.register( ['buttons().enable()', 'button().enable()'], function ( flag ) { + return this.each( function ( set ) { + set.inst.enable( set.node, flag ); + } ); +} ); + +// Disable buttons +DataTable.Api.register( ['buttons().disable()', 'button().disable()'], function () { + return this.each( function ( set ) { + set.inst.disable( set.node ); + } ); +} ); + +// Get button nodes +DataTable.Api.registerPlural( 'buttons().nodes()', 'button().node()', function () { + var jq = $(); + + // jQuery will automatically reduce duplicates to a single entry + $( this.each( function ( set ) { + jq = jq.add( set.inst.node( set.node ) ); + } ) ); + + return jq; +} ); + +// Get / set button processing state +DataTable.Api.registerPlural( 'buttons().processing()', 'button().processing()', function ( flag ) { + if ( flag === undefined ) { + return this.map( function ( set ) { + return set.inst.processing( set.node ); + } ); + } + + return this.each( function ( set ) { + set.inst.processing( set.node, flag ); + } ); +} ); + +// Get / set button text (i.e. the button labels) +DataTable.Api.registerPlural( 'buttons().text()', 'button().text()', function ( label ) { + if ( label === undefined ) { + return this.map( function ( set ) { + return set.inst.text( set.node ); + } ); + } + + return this.each( function ( set ) { + set.inst.text( set.node, label ); + } ); +} ); + +// Trigger a button's action +DataTable.Api.registerPlural( 'buttons().trigger()', 'button().trigger()', function () { + return this.each( function ( set ) { + set.inst.node( set.node ).trigger( 'click' ); + } ); +} ); + +// Button resolver to the popover +DataTable.Api.register( 'button().popover()', function (content, options) { + return this.map( function ( set ) { + return set.inst._popover( content, this.button(this[0].node), options ); + } ); +} ); + +// Get the container elements +DataTable.Api.register( 'buttons().containers()', function () { + var jq = $(); + var groupSelector = this._groupSelector; + + // We need to use the group selector directly, since if there are no buttons + // the result set will be empty + this.iterator( true, 'table', function ( ctx ) { + if ( ctx._buttons ) { + var insts = Buttons.instanceSelector( groupSelector, ctx._buttons ); + + for ( var i=0, ien=insts.length ; i'+title+'' : ''; + + $('
') + .html( title ) + .append( $('
')[ typeof message === 'string' ? 'html' : 'append' ]( message ) ) + .css( 'display', 'none' ) + .appendTo( 'body' ) + .fadeIn(); + + if ( time !== undefined && time !== 0 ) { + _infoTimer = setTimeout( function () { + that.buttons.info( false ); + }, time ); + } + + this.on('destroy.btn-info', function () { + that.buttons.info(false); + }); + + return this; +} ); + +// Get data from the table for export - this is common to a number of plug-in +// buttons so it is included in the Buttons core library +DataTable.Api.register( 'buttons.exportData()', function ( options ) { + if ( this.context.length ) { + return _exportData( new DataTable.Api( this.context[0] ), options ); + } +} ); + +// Get information about the export that is common to many of the export data +// types (DRY) +DataTable.Api.register( 'buttons.exportInfo()', function ( conf ) { + if ( ! conf ) { + conf = {}; + } + + return { + filename: _filename( conf ), + title: _title( conf ), + messageTop: _message(this, conf.message || conf.messageTop, 'top'), + messageBottom: _message(this, conf.messageBottom, 'bottom') + }; +} ); + + + +/** + * Get the file name for an exported file. + * + * @param {object} config Button configuration + * @param {boolean} incExtension Include the file name extension + */ +var _filename = function ( config ) +{ + // Backwards compatibility + var filename = config.filename === '*' && config.title !== '*' && config.title !== undefined && config.title !== null && config.title !== '' ? + config.title : + config.filename; + + if ( typeof filename === 'function' ) { + filename = filename(); + } + + if ( filename === undefined || filename === null ) { + return null; + } + + if ( filename.indexOf( '*' ) !== -1 ) { + filename = $.trim( filename.replace( '*', $('head > title').text() ) ); + } + + // Strip characters which the OS will object to + filename = filename.replace(/[^a-zA-Z0-9_\u00A1-\uFFFF\.,\-_ !\(\)]/g, ""); + + var extension = _stringOrFunction( config.extension ); + if ( ! extension ) { + extension = ''; + } + + return filename + extension; +}; + +/** + * Simply utility method to allow parameters to be given as a function + * + * @param {undefined|string|function} option Option + * @return {null|string} Resolved value + */ +var _stringOrFunction = function ( option ) +{ + if ( option === null || option === undefined ) { + return null; + } + else if ( typeof option === 'function' ) { + return option(); + } + return option; +}; + +/** + * Get the title for an exported file. + * + * @param {object} config Button configuration + */ +var _title = function ( config ) +{ + var title = _stringOrFunction( config.title ); + + return title === null ? + null : title.indexOf( '*' ) !== -1 ? + title.replace( '*', $('head > title').text() || 'Exported data' ) : + title; +}; + +var _message = function ( dt, option, position ) +{ + var message = _stringOrFunction( option ); + if ( message === null ) { + return null; + } + + var caption = $('caption', dt.table().container()).eq(0); + if ( message === '*' ) { + var side = caption.css( 'caption-side' ); + if ( side !== position ) { + return null; + } + + return caption.length ? + caption.text() : + ''; + } + + return message; +}; + + + + + + + +var _exportTextarea = $('