def ticket_list(request): context = {} # Query_params will hold a dictionary of paramaters relating to # a query, to be saved if needed: query_params = { 'filtering': {}, 'sorting': None, 'sortreverse': False, 'keyword': None, 'other_filter': None, } from_saved_query = False # If the user is coming from the header/navigation search box, lets' first # look at their query to see if they have entered a valid ticket number. If # they have, just redirect to that ticket number. Otherwise, we treat it as # a keyword search. if request.GET.get('search_type', None) == 'header': query = request.GET.get('q') filter = None if query.find('-') > 0: queue, id = query.split('-') try: id = int(id) except ValueError: id = None if id: filter = {'queue__slug': queue, 'id': id } else: try: query = int(query) except ValueError: query = None if query: filter = {'id': int(query) } if filter: try: ticket = Ticket.objects.get(**filter) return HttpResponseRedirect(ticket.staff_url) except Ticket.DoesNotExist: # Go on to standard keyword searching pass saved_query = None if request.GET.get('saved_query', None): from_saved_query = True try: saved_query = SavedSearch.objects.get(pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_list')) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse('helpdesk_list')) import cPickle from helpdesk.lib import b64decode query_params = cPickle.loads(b64decode(str(saved_query.query))) elif not ( request.GET.has_key('queue') or request.GET.has_key('assigned_to') or request.GET.has_key('status') or request.GET.has_key('q') or request.GET.has_key('sort') or request.GET.has_key('sortreverse') or request.GET.has_key('tags') ): # Fall-back if no querying is being done, force the list to only # show open/reopened/resolved (not closed) cases sorted by creation # date. query_params = { 'filtering': {'status__in': [1, 2, 3]}, 'sorting': 'created', } else: queues = request.GET.getlist('queue') if queues: queues = [int(q) for q in queues] query_params['filtering']['queue__id__in'] = queues owners = request.GET.getlist('assigned_to') if owners: owners = [int(u) for u in owners] query_params['filtering']['assigned_to__id__in'] = owners statuses = request.GET.getlist('status') if statuses: statuses = [int(s) for s in statuses] query_params['filtering']['status__in'] = statuses date_from = request.GET.get('date_from') if date_from: query_params['filtering']['created__gte'] = date_from date_to = request.GET.get('date_to') if date_to: query_params['filtering']['created__lte'] = date_to ### KEYWORD SEARCHING q = request.GET.get('q', None) if q: qset = ( Q(title__icontains=q) | Q(description__icontains=q) | Q(resolution__icontains=q) | Q(submitter_email__icontains=q) ) context = dict(context, query=q) query_params['other_filter'] = qset ### SORTING sort = request.GET.get('sort', None) if sort not in ('status', 'assigned_to', 'created', 'title', 'queue', 'priority'): sort = 'created' query_params['sorting'] = sort sortreverse = request.GET.get('sortreverse', None) query_params['sortreverse'] = sortreverse ticket_qs = apply_query(Ticket.objects.select_related(), query_params) # print >> sys.stderr, str(ticket_qs.query) ## TAG MATCHING if HAS_TAG_SUPPORT: tags = request.GET.getlist('tags') if tags: ticket_qs = TaggedItem.objects.get_by_model(ticket_qs, tags) query_params['tags'] = tags ticket_paginator = paginator.Paginator(ticket_qs, request.user.usersettings.settings.get('tickets_per_page') or 20) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: tickets = ticket_paginator.page(page) except (paginator.EmptyPage, paginator.InvalidPage): tickets = ticket_paginator.page(ticket_paginator.num_pages) search_message = '' if context.has_key('query') and settings.DATABASE_ENGINE.startswith('sqlite'): search_message = _('<p><strong>Note:</strong> Your keyword search is case sensitive because of your database. This means the search will <strong>not</strong> be accurate. By switching to a different database system you will gain better searching! For more information, read the <a href="http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching">Django Documentation on string matching in SQLite</a>.') import cPickle from helpdesk.lib import b64encode urlsafe_query = b64encode(cPickle.dumps(query_params)) user_saved_queries = SavedSearch.objects.filter(Q(user=request.user) | Q(shared__exact=True)) query_string = [] for get_key, get_value in request.GET.iteritems(): if get_key != "page": query_string.append("%s=%s" % (get_key, get_value)) tag_choices = [] if HAS_TAG_SUPPORT: # FIXME: restrict this to tags that are actually in use tag_choices = Tag.objects.all() return render_to_response('helpdesk/ticket_list.html', RequestContext(request, dict( context, query_string="&".join(query_string), tickets=tickets, user_choices=User.objects.filter(Q(is_superuser=True), is_active=True), queue_choices=Queue.objects.all(), status_choices=Ticket.STATUS_CHOICES, tag_choices=tag_choices, urlsafe_query=urlsafe_query, user_saved_queries=user_saved_queries, query_params=query_params, from_saved_query=from_saved_query, saved_query=saved_query, search_message=search_message, tags_enabled=HAS_TAG_SUPPORT )))
def run_report(request, report): if Ticket.objects.all().count() == 0 or report not in ('queuemonth', 'usermonth', 'queuestatus', 'queuepriority', 'userstatus', 'userpriority', 'userqueue'): return HttpResponseRedirect(reverse("helpdesk_report_index")) report_queryset = Ticket.objects.all().select_related() from_saved_query = False saved_query = None if request.GET.get('saved_query', None): from_saved_query = True try: saved_query = SavedSearch.objects.get(pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_report_index')) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse('helpdesk_report_index')) import cPickle from helpdesk.lib import b64decode query_params = cPickle.loads(b64decode(str(saved_query.query))) report_queryset = apply_query(report_queryset, query_params) from collections import defaultdict summarytable = defaultdict(int) months = ( _('Jan'), _('Feb'), _('Mar'), _('Apr'), _('May'), _('Jun'), _('Jul'), _('Aug'), _('Sep'), _('Oct'), _('Nov'), _('Dec'), ) first_ticket = Ticket.objects.all().order_by('created')[0] first_month = first_ticket.created.month first_year = first_ticket.created.year last_ticket = Ticket.objects.all().order_by('-created')[0] last_month = last_ticket.created.month last_year = last_ticket.created.year periods = [] year, month = first_year, first_month working = True periods.append("%s %s" % (months[month], year)) while working: month += 1 if month > 12: year += 1 month = 1 if (year > last_year) or (month > last_month and year >= last_year): working = False periods.append("%s %s" % (months[month], year)) if report == 'userpriority': title = _('User by Priority') col1heading = _('User') possible_options = [t[1].__unicode__() for t in Ticket.PRIORITY_CHOICES] charttype = 'bar' elif report == 'userqueue': title = _('User by Queue') col1heading = _('User') possible_options = [q.title.encode('utf-8') for q in Queue.objects.all()] charttype = 'bar' elif report == 'userstatus': title = _('User by Status') col1heading = _('User') possible_options = [s[1].__unicode__() for s in Ticket.STATUS_CHOICES] charttype = 'bar' elif report == 'usermonth': title = _('User by Month') col1heading = _('User') possible_options = periods charttype = 'date' elif report == 'queuepriority': title = _('Queue by Priority') col1heading = _('Queue') possible_options = [t[1].__unicode__() for t in Ticket.PRIORITY_CHOICES] charttype = 'bar' elif report == 'queuestatus': title = _('Queue by Status') col1heading = _('Queue') possible_options = [s[1].__unicode__() for s in Ticket.STATUS_CHOICES] charttype = 'bar' elif report == 'queuemonth': title = _('Queue by Month') col1heading = _('Queue') possible_options = periods charttype = 'date' for ticket in report_queryset: if report == 'userpriority': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.get_priority_display() elif report == 'userqueue': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.queue.title elif report == 'userstatus': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.get_status_display() elif report == 'usermonth': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s %s' % (months[ticket.created.month], ticket.created.year) elif report == 'queuepriority': metric1 = u'%s' % ticket.queue.title metric2 = u'%s' % ticket.get_priority_display() elif report == 'queuestatus': metric1 = u'%s' % ticket.queue.title metric2 = u'%s' % ticket.get_status_display() elif report == 'queuemonth': metric1 = u'%s' % ticket.queue.title metric2 = u'%s %s' % (months[ticket.created.month], ticket.created.year) summarytable[metric1, metric2] += 1 table = [] header1 = sorted(set(list( i.encode('utf-8') for i,_ in summarytable.keys() ))) column_headings = [col1heading] + possible_options # Pivot the data so that 'header1' fields are always first column # in the row, and 'possible_options' are always the 2nd - nth columns. for item in header1: data = [] for hdr in possible_options: data.append(summarytable[item, hdr]) table.append([item] + data) return render_to_response('helpdesk/report_output.html', RequestContext(request, { 'title': title, 'charttype': charttype, 'data': table, 'headings': column_headings, 'from_saved_query': from_saved_query, 'saved_query': saved_query, }))
def ticket_list(request): context = {} # Query_params will hold a dictionary of paramaters relating to # a query, to be saved if needed: query_params = { 'filtering': {}, 'sorting': None, 'sortreverse': False, 'keyword': None, 'other_filter': None, } from_saved_query = False # If the user is coming from the header/navigation search box, lets' first # look at their query to see if they have entered a valid ticket number. If # they have, just redirect to that ticket number. Otherwise, we treat it as # a keyword search. if request.GET.get('search_type', None) == 'header': query = request.GET.get('q') filter = None if query.find('-') > 0: queue, id = query.split('-') try: id = int(id) except ValueError: id = None if id: filter = {'queue__slug': queue, 'id': id} else: try: query = int(query) except ValueError: query = None if query: filter = {'id': int(query)} if filter: try: ticket = Ticket.objects.get(**filter) return HttpResponseRedirect(ticket.staff_url) except Ticket.DoesNotExist: # Go on to standard keyword searching pass saved_query = None if request.GET.get('saved_query', None): from_saved_query = True try: saved_query = SavedSearch.objects.get( pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_list')) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse('helpdesk_list')) import cPickle from helpdesk.lib import b64decode query_params = cPickle.loads(b64decode(str(saved_query.query))) elif not (request.GET.has_key('queue') or request.GET.has_key('assigned_to') or request.GET.has_key('status') or request.GET.has_key('q') or request.GET.has_key('sort') or request.GET.has_key('sortreverse') or request.GET.has_key('tags')): # Fall-back if no querying is being done, force the list to only # show open/reopened/resolved (not closed) cases sorted by creation # date. query_params = { 'filtering': { 'status__in': [1, 2, 3] }, 'sorting': 'created', } else: queues = request.GET.getlist('queue') if queues: try: queues = [int(q) for q in queues] query_params['filtering']['queue__id__in'] = queues except ValueError: pass owners = request.GET.getlist('assigned_to') if owners: try: owners = [int(u) for u in owners] query_params['filtering']['assigned_to__id__in'] = owners except ValueError: pass statuses = request.GET.getlist('status') if statuses: try: statuses = [int(s) for s in statuses] query_params['filtering']['status__in'] = statuses except ValueError: pass date_from = request.GET.get('date_from') if date_from: query_params['filtering']['created__gte'] = date_from date_to = request.GET.get('date_to') if date_to: query_params['filtering']['created__lte'] = date_to ### KEYWORD SEARCHING q = request.GET.get('q', None) if q: qset = (Q(title__icontains=q) | Q(description__icontains=q) | Q(resolution__icontains=q) | Q(submitter_email__icontains=q)) context = dict(context, query=q) query_params['other_filter'] = qset ### SORTING sort = request.GET.get('sort', None) if sort not in ('status', 'assigned_to', 'created', 'title', 'queue', 'priority'): sort = 'created' query_params['sorting'] = sort sortreverse = request.GET.get('sortreverse', None) query_params['sortreverse'] = sortreverse try: ticket_qs = apply_query(Ticket.objects.select_related(), query_params) except ValidationError: # invalid parameters in query, return default query query_params = { 'filtering': { 'status__in': [1, 2, 3] }, 'sorting': 'created', } ticket_qs = apply_query(Ticket.objects.select_related(), query_params) ## TAG MATCHING if HAS_TAGGING_SUPPORT: tags = request.GET.getlist('tags') if tags: ticket_qs = TaggedItem.objects.get_by_model(ticket_qs, tags) query_params['tags'] = tags if HAS_TAGGIT_SUPPORT: tags = request.GET.getlist('tags') if tags: ticket_qs = Ticket.objects.filter(tags__name__in=tags) query_params['tags'] = tags ticket_paginator = paginator.Paginator( ticket_qs, request.user.usersettings.settings.get('tickets_per_page') or 20) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: tickets = ticket_paginator.page(page) except (paginator.EmptyPage, paginator.InvalidPage): tickets = ticket_paginator.page(ticket_paginator.num_pages) search_message = '' if context.has_key('query') and settings.DATABASE_ENGINE.startswith( 'sqlite'): search_message = _( '<p><strong>Note:</strong> Your keyword search is case sensitive because of your database. This means the search will <strong>not</strong> be accurate. By switching to a different database system you will gain better searching! For more information, read the <a href="http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching">Django Documentation on string matching in SQLite</a>.' ) import cPickle from helpdesk.lib import b64encode urlsafe_query = b64encode(cPickle.dumps(query_params)) user_saved_queries = SavedSearch.objects.filter( Q(user=request.user) | Q(shared__exact=True)) query_string = [] for get_key, get_value in request.GET.iteritems(): if get_key != "page": query_string.append("%s=%s" % (get_key, get_value)) tag_choices = [] if HAS_TAGGING_SUPPORT or HAS_TAGGIT_SUPPORT: # FIXME: restrict this to tags that are actually in use tag_choices = Tag.objects.all() return render_to_response( 'helpdesk/ticket_list.html', RequestContext( request, dict( context, query_string="&".join(query_string), tickets=tickets, user_choices=User.objects.filter(is_active=True), queue_choices=Queue.objects.all(), status_choices=Ticket.STATUS_CHOICES, tag_choices=tag_choices, urlsafe_query=urlsafe_query, user_saved_queries=user_saved_queries, query_params=query_params, from_saved_query=from_saved_query, saved_query=saved_query, search_message=search_message, tagging_enabled=HAS_TAGGING_SUPPORT, taggit_enabled=HAS_TAGGIT_SUPPORT, )))
def run_report(request, report): if Ticket.objects.all().count() == 0 or report not in ( "queuemonth", "usermonth", "queuestatus", "queuepriority", "userstatus", "userpriority", "userqueue", ): return HttpResponseRedirect(reverse("helpdesk_report_index")) report_queryset = Ticket.objects.all().select_related() from_saved_query = False saved_query = None if request.GET.get("saved_query", None): from_saved_query = True try: saved_query = SavedSearch.objects.get(pk=request.GET.get("saved_query")) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse("helpdesk_report_index")) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse("helpdesk_report_index")) import cPickle from helpdesk.lib import b64decode query_params = cPickle.loads(b64decode(str(saved_query.query))) report_queryset = apply_query(report_queryset, query_params) from collections import defaultdict summarytable = defaultdict(int) months = ( _("Jan"), _("Feb"), _("Mar"), _("Apr"), _("May"), _("Jun"), _("Jul"), _("Aug"), _("Sep"), _("Oct"), _("Nov"), _("Dec"), ) first_ticket = Ticket.objects.all().order_by("created")[0] first_month = first_ticket.created.month first_year = first_ticket.created.year last_ticket = Ticket.objects.all().order_by("-created")[0] last_month = last_ticket.created.month last_year = last_ticket.created.year periods = [] year, month = first_year, first_month working = True periods.append("%s %s" % (months[month - 1], year)) while working: month += 1 if month > 12: year += 1 month = 1 if (year > last_year) or (month > last_month and year >= last_year): working = False periods.append("%s %s" % (months[month - 1], year)) if report == "userpriority": title = _("User by Priority") col1heading = _("User") possible_options = [t[1].__unicode__() for t in Ticket.PRIORITY_CHOICES] charttype = "bar" elif report == "userqueue": title = _("User by Queue") col1heading = _("User") possible_options = [q.title.encode("utf-8") for q in Queue.objects.all()] charttype = "bar" elif report == "userstatus": title = _("User by Status") col1heading = _("User") possible_options = [s[1].__unicode__() for s in Ticket.STATUS_CHOICES] charttype = "bar" elif report == "usermonth": title = _("User by Month") col1heading = _("User") possible_options = periods charttype = "date" elif report == "queuepriority": title = _("Queue by Priority") col1heading = _("Queue") possible_options = [t[1].__unicode__() for t in Ticket.PRIORITY_CHOICES] charttype = "bar" elif report == "queuestatus": title = _("Queue by Status") col1heading = _("Queue") possible_options = [s[1].__unicode__() for s in Ticket.STATUS_CHOICES] charttype = "bar" elif report == "queuemonth": title = _("Queue by Month") col1heading = _("Queue") possible_options = periods charttype = "date" for ticket in report_queryset: if report == "userpriority": metric1 = u"%s" % ticket.get_assigned_to metric2 = u"%s" % ticket.get_priority_display() elif report == "userqueue": metric1 = u"%s" % ticket.get_assigned_to metric2 = u"%s" % ticket.queue.title elif report == "userstatus": metric1 = u"%s" % ticket.get_assigned_to metric2 = u"%s" % ticket.get_status_display() elif report == "usermonth": metric1 = u"%s" % ticket.get_assigned_to metric2 = u"%s %s" % (months[ticket.created.month - 1], ticket.created.year) elif report == "queuepriority": metric1 = u"%s" % ticket.queue.title metric2 = u"%s" % ticket.get_priority_display() elif report == "queuestatus": metric1 = u"%s" % ticket.queue.title metric2 = u"%s" % ticket.get_status_display() elif report == "queuemonth": metric1 = u"%s" % ticket.queue.title metric2 = u"%s %s" % (months[ticket.created.month - 1], ticket.created.year) summarytable[metric1, metric2] += 1 table = [] header1 = sorted(set(list(i.encode("utf-8") for i, _ in summarytable.keys()))) column_headings = [col1heading] + possible_options # Pivot the data so that 'header1' fields are always first column # in the row, and 'possible_options' are always the 2nd - nth columns. for item in header1: data = [] for hdr in possible_options: data.append(summarytable[item, hdr]) table.append([item] + data) return render_to_response( "helpdesk/report_output.html", RequestContext( request, { "title": title, "charttype": charttype, "data": table, "headings": column_headings, "from_saved_query": from_saved_query, "saved_query": saved_query, }, ), )
def public_ticket_list(request): if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) context = {} # Query_params will hold a dictionary of parameters relating to # a query, to be saved if needed: query_params = { 'filtering': {}, 'sorting': None, 'sortreverse': True, 'keyword': None, 'other_filter': None, } from_saved_query = False # If the user is coming from the header/navigation search box, lets' first # look at their query to see if they have entered a valid ticket number. If # they have, just redirect to that ticket number. Otherwise, we treat it as # a keyword search. if request.GET.get('search_type', None) == 'header': query = request.GET.get('q') filter = None if query.find('-') > 0: try: queue, id = query.split('-') id = int(id) except ValueError: id = None if id: filter = {'queue__slug': queue, 'id': id} else: try: query = int(query) except ValueError: query = None if query: filter = {'id': int(query)} if filter: try: ticket = Ticket.objects.get(**filter) return HttpResponseRedirect(ticket.staff_url) except Ticket.DoesNotExist: # Go on to standard keyword searching pass saved_query = None if request.GET.get('saved_query', None): from_saved_query = True try: saved_query = SavedSearch.objects.get( pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_list')) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse('helpdesk_list')) try: import pickle except ImportError: import cPickle as pickle from helpdesk.lib import b64decode query_params = pickle.loads(b64decode(str(saved_query.query))) elif not ('queue' in request.GET or 'assigned_to' in request.GET or 'status' in request.GET or 'q' in request.GET or 'sort' in request.GET or 'sortreverse' in request.GET): # Fall-back if no querying is being done, force the list to only # show open/reopened/resolved (not closed) cases sorted by creation # date. query_params = { 'filtering': { 'status__in': [1, 2, 3] }, 'sorting': 'created', } else: queues = request.GET.getlist('queue') if queues: try: queues = [int(q) for q in queues] query_params['filtering']['queue__id__in'] = queues except ValueError: pass owners = request.GET.getlist('assigned_to') if owners: try: owners = [int(u) for u in owners] query_params['filtering']['assigned_to__id__in'] = owners except ValueError: pass statuses = request.GET.getlist('status') if statuses: try: statuses = [int(s) for s in statuses] query_params['filtering']['status__in'] = statuses except ValueError: pass types = request.GET.getlist('types') if types: try: types = [int(s) for s in types] query_params['filtering']['type__in'] = types except ValueError: pass date_from = request.GET.get('date_from') if date_from: query_params['filtering']['created__gte'] = date_from date_to = request.GET.get('date_to') if date_to: query_params['filtering']['created__lte'] = date_to ### KEYWORD SEARCHING q = request.GET.get('q', None) if q: qset = (Q(title__icontains=q) | Q(description__icontains=q) | Q(resolution__icontains=q) | Q(submitter_email__icontains=q)) context = dict(context, query=q) query_params['other_filter'] = qset ### SORTING sort = request.GET.get('sort', None) if sort not in ('status', 'assigned_to', 'created', 'title', 'queue', 'priority'): sort = 'created' query_params['sorting'] = sort sortreverse = request.GET.get('sortreverse', None) query_params['sortreverse'] = sortreverse tickets = Ticket.objects.select_related() queue_choices = Queue.objects.all() try: ticket_qs = apply_query(tickets, query_params) except ValidationError: # invalid parameters in query, return default query query_params = { 'filtering': { 'status__in': [1, 2, 3] }, 'sorting': 'created', } ticket_qs = apply_query(tickets, query_params) ticket_paginator = paginator.Paginator(ticket_qs, 20) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: tickets = ticket_paginator.page(page) except (paginator.EmptyPage, paginator.InvalidPage): tickets = ticket_paginator.page(ticket_paginator.num_pages) search_message = '' from helpdesk.lib import b64encode try: import pickle except ImportError: import cPickle as pickle urlsafe_query = b64encode(pickle.dumps(query_params)) user_saved_queries = SavedSearch.objects.filter( Q(user=request.user) | Q(shared__exact=True)) querydict = request.GET.copy() querydict.pop('page', 1) print "TICKET TYPES:" print Ticket.TICKET_TYPE return render_to_response( 'helpdesk/public_ticket_list.html', RequestContext( request, dict( context, query_string=querydict.urlencode(), tickets=tickets, user_choices=User.objects.filter(is_active=True, is_staff=True), queue_choices=queue_choices, status_choices=Ticket.STATUS_CHOICES, type_choices=Ticket.TICKET_TYPE, urlsafe_query=urlsafe_query, user_saved_queries=user_saved_queries, query_params=query_params, from_saved_query=from_saved_query, saved_query=saved_query, search_message=search_message, )))
def run_report(request, report): if Ticket.objects.all().count() == 0 or report not in ( 'queuemonth', 'usermonth', 'queuestatus', 'queuepriority', 'userstatus', 'userpriority', 'userqueue'): return HttpResponseRedirect(reverse("helpdesk_report_index")) report_queryset = Ticket.objects.all().select_related() from_saved_query = False saved_query = None if request.GET.get('saved_query', None): from_saved_query = True try: saved_query = SavedSearch.objects.get( pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_report_index')) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse('helpdesk_report_index')) import cPickle from helpdesk.lib import b64decode query_params = cPickle.loads(b64decode(str(saved_query.query))) report_queryset = apply_query(report_queryset, query_params) from collections import defaultdict summarytable = defaultdict(int) months = ( _('Jan'), _('Feb'), _('Mar'), _('Apr'), _('May'), _('Jun'), _('Jul'), _('Aug'), _('Sep'), _('Oct'), _('Nov'), _('Dec'), ) first_ticket = Ticket.objects.all().order_by('created')[0] first_month = first_ticket.created.month first_year = first_ticket.created.year last_ticket = Ticket.objects.all().order_by('-created')[0] last_month = last_ticket.created.month last_year = last_ticket.created.year periods = [] year, month = first_year, first_month working = True periods.append("%s %s" % (months[month - 1], year)) while working: month += 1 if month > 12: year += 1 month = 1 if (year > last_year) or (month > last_month and year >= last_year): working = False periods.append("%s %s" % (months[month - 1], year)) if report == 'userpriority': title = _('User by Priority') col1heading = _('User') possible_options = [ t[1].__unicode__() for t in Ticket.PRIORITY_CHOICES ] charttype = 'bar' elif report == 'userqueue': title = _('User by Queue') col1heading = _('User') possible_options = [ q.title.encode('utf-8') for q in Queue.objects.all() ] charttype = 'bar' elif report == 'userstatus': title = _('User by Status') col1heading = _('User') possible_options = [s[1].__unicode__() for s in Ticket.STATUS_CHOICES] charttype = 'bar' elif report == 'usermonth': title = _('User by Month') col1heading = _('User') possible_options = periods charttype = 'date' elif report == 'queuepriority': title = _('Queue by Priority') col1heading = _('Queue') possible_options = [ t[1].__unicode__() for t in Ticket.PRIORITY_CHOICES ] charttype = 'bar' elif report == 'queuestatus': title = _('Queue by Status') col1heading = _('Queue') possible_options = [s[1].__unicode__() for s in Ticket.STATUS_CHOICES] charttype = 'bar' elif report == 'queuemonth': title = _('Queue by Month') col1heading = _('Queue') possible_options = periods charttype = 'date' for ticket in report_queryset: if report == 'userpriority': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.get_priority_display() elif report == 'userqueue': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.queue.title elif report == 'userstatus': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.get_status_display() elif report == 'usermonth': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s %s' % (months[ticket.created.month - 1], ticket.created.year) elif report == 'queuepriority': metric1 = u'%s' % ticket.queue.title metric2 = u'%s' % ticket.get_priority_display() elif report == 'queuestatus': metric1 = u'%s' % ticket.queue.title metric2 = u'%s' % ticket.get_status_display() elif report == 'queuemonth': metric1 = u'%s' % ticket.queue.title metric2 = u'%s %s' % (months[ticket.created.month - 1], ticket.created.year) summarytable[metric1, metric2] += 1 table = [] header1 = sorted( set(list(i.encode('utf-8') for i, _ in summarytable.keys()))) column_headings = [col1heading] + possible_options # Pivot the data so that 'header1' fields are always first column # in the row, and 'possible_options' are always the 2nd - nth columns. for item in header1: data = [] for hdr in possible_options: data.append(summarytable[item, hdr]) table.append([item] + data) return render_to_response( 'helpdesk/report_output.html', RequestContext( request, { 'title': title, 'charttype': charttype, 'data': table, 'headings': column_headings, 'from_saved_query': from_saved_query, 'saved_query': saved_query, }))
def public_ticket_list(request): if not request.user.is_authenticated(): return HttpResponseRedirect(reverse('login')) context = {} # Query_params will hold a dictionary of parameters relating to # a query, to be saved if needed: query_params = { 'filtering': {}, 'sorting': None, 'sortreverse': True, 'keyword': None, 'other_filter': None, } from_saved_query = False # If the user is coming from the header/navigation search box, lets' first # look at their query to see if they have entered a valid ticket number. If # they have, just redirect to that ticket number. Otherwise, we treat it as # a keyword search. if request.GET.get('search_type', None) == 'header': query = request.GET.get('q') filter = None if query.find('-') > 0: try: queue, id = query.split('-') id = int(id) except ValueError: id = None if id: filter = {'queue__slug': queue, 'id': id } else: try: query = int(query) except ValueError: query = None if query: filter = {'id': int(query) } if filter: try: ticket = Ticket.objects.get(**filter) return HttpResponseRedirect(ticket.staff_url) except Ticket.DoesNotExist: # Go on to standard keyword searching pass saved_query = None if request.GET.get('saved_query', None): from_saved_query = True try: saved_query = SavedSearch.objects.get(pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_list')) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse('helpdesk_list')) try: import pickle except ImportError: import cPickle as pickle from helpdesk.lib import b64decode query_params = pickle.loads(b64decode(str(saved_query.query))) elif not ( 'queue' in request.GET or 'assigned_to' in request.GET or 'status' in request.GET or 'q' in request.GET or 'sort' in request.GET or 'sortreverse' in request.GET ): # Fall-back if no querying is being done, force the list to only # show open/reopened/resolved (not closed) cases sorted by creation # date. query_params = { 'filtering': {'status__in': [1, 2, 3]}, 'sorting': 'created', } else: queues = request.GET.getlist('queue') if queues: try: queues = [int(q) for q in queues] query_params['filtering']['queue__id__in'] = queues except ValueError: pass owners = request.GET.getlist('assigned_to') if owners: try: owners = [int(u) for u in owners] query_params['filtering']['assigned_to__id__in'] = owners except ValueError: pass statuses = request.GET.getlist('status') if statuses: try: statuses = [int(s) for s in statuses] query_params['filtering']['status__in'] = statuses except ValueError: pass types = request.GET.getlist('types') if types: try: types = [int(s) for s in types] query_params['filtering']['type__in'] = types except ValueError: pass date_from = request.GET.get('date_from') if date_from: query_params['filtering']['created__gte'] = date_from date_to = request.GET.get('date_to') if date_to: query_params['filtering']['created__lte'] = date_to ### KEYWORD SEARCHING q = request.GET.get('q', None) if q: qset = ( Q(title__icontains=q) | Q(description__icontains=q) | Q(resolution__icontains=q) | Q(submitter_email__icontains=q) ) context = dict(context, query=q) query_params['other_filter'] = qset ### SORTING sort = request.GET.get('sort', None) if sort not in ('status', 'assigned_to', 'created', 'title', 'queue', 'priority'): sort = 'created' query_params['sorting'] = sort sortreverse = request.GET.get('sortreverse', None) query_params['sortreverse'] = sortreverse tickets = Ticket.objects.select_related() queue_choices = Queue.objects.all() try: ticket_qs = apply_query(tickets, query_params) except ValidationError: # invalid parameters in query, return default query query_params = { 'filtering': {'status__in': [1, 2, 3]}, 'sorting': 'created', } ticket_qs = apply_query(tickets, query_params) ticket_paginator = paginator.Paginator(ticket_qs, 20) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: tickets = ticket_paginator.page(page) except (paginator.EmptyPage, paginator.InvalidPage): tickets = ticket_paginator.page(ticket_paginator.num_pages) search_message = '' from helpdesk.lib import b64encode try: import pickle except ImportError: import cPickle as pickle urlsafe_query = b64encode(pickle.dumps(query_params)) user_saved_queries = SavedSearch.objects.filter(Q(user=request.user) | Q(shared__exact=True)) querydict = request.GET.copy() querydict.pop('page', 1) print "TICKET TYPES:" print Ticket.TICKET_TYPE return render_to_response('helpdesk/public_ticket_list.html', RequestContext(request, dict( context, query_string=querydict.urlencode(), tickets=tickets, user_choices=User.objects.filter(is_active=True,is_staff=True), queue_choices=queue_choices, status_choices=Ticket.STATUS_CHOICES, type_choices=Ticket.TICKET_TYPE, urlsafe_query=urlsafe_query, user_saved_queries=user_saved_queries, query_params=query_params, from_saved_query=from_saved_query, saved_query=saved_query, search_message=search_message, )))
def task_list(request): # Query_params query_params = { 'filtering': {}, 'sorting': None, 'keyword': None, 'other_filter': None, 'sortreverse': True, } tasks = Task.objects.filter(Q(created_by = request.user) | Q(assigned_to = request.user)).exclude(status__in = [ 4]) task_obj = Task.objects.filter(Q(created_by = request.user) | Q(assigned_to = request.user)).exclude(status__in = [4]) assignable_users = User.objects.filter(is_active=True).order_by(User.USERNAME_FIELD) context = {} ## sorting tasks sort_tasks(request,query_params) #searching search_tasks(request, context, query_params) ## Task Filtering #status statuses = request.GET.getlist('status') if statuses: try: statuses = [int(s) for s in statuses] query_params['filtering']['status__in'] = statuses except ValueError: pass #priorities priorities = request.GET.getlist('priority') if priorities: try: priorities = [int(p) for p in priorities] query_params['filtering']['priority__in'] = priorities except ValueError: pass #Assigned to assigned = request.GET.getlist('assigned_to') if assigned: try: assigned = [int(a) for a in assigned] query_params['filtering']['assigned_to__id__in'] = assigned except ValueError: pass #Due Dates due_from = request.GET.get('due_from') if due_from: query_params['filtering']['due_date__gte'] = due_from due_to = request.GET.get('due_to') if due_to: query_params['filtering']['due_date__lte'] = due_to #Created dates created_from = request.GET.get('created_from') if created_from: query_params['filtering']['created_date__gte'] = created_from created_to = request.GET.get('created_to') if created_to: query_params['filtering']['created_date__lte'] = created_to form = form_data(request) tolaActivityData = {} tolaTablesData = {} tasks_assigned = {} tasks_created = {} total_tasks_assigned = 0 total_tasks_created = 0 if request.user.is_authenticated(): tolaActivityData = get_TolaActivity_byUser(request) tolaTablesData = get_TolaTables_data(request) # User tasks tasks_created = Task.objects.filter(created_by = request.user).exclude(status__in = '4') total_tasks_created = len(tasks_created) created = request.GET.get('created') if created: tasks = tasks_created #assigned_to tasks_assigned = Task.objects.filter(assigned_to = request.user).exclude(status__in = '4') total_tasks_assigned = len(tasks_assigned) assigned = request.GET.get('assigned') if assigned: tasks = tasks_assigned try: tasks = apply_query(tasks, query_params) if query_params['filtering']: tasks = apply_query(task_obj, query_params) except ValidationError: # invalid parameters in query, return default query query_params = { 'filtering': {'status__in': [1, 2,3]}, 'sorting': 'created_date', } tasks = apply_query(task_obj, query_params) querydict = request.GET.copy() return render_to_response('tasks/task_index.html', RequestContext(request, { 'query_string': querydict.urlencode(), 'query': request.GET.get('q'), 'tasks': tasks.reverse(), 'query_params': query_params, 'tasks_assigned': tasks_assigned, 'total_tasks': len(tasks), 'tasks_created': tasks_created, 'total_tasks_created': total_tasks_created, 'total_tasks_assigned': total_tasks_assigned, 'assignable_users': assignable_users, 'status_choices':Task.STATUS_CHOICES, 'priority': Task.PRIORITY_CHOICES, 'form' : form, 'tolaActivityData': tolaActivityData, 'tolaTablesData': tolaTablesData, 't_status_choices': Ticket.STATUS_CHOICES }))
def ticket_list(request): context = {} # Query_params will hold a dictionary of parameters relating to # a query, to be saved if needed: query_params = {"filtering": {}, "sorting": None, "sortreverse": False, "keyword": None, "other_filter": None} from_saved_query = False # If the user is coming from the header/navigation search box, lets' first # look at their query to see if they have entered a valid ticket number. If # they have, just redirect to that ticket number. Otherwise, we treat it as # a keyword search. if request.GET.get("search_type", None) == "header": query = request.GET.get("q") filter = None if query.find("-") > 0: try: queue, id = query.split("-") id = int(id) except ValueError: id = None if id: filter = {"queue__slug": queue, "id": id} else: try: query = int(query) except ValueError: query = None if query: filter = {"id": int(query)} if filter: try: ticket = Ticket.objects.get(**filter) return HttpResponseRedirect(ticket.staff_url) except Ticket.DoesNotExist: # Go on to standard keyword searching pass saved_query = None if request.GET.get("saved_query", None): from_saved_query = True try: saved_query = SavedSearch.objects.get(pk=request.GET.get("saved_query")) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse("helpdesk_list")) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse("helpdesk_list")) import cPickle from helpdesk.lib import b64decode query_params = cPickle.loads(b64decode(str(saved_query.query))) elif not ( request.GET.has_key("queue") or request.GET.has_key("assigned_to") or request.GET.has_key("status") or request.GET.has_key("q") or request.GET.has_key("sort") or request.GET.has_key("sortreverse") or request.GET.has_key("tags") ): # Fall-back if no querying is being done, force the list to only # show open/reopened/resolved (not closed) cases sorted by creation # date. query_params = {"filtering": {"status__in": [1, 2, 3]}, "sorting": "created"} else: queues = request.GET.getlist("queue") if queues: try: queues = [int(q) for q in queues] query_params["filtering"]["queue__id__in"] = queues except ValueError: pass owners = request.GET.getlist("assigned_to") if owners: try: owners = [int(u) for u in owners] query_params["filtering"]["assigned_to__id__in"] = owners except ValueError: pass statuses = request.GET.getlist("status") if statuses: try: statuses = [int(s) for s in statuses] query_params["filtering"]["status__in"] = statuses except ValueError: pass date_from = request.GET.get("date_from") if date_from: query_params["filtering"]["created__gte"] = date_from date_to = request.GET.get("date_to") if date_to: query_params["filtering"]["created__lte"] = date_to ### KEYWORD SEARCHING q = request.GET.get("q", None) if q: qset = ( Q(title__icontains=q) | Q(description__icontains=q) | Q(resolution__icontains=q) | Q(submitter_email__icontains=q) ) context = dict(context, query=q) query_params["other_filter"] = qset ### SORTING sort = request.GET.get("sort", None) if sort not in ("status", "assigned_to", "created", "title", "queue", "priority"): sort = "created" query_params["sorting"] = sort sortreverse = request.GET.get("sortreverse", None) query_params["sortreverse"] = sortreverse try: ticket_qs = apply_query(Ticket.objects.select_related(), query_params) except ValidationError: # invalid parameters in query, return default query query_params = {"filtering": {"status__in": [1, 2, 3]}, "sorting": "created"} ticket_qs = apply_query(Ticket.objects.select_related(), query_params) ## TAG MATCHING if HAS_TAG_SUPPORT: tags = request.GET.getlist("tags") if tags: ticket_qs = TaggedItem.objects.get_by_model(ticket_qs, tags) query_params["tags"] = tags ticket_paginator = paginator.Paginator(ticket_qs, request.user.usersettings.settings.get("tickets_per_page") or 20) try: page = int(request.GET.get("page", "1")) except ValueError: page = 1 try: tickets = ticket_paginator.page(page) except (paginator.EmptyPage, paginator.InvalidPage): tickets = ticket_paginator.page(ticket_paginator.num_pages) search_message = "" if context.has_key("query") and settings.DATABASES["default"]["ENGINE"].endswith("sqlite"): search_message = _( '<p><strong>Note:</strong> Your keyword search is case sensitive because of your database. This means the search will <strong>not</strong> be accurate. By switching to a different database system you will gain better searching! For more information, read the <a href="http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching">Django Documentation on string matching in SQLite</a>.' ) import cPickle from helpdesk.lib import b64encode urlsafe_query = b64encode(cPickle.dumps(query_params)) user_saved_queries = SavedSearch.objects.filter(Q(user=request.user) | Q(shared__exact=True)) querydict = request.GET.copy() querydict.pop("page", 1) tag_choices = [] if HAS_TAG_SUPPORT: # FIXME: restrict this to tags that are actually in use tag_choices = Tag.objects.all() return render_to_response( "helpdesk/ticket_list.html", RequestContext( request, dict( context, query_string=querydict.urlencode(), tickets=tickets, user_choices=User.objects.filter(is_active=True, is_staff=True), queue_choices=Queue.objects.all(), status_choices=Ticket.STATUS_CHOICES, tag_choices=tag_choices, urlsafe_query=urlsafe_query, user_saved_queries=user_saved_queries, query_params=query_params, from_saved_query=from_saved_query, saved_query=saved_query, search_message=search_message, tags_enabled=HAS_TAG_SUPPORT, ), ), )
def run_report(request, report): if Ticket.objects.all().count() == 0 or report not in ('queuemonth', 'usermonth', 'queuestatus', 'queuepriority', 'userstatus', 'userpriority', 'userqueue', 'daysuntilticketclosedbymonth'): return HttpResponseRedirect(reverse("helpdesk_report_index")) report_queryset = Ticket.objects.all().select_related().filter( queue__in=_get_user_queues(request.user) ) from_saved_query = False saved_query = None if request.GET.get('saved_query', None): from_saved_query = True try: saved_query = SavedSearch.objects.get(pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_report_index')) if not (saved_query.shared or saved_query.user == request.user): return HttpResponseRedirect(reverse('helpdesk_report_index')) try: import pickle except ImportError: import cPickle as pickle from helpdesk.lib import b64decode query_params = pickle.loads(b64decode(str(saved_query.query))) report_queryset = apply_query(report_queryset, query_params) from collections import defaultdict summarytable = defaultdict(int) # a second table for more complex queries summarytable2 = defaultdict(int) month_name = lambda m: MONTHS_3[m].title() first_ticket = Ticket.objects.all().order_by('created')[0] first_month = first_ticket.created.month first_year = first_ticket.created.year last_ticket = Ticket.objects.all().order_by('-created')[0] last_month = last_ticket.created.month last_year = last_ticket.created.year periods = [] year, month = first_year, first_month working = True periods.append("%s %s" % (month_name(month), year)) while working: month += 1 if month > 12: year += 1 month = 1 if (year > last_year) or (month > last_month and year >= last_year): working = False periods.append("%s %s" % (month_name(month), year)) if report == 'userpriority': title = _('User by Priority') col1heading = _('User') possible_options = [t[1].title() for t in Ticket.PRIORITY_CHOICES] charttype = 'bar' elif report == 'userqueue': title = _('User by Queue') col1heading = _('User') queue_options = _get_user_queues(request.user) possible_options = [q.title for q in queue_options] charttype = 'bar' elif report == 'userstatus': title = _('User by Status') col1heading = _('User') possible_options = [s[1].title() for s in Ticket.STATUS_CHOICES] charttype = 'bar' elif report == 'usermonth': title = _('User by Month') col1heading = _('User') possible_options = periods charttype = 'date' elif report == 'queuepriority': title = _('Queue by Priority') col1heading = _('Queue') possible_options = [t[1].title() for t in Ticket.PRIORITY_CHOICES] charttype = 'bar' elif report == 'queuestatus': title = _('Queue by Status') col1heading = _('Queue') possible_options = [s[1].title() for s in Ticket.STATUS_CHOICES] charttype = 'bar' elif report == 'queuemonth': title = _('Queue by Month') col1heading = _('Queue') possible_options = periods charttype = 'date' elif report == 'daysuntilticketclosedbymonth': title = _('Days until ticket closed by Month') col1heading = _('Queue') possible_options = periods charttype = 'date' metric3 = False for ticket in report_queryset: if report == 'userpriority': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.get_priority_display() elif report == 'userqueue': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.queue.title elif report == 'userstatus': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s' % ticket.get_status_display() elif report == 'usermonth': metric1 = u'%s' % ticket.get_assigned_to metric2 = u'%s %s' % (month_name(ticket.created.month), ticket.created.year) elif report == 'queuepriority': metric1 = u'%s' % ticket.queue.title metric2 = u'%s' % ticket.get_priority_display() elif report == 'queuestatus': metric1 = u'%s' % ticket.queue.title metric2 = u'%s' % ticket.get_status_display() elif report == 'queuemonth': metric1 = u'%s' % ticket.queue.title metric2 = u'%s %s' % (month_name(ticket.created.month), ticket.created.year) elif report == 'daysuntilticketclosedbymonth': metric1 = u'%s' % ticket.queue.title metric2 = u'%s %s' % (month_name(ticket.created.month), ticket.created.year) metric3 = ticket.modified - ticket.created metric3 = metric3.days summarytable[metric1, metric2] += 1 if metric3: if report == 'daysuntilticketclosedbymonth': summarytable2[metric1, metric2] += metric3 table = [] if report == 'daysuntilticketclosedbymonth': for key in summarytable2.keys(): summarytable[key] = summarytable2[key] / summarytable[key] header1 = sorted(set(list(i for i, _ in summarytable.keys()))) column_headings = [col1heading] + possible_options # Pivot the data so that 'header1' fields are always first column # in the row, and 'possible_options' are always the 2nd - nth columns. for item in header1: data = [] for hdr in possible_options: data.append(summarytable[item, hdr]) table.append([item] + data) return render_to_response('helpdesk/report_output.html', RequestContext(request, { 'title': title, 'charttype': charttype, 'data': table, 'headings': column_headings, 'from_saved_query': from_saved_query, 'saved_query': saved_query, }))
def get_queryset(self): request = self.request context = {} query_params = { 'filtering': {}, 'sorting': None, 'sortreverse': False, 'keyword': None, 'other_filter': None, } if request.GET.get('saved_query', None): self.from_saved_query = True try: self.saved_query = SavedSearch.objects.get(pk=request.GET.get('saved_query')) except SavedSearch.DoesNotExist: return HttpResponseRedirect(reverse('helpdesk_ticket_list')) if not (self.saved_query.shared or self.saved_query.user_id == request.user.id): return HttpResponseRedirect(reverse('helpdesk_ticket_list')) try: import pickle except ImportError: import cPickle as pickle from helpdesk.lib import b64decode query_params = pickle.loads(b64decode(str(self.saved_query.query))) elif not ( 'queue' in request.GET or 'assigned_to' in request.GET or 'status' in request.GET or 'q' in request.GET or 'sort' in request.GET or 'sortreverse' in request.GET ): # Fall-back if no querying is being done, force the list to only # show open/reopened/resolved (not closed) cases sorted by creation # date. query_params = { 'filtering': {'status__in': [1, 2, 3]}, 'sorting': 'created', } else: queues = request.GET.getlist('queue') if queues: try: queues = [int(q) for q in queues] query_params['filtering']['queue__id__in'] = queues except ValueError: pass owners = request.GET.getlist('assigned_to') if owners: try: owners = [int(u) for u in owners] query_params['filtering']['assigned_to__id__in'] = owners except ValueError: pass statuses = request.GET.getlist('status') if statuses: try: statuses = [int(s) for s in statuses] query_params['filtering']['status__in'] = statuses except ValueError: pass date_from = request.GET.get('date_from') if date_from: query_params['filtering']['created__gte'] = date_from date_to = request.GET.get('date_to') if date_to: query_params['filtering']['created__lte'] = date_to ### KEYWORD SEARCHING q = request.GET.get('q', None) if q: qset = ( Q(title__icontains=q) | Q(description__icontains=q) | Q(resolution__icontains=q) | Q(submitter_email__icontains=q) ) context = dict(context, query=q) query_params['other_filter'] = qset ### SORTING sort = request.GET.get('sort', None) if sort not in ('status', 'assigned_to', 'created', 'title', 'queue', 'priority'): sort = 'created' query_params['sorting'] = sort sortreverse = request.GET.get('sortreverse', None) query_params['sortreverse'] = sortreverse # ToDo # Make permission check tickets = Ticket.objects.filter().select_related() try: ticket_qs = apply_query(tickets, query_params) except ValidationError: # invalid parameters in query, return default query query_params = { 'filtering': {'status__in': [1, 2, 3]}, 'sorting': 'created', } ticket_qs = apply_query(tickets, query_params) """ ticket_paginator = paginator.Paginator(ticket_qs, request.user.usersettings.settings.get('tickets_per_page') or 20) try: page = int(request.GET.get('page', '1')) except ValueError: page = 1 try: tickets = ticket_paginator.page(page) except (paginator.EmptyPage, paginator.InvalidPage): tickets = ticket_paginator.page(ticket_paginator.num_pages) """ tickets = ticket_qs if 'query' in context and settings.DATABASES['default']['ENGINE'].endswith('sqlite'): self.search_message = _('<p><strong>Note:</strong> Your keyword search is case sensitive because of your database. This means the search will <strong>not</strong> be accurate. By switching to a different database system you will gain better searching! For more information, read the <a href="http://docs.djangoproject.com/en/dev/ref/databases/#sqlite-string-matching">Django Documentation on string matching in SQLite</a>.') try: import pickle except ImportError: import cPickle as pickle from helpdesk.lib import b64encode self.urlsafe_query = b64encode(pickle.dumps(query_params)) self.query_params = query_params self.user_saved_queries = SavedSearch.objects.filter(Q(user_id=request.user.id) | Q(shared__exact=True)) return tickets