def last_modified(self): try: request = self._getRequestFromUrl(self.path) rep = tickets_reports.objects.get(active_record=True, pk=self._getReportFromUrl(self.path)) tic = get_ticket_model().objects.select_related('type', 'state', 'assigned', 'priority', 'customer').all() search_params, tic = build_ticket_search_ext(request, tic, json.loads(rep.search)) date = tic.latest('u_date') return datetime.strftime( date.last_action_date, '%a, %d %b %Y %H:%M:%S %z') except Exception: import sys a = sys.exc_info()
def items(self): itms = {} try: request = self._getRequestFromUrl(self.path) if self.path == request.user.username: return itms rep = tickets_reports.objects.get(active_record=True, pk=self._getReportFromUrl(self.path)) tic = get_ticket_model().objects.select_related('type', 'state', 'assigned', 'priority', 'customer').all() search_params, tic = build_ticket_search_ext(request, tic, json.loads(rep.search)) for item in tic: text = self._itemToICal(item) itms.update(self._parse(text, ICAL_TYPES)) except Exception: import sys a = sys.exc_info() return itms
def kanban(request): flows = ticket_flow.objects.all().order_by('type') columns = [] finish_state = -1 days = UserProfile.objects.get(user=request.user).day_since_closed_tickets query = get_ticket_model().objects.select_related('type', 'state', 'assigned', 'priority', 'customer').all() for flow in flows: search_params, flow.data = build_ticket_search_ext(request, query, convert_sarch({'state': flow.pk})) flow.data = flow.data.filter(Q(show_start=None) | Q(show_start__lte=timezone.now())) if flow.type == 2: flow.data = flow.data.filter(Q(assigned=None) | Q(assigned=request.user)).order_by('-close_date') else: flow.data = flow.data.filter(Q(assigned=None) | Q(assigned=request.user)).extra(select={'prio': 'COALESCE(caldav, 10)'}, order_by=['prio', '-c_date']) if flow.type == 1: columns.insert(0, flow) else: columns.append(flow) if flow.type == 2: finish_state = flow.pk flow.data = flow.data.filter(close_date__gte=datetime.date.today() - datetime.timedelta(days=days)) seen_elements = {} seen = tickets_participants.objects.filter(user=request.user, ticket__in=flow.data.values_list('id', flat=True)).values_list('ticket_id', 'seen') for see in seen: seen_elements[see[0]] = see[1] seen = tickets_ignorants.objects.filter(user=request.user, ticket__in=flow.data.values_list('id', flat=True)).values_list('ticket_id') for see in seen: seen_elements[see[0]] = True flow.seen = seen_elements close = TicketCloseForm() reassign = TicketReassignForm() edges = ticket_flow_edges.objects.all().order_by('now') add_breadcrumbs(request, 0, 'k') cur_language = translation.get_language() return render(request, 'board/kanban.html', {'layout': 'horizontal', 'columns': columns, 'edges': edges, 'finish_state': finish_state, 'close': close, 'reassign': reassign, 'cur_language': cur_language})
def is_leaf(cls, path): """Return ``True`` if relative ``path`` is a leaf. A leaf is a WebDAV collection whose members are not collections. """ result = False if '.ics' in path: try: request = cls._getRequestFromUrl(path) rep = tickets_reports.objects.get(active_record=True, pk=cls._getReportFromUrl(path)) tic = get_ticket_model().objects.select_related('type', 'state', 'assigned', 'priority', 'customer').all() search_params, tic = build_ticket_search_ext(request, tic, json.loads(rep.search)) result = (tic.exists()) except Exception: import sys a = sys.exc_info() return result
def table(request, **kwargs): def pretty_condition(condition): if condition == 'AND': return _('AND') else: return _('OR') def pretty_operator(operator): if operator == 'is_null': return _('is null') elif operator == 'is_not_null': return _('is not null') elif operator == 'equal': return _('equal') elif operator == 'not_equal': return _('not equal') elif operator == 'begins_with': return _('begins with') elif operator == 'not_begins_with': return _('not begins with') elif operator == 'contains': return _('contains') elif operator == 'not_contains': return _('not contains') elif operator == 'ends_with': return _('ends with') elif operator == 'not_ends_with': return _('not ends with') elif operator == 'is_empty': return _('is empty') elif operator == 'is_not_empty': return _('is not empty') elif operator == 'less_or_equal': return _('less or equal') elif operator == 'less': return _('less') elif operator == 'greater_or_equal': return _('greater or equal') elif operator == 'greater': return _('greater') elif operator == 'between': return _('between') elif operator == 'not_between': return _('not between') return operator def pretty_value(value): if value is None: return '' if isinstance(value, (bool)): if value: return _('yes') else: return _('no') return unicode(value) def formatQuery(rules, condition): result = '(' for rule in rules: if 'rules' in rule: result = ( '%s %s %s' % (result, pretty_condition(condition), formatQuery(rule['rules'], rule['condition']))).strip() continue param = ('%s %s %s' % (rule['label'], pretty_operator(rule['operator']), pretty_value(rule['value']))).strip() if result != '(': result = '%s %s %s' % (result, pretty_condition(condition), param) else: result = ('%s%s' % (result, param)).strip() return '%s)' % result tic = get_ticket_model().objects.select_related('type').all() if 'search' in kwargs: is_search = True search_params, tic = build_ticket_search_ext(request, tic, kwargs['search']) else: tic = tic.filter(closed=False).order_by('-id') search_params = convert_sarch({'closed': False}) is_search = False list_caption = kwargs.get('list_caption') if 'report' in request.GET: list_caption = tickets_reports.objects.get( pk=request.GET['report']).name paginator = Paginator(tic, 20) page = request.GET.get('page') try: tic_lines = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. tic_lines = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. tic_lines = paginator.page(paginator.num_pages) board_form = AddToBordForm() board_form.fields['board'].queryset = board_form.fields[ 'board'].queryset.filter(c_user=request.user) pretty_params = prettyValues(copy.deepcopy(search_params)) pretty_query = formatQuery(pretty_params['rules'], pretty_params['condition']) return render( request, 'tickets/list.html', { 'lines': tic_lines, 'is_search': is_search, 'search_params': pretty_params, 'list_caption': list_caption, 'board_form': board_form, 'query': json.dumps(search_params), 'sql': tic.query, 'pretty_query': pretty_query })
def show_board(request, name): # http://bootsnipp.com/snippets/featured/kanban-board """ board structure [ { 'column': 'closed', 'query': {'closed': False}, 'limit': 10, 'extra_filter': 1, # 1 = days since closed, 2 = days since created, 3 = days since last changed, 4 days since last action 'days': 1, # days 'order_by': 'id', 'order_dir': '' } ] """ name = unquote_plus(name) if request.method == 'POST': if 'method' in request.POST: board = boards.objects.get(active_record=True, pk=request.POST['board'], c_user=request.user) try: columns = json.loads(board.columns) except: columns = [] if request.POST['method'] == 'add': form = AddToBordForm(request.POST) if form.is_valid(): cd = form.cleaned_data col = { 'column': cd['column'], 'query': request.session['last_search'], 'limit': cd['limit'], 'order_by': cd['order_by'], 'order_dir': cd['order_dir'] } if cd.get('extra_filter') and cd.get('days'): col['extra_filter'] = cd['extra_filter'] col['days'] = cd['days'] columns.append(col) board.columns = json.dumps(columns, cls=DjangoJSONEncoder) board.save(user=request.user) else: err_list = [] for field in form: for err in field.errors: err_list.append('%s: %s' % (field.name, err)) messages.add_message( request, messages.ERROR, _('data invalid: %s') % '\n'.join(err_list)) return HttpResponseRedirect('/board/%s/' % urlquote_plus(board.name)) else: if request.POST['boardname'].strip() != '': if boards.objects.filter(active_record=True, c_user=request.user, name=request.POST['boardname']).count( ) == 0 and request.POST['boardname']: board = boards() board.name = request.POST['boardname'].strip() board.save(user=request.user) return HttpResponseRedirect( '/board/%s/' % urlquote_plus(request.POST['boardname'])) else: messages.add_message( request, messages.ERROR, _(u'A board with the name "%s" already exists' % request.POST['boardname'])) return HttpResponseRedirect('/') else: messages.add_message(request, messages.ERROR, _(u'No name for a board given')) return HttpResponseRedirect('/') else: board = boards.objects.get(active_record=True, name=name, c_user=request.user) try: columns = json.loads(board.columns) except: columns = [] if 'method' in request.GET and request.GET['method'] == 'del': new_columns = [] for col in columns: if col['column'] != request.GET['column']: new_columns.append(col) board.columns = json.dumps(new_columns, cls=DjangoJSONEncoder) board.save(user=request.user) return HttpResponseRedirect('/board/%s/' % urlquote_plus(name)) elif 'method' in request.GET and request.GET['method'] == 'delete': board.delete(user=request.user) return HttpResponseRedirect('/') for column in columns: query = get_ticket_model().objects.select_related( 'type', 'state', 'assigned', 'priority', 'customer').all() search_params, query = build_ticket_search_ext(request, query, column['query']) column['query'] = query.order_by( '%s%s' % (column.get('order_dir', ''), column.get('order_by', 'id'))) if 'extra_filter' in column and 'days' in column and column[ 'extra_filter'] and column['days']: if column['extra_filter'] == '1': # days since closed column['query'] = column['query'].filter( close_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])).exclude( close_date=None) if column['extra_filter'] == '2': # days since created column['query'] = column['query'].filter( c_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])) if column['extra_filter'] == '3': # days since last changed column['query'] = column['query'].filter( u_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])) if column['extra_filter'] == '4': # days since last action column['query'] = column['query'].filter( last_action_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])) if not request.user.is_staff: column['query'] = column['query'].filter( customer=request.organisation) seen_elements = {} seen = tickets_participants.objects.filter( user=request.user, ticket__in=column['query'].values_list('id', flat=True)).values_list( 'ticket_id', 'seen') for see in seen: seen_elements[see[0]] = see[1] seen = tickets_ignorants.objects.filter( user=request.user, ticket__in=column['query'].values_list( 'id', flat=True)).values_list('ticket_id') for see in seen: seen_elements[see[0]] = True if column['limit']: column['query'] = column['query'][:column['limit']] column['seen'] = seen_elements add_breadcrumbs(request, board.pk, '$') return render(request, 'board/view.html', { 'columns': columns, 'board': board })
def kanban(request): flows = ticket_flow.objects.all().order_by('type') columns = [] finish_state = -1 days = UserProfile.objects.get(user=request.user).day_since_closed_tickets query = get_ticket_model().objects.select_related('type', 'state', 'assigned', 'priority', 'customer').all() for flow in flows: search_params, flow.data = build_ticket_search_ext( request, query, convert_sarch({'state': flow.pk})) flow.data = flow.data.filter( Q(show_start=None) | Q(show_start__lte=timezone.now())) if flow.type == 2: flow.data = flow.data.filter( Q(assigned=None) | Q(assigned=request.user)).order_by('-close_date') else: flow.data = flow.data.filter( Q(assigned=None) | Q(assigned=request.user)).extra( select={'prio': 'COALESCE(caldav, 10)'}, order_by=['prio', '-c_date']) if flow.type == 1: columns.insert(0, flow) else: columns.append(flow) if flow.type == 2: finish_state = flow.pk flow.data = flow.data.filter( close_date__gte=datetime.date.today() - datetime.timedelta(days=days)) seen_elements = {} seen = tickets_participants.objects.filter( user=request.user, ticket__in=flow.data.values_list('id', flat=True)).values_list( 'ticket_id', 'seen') for see in seen: seen_elements[see[0]] = see[1] seen = tickets_ignorants.objects.filter( user=request.user, ticket__in=flow.data.values_list( 'id', flat=True)).values_list('ticket_id') for see in seen: seen_elements[see[0]] = True flow.seen = seen_elements close = TicketCloseForm() reassign = TicketReassignForm() edges = ticket_flow_edges.objects.all().order_by('now') add_breadcrumbs(request, 0, 'k') cur_language = translation.get_language() return render( request, 'board/kanban.html', { 'layout': 'horizontal', 'columns': columns, 'edges': edges, 'finish_state': finish_state, 'close': close, 'reassign': reassign, 'cur_language': cur_language })
def table(request, **kwargs): def pretty_condition(condition): if condition == 'AND': return _('AND') else: return _('OR') def pretty_operator(operator): if operator == 'is_null': return _('is null') elif operator == 'is_not_null': return _('is not null') elif operator == 'equal': return _('equal') elif operator == 'not_equal': return _('not equal') elif operator == 'begins_with': return _('begins with') elif operator == 'not_begins_with': return _('not begins with') elif operator == 'contains': return _('contains') elif operator == 'not_contains': return _('not contains') elif operator == 'ends_with': return _('ends with') elif operator == 'not_ends_with': return _('not ends with') elif operator == 'is_empty': return _('is empty') elif operator == 'is_not_empty': return _('is not empty') elif operator == 'less_or_equal': return _('less or equal') elif operator == 'less': return _('less') elif operator == 'greater_or_equal': return _('greater or equal') elif operator == 'greater': return _('greater') elif operator == 'between': return _('between') elif operator == 'not_between': return _('not between') return operator def pretty_value(value): if value is None: return '' if isinstance(value, (bool)): if value: return _('yes') else: return _('no') return unicode(value) def formatQuery(rules, condition): result = '(' for rule in rules: if 'rules' in rule: result = ('%s %s %s' % (result, pretty_condition(condition), formatQuery(rule['rules'], rule['condition']))).strip() continue param = ('%s %s %s' % (rule['label'], pretty_operator(rule['operator']), pretty_value(rule['value']))).strip() if result != '(': result = '%s %s %s' % (result, pretty_condition(condition), param) else: result = ('%s%s' % (result, param)).strip() return '%s)' % result tic = get_ticket_model().objects.select_related('type').all() if 'search' in kwargs: is_search = True search_params, tic = build_ticket_search_ext(request, tic, kwargs['search']) else: tic = tic.filter(closed=False).order_by('-id') search_params = convert_sarch({'closed':False}) is_search = False list_caption = kwargs.get('list_caption') if 'report' in request.GET: list_caption = tickets_reports.objects.get(pk=request.GET['report']).name paginator = Paginator(tic, 20) page = request.GET.get('page') try: tic_lines = paginator.page(page) except PageNotAnInteger: # If page is not an integer, deliver first page. tic_lines = paginator.page(1) except EmptyPage: # If page is out of range (e.g. 9999), deliver last page of results. tic_lines = paginator.page(paginator.num_pages) board_form = AddToBordForm() board_form.fields['board'].queryset = board_form.fields['board'].queryset.filter(c_user=request.user) pretty_params = prettyValues(copy.deepcopy(search_params)) pretty_query = formatQuery(pretty_params['rules'], pretty_params['condition']) return render(request, 'tickets/list.html', {'lines': tic_lines, 'is_search': is_search, 'search_params': pretty_params, 'list_caption': list_caption, 'board_form': board_form, 'query': json.dumps(search_params), 'sql': tic.query, 'pretty_query': pretty_query})
def show_board(request, name): # http://bootsnipp.com/snippets/featured/kanban-board """ board structure [ { 'column': 'closed', 'query': {'closed': False}, 'limit': 10, 'extra_filter': 1, # 1 = days since closed, 2 = days since created, 3 = days since last changed, 4 days since last action 'days': 1, # days 'order_by': 'id', 'order_dir': '' } ] """ if request.method == 'POST': if 'method' in request.POST: board = boards.objects.get(active_record=True, pk=request.POST['board'], c_user=request.user) try: columns = json.loads(board.columns) except: columns = [] if request.POST['method'] == 'add': form = AddToBordForm(request.POST) if form.is_valid(): cd = form.cleaned_data col = { 'column': cd['column'], 'query': request.session['last_search'], 'limit': cd['limit'], 'order_by': cd['order_by'], 'order_dir': cd['order_dir'] } if cd.get('extra_filter') and cd.get('days'): col['extra_filter'] = cd['extra_filter'] col['days'] = cd['days'] columns.append(col) board.columns = json.dumps(columns, cls=DjangoJSONEncoder) board.save(user=request.user) else: err_list = [] for field in form: for err in field.errors: err_list.append('%s: %s' % (field.name, err)) messages.add_message(request, messages.ERROR, _('data invalid: %s') % '\n'.join(err_list)) return HttpResponseRedirect('/board/%s/' % urlquote_plus(board.name)) else: if request.POST['boardname'].strip() != '': if boards.objects.filter(active_record=True, c_user=request.user, name=request.POST['boardname']).count() == 0 and request.POST['boardname']: board = boards() board.name = request.POST['boardname'].strip() board.save(user=request.user) return HttpResponseRedirect('/board/%s/' % urlquote_plus(request.POST['boardname'])) else: messages.add_message(request, messages.ERROR, _(u'A board with the name "%s" already exists' % request.POST['boardname'])) return HttpResponseRedirect('/') else: messages.add_message(request, messages.ERROR, _(u'No name for a board given')) return HttpResponseRedirect('/') else: board = boards.objects.get(active_record=True, name=name, c_user=request.user) try: columns = json.loads(board.columns) except: columns = [] if 'method' in request.GET and request.GET['method'] == 'del': new_columns = [] for col in columns: if col['column'] != request.GET['column']: new_columns.append(col) board.columns = json.dumps(new_columns, cls=DjangoJSONEncoder) board.save(user=request.user) return HttpResponseRedirect('/board/%s/' % urlquote_plus(name)) elif 'method' in request.GET and request.GET['method'] == 'delete': board.delete(user=request.user) return HttpResponseRedirect('/') for column in columns: query = get_ticket_model().objects.select_related('type', 'state', 'assigned', 'priority', 'customer').all() search_params, query = build_ticket_search_ext(request, query, column['query']) column['query'] = query.order_by('%s%s' % (column.get('order_dir', ''), column.get('order_by', 'id'))) if 'extra_filter' in column and 'days' in column and column['extra_filter'] and column['days']: if column['extra_filter'] == '1': # days since closed column['query'] = column['query'].filter(close_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])).exclude(close_date=None) if column['extra_filter'] == '2': # days since created column['query'] = column['query'].filter(c_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])) if column['extra_filter'] == '3': # days since last changed column['query'] = column['query'].filter(u_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])) if column['extra_filter'] == '4': # days since last action column['query'] = column['query'].filter(last_action_date__gte=datetime.date.today() - datetime.timedelta(days=column['days'])) if not request.user.is_staff: column['query'] = column['query'].filter(customer=request.organisation) seen_elements = {} seen = tickets_participants.objects.filter(user=request.user, ticket__in=column['query'].values_list('id', flat=True)).values_list('ticket_id', 'seen') for see in seen: seen_elements[see[0]] = see[1] seen = tickets_ignorants.objects.filter(user=request.user, ticket__in=column['query'].values_list('id', flat=True)).values_list('ticket_id') for see in seen: seen_elements[see[0]] = True if column['limit']: column['query'] = column['query'][:column['limit']] column['seen'] = seen_elements add_breadcrumbs(request, board.pk, '$') return render(request, 'board/view.html', {'columns': columns, 'board': board})