Пример #1
0
    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()
Пример #2
0
    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
Пример #3
0
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})
Пример #4
0
    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
Пример #5
0
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
        })
Пример #6
0
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
    })
Пример #7
0
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
        })
Пример #8
0
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})
Пример #9
0
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})