コード例 #1
0
    def handle(self, *args, **options):

        categories = [c[0] for c in TICKET_CATEGORY]

        tickets = Ticket.objects.filter(is_deleted=False)
        for ticket in tickets:
            if ticket.ticket_category not in categories:
                log_error('{} {} {}'.format(ticket.id, ticket.ticket_category,
                                            generate_ticket_link(ticket)))
                ticket.ticket_category = ticket.ticket_category.upper()
                ticket.save()
コード例 #2
0
ファイル: send_sms.py プロジェクト: syntrydy/gluru
    def send_notification(self, notification_send_time, issue_type, client,
                          ticket):
        if ticket.date_added.date() == datetime.date.today():
            now = timezone.now()
            time_diff = now - ticket.date_added
            ticket_notification = self.check_notification_sent(ticket)
            if ticket_notification:

                if time_diff > datetime.timedelta(
                        minutes=notification_send_time
                ) and not ticket_notification.is_txt_sent and not ticket_notification.is_try:
                    ticket_answer = Answer.objects.filter(ticket_id=ticket)

                    if not len(ticket_answer):
                        try:
                            for issue in ISSUE_TYPE:
                                if issue[0] == issue_type:
                                    issue_type = issue[1]

                            for sms in SMS_NUMBERS:
                                message = client.messages.create(
                                    to=sms[1],
                                    from_="Your contact number",
                                    body=
                                    "Hello {0}, {1} from {2} has just opened a {3} on Gluu support:(https://support.gluu.org{4}). "
                                    "Please respond ASAP. "
                                    "Thanks! - Gluu Team".format(
                                        sms[0], ticket.created_by,
                                        ticket.company_association, issue_type,
                                        generate_ticket_link(ticket)))
                                if message.sid:
                                    log_message = 'SMS notification with ticket name:{} sent to staff member: {}'
                                    log_message = log_message.format(
                                        ticket.title, sms[0])
                                    ticket_notification.is_try = 1
                                    ticket_notification.save()
                                    print "sms sent"

                        except Exception as e:
                            pass
コード例 #3
0
ファイル: views.py プロジェクト: syntrydy/gluru
def generate_ticket_url(ticket):

    url = generate_ticket_link(ticket)
    return '{}{}'.format(get_base_url(), url)
コード例 #4
0
ファイル: forms.py プロジェクト: syntrydy/gluru
    def __init__(self, user='******', *args, **kwargs):

        super(UserTicketForm, self).__init__(*args, **kwargs)
        self.uploaded_products_layout = Layout()

        # if user:
        #     data = get_last_ticket_data(user)
        #     if data:
        #         if data[0] != "N/A":
        #             self.fields['gluu_server_version'].initial = data[0]
        #         if data[1] != None:
        #             self.fields['os_version'].initial = data[1]
        #         if data[2] != "":
        #             self.fields['os_version_name'].initial = data[2]
        # data = None
        if user:
            data = get_last_ticket_data(user)

        if data:
            self.fields['gluu_server_version'].initial = data[0] if data[0] != "N/A" else ""
            self.fields['os_version'].initial = data[1] if data[1] != None else ""
            self.fields['os_version_name'].initial = data[2] if data[2] != "" else 0
            self.fields['gluu_server_version_comments'].initial = data[3] if data[3] != "" else 0
        self.fields['send_copy'].label = "CC Colleagues"
        self.fields['title'].label = "Subject"
        self.button_layout[0][0] = Submit('save', 'Submit')
        self.button_layout[0][1] = HTML(
            '<a class="btn btn-danger" href="{% url \'home\'%}" id="cancelButton">Cancel</a>')

        if self.instance.id:
            self.button_layout[0][0] = Submit('save', 'Save')
            self.button_layout[0][1] = HTML(
                '<a class="btn btn-danger" href="{}" id="cancelButton">Cancel</a>'.format(
                    generate_ticket_link(self.instance)))
            if self.instance.product_ticket_id.all():

                for ticket in self.instance.product_ticket_id.all():
                    if ticket.ios_version_name:
                        html= HTML('''
                            <div class="product_layout_div"> <div id="div_id_product" class="form-group col-md-3 for-margin"> <label for="id_product" class="control-label  requiredField">
                                        Select Product<span class="star">*</span> </label> {} </div> <div id="div_id_product_version" class="form-group col-md-2 for-margin"> <label for="id_product_version" class="control-label  requiredField">
                                        Product Version<span class="star">*</span> </label> {} </div> <div id="div_id_product_os_version" class="form-group col-md-2 for-margin"> <label for="id_product_os_version" class="control-label  requiredField">
                                        Operating System<span class="star">*</span> </label> {} </div> <div id="div_id_product_os_version_name" style="width:128px;" class="form-group col-md-1 for-margin os_version_icon"> <label for="id_product_os_version_name" class="control-label  requiredField">
                                        Android Version<span class="star">*</span></label> <div class="controls "> <input class="numberinput form-control product_os_version_name" id="id_product_os_version_name" name="product_os_version_name" value={} step="any" type="number"> </div></div><div id="div_id_ios_version_name" class="form-group col-md-1 os_version_icon fadeIn animated" style="width:100px;"> <label for="id_ios_version_name" class="control-label ">
                                        iOS Version</label> <div class="controls "> <input class="ios_version_name numberinput form-control" value={} id="id_ios_version_name" name="ios_version_name" step="any" type="number"> </div> </div>
                                        <div class="col-md-1 remove"><a class="delete_product_row" href="javascript:void(0);"></a></div></div>
                        '''.format(product_select_list(ticket.product),product_version_select_list(ticket.product_version),product_os_version_select_list(ticket.product_os_version),ticket.product_os_version_name,ticket.ios_version_name))
                    else:
                        html = HTML('''
                            <div class="product_layout_div"> <div id="div_id_product" class="form-group col-md-3 for-margin"> <label for="id_product" class="control-label  requiredField">
                                        Select Product<span class="star">*</span> </label> {} </div> <div id="div_id_product_version" class="form-group col-md-3 for-margin"> <label for="id_product_version" class="control-label  requiredField">
                                        Product Version<span class="star">*</span> </label> {} </div> <div id="div_id_product_os_version" class="form-group col-md-3 for-margin"> <label for="id_product_os_version" class="control-label  requiredField">
                                        Operating System<span class="star">*</span> </label> {} </div> <div id="div_id_product_os_version_name" class="form-group col-md-2 for-margin os_version_icon"> <label for="id_product_os_version_name" class="control-label  requiredField">
                                        OS Version<span class="star">*</span></label> <div class="controls "> <input class="numberinput form-control product_os_version_name" id="id_product_os_version_name" name="product_os_version_name" value={} step="any" type="number"> </div></div><div id="div_id_ios_version_name" class="form-group col-md-1 os_version_icon hidden fadeIn animated" style="width:100px;"> <label for="id_ios_version_name" class="control-label ">
                                        iOS Version</label> <div class="controls "> <input class="ios_version_name numberinput form-control"  id="id_ios_version_name" name="ios_version_name" step="any" type="number"> </div> </div>
                                        <div class="col-md-1 remove"><a class="delete_product_row" href="javascript:void(0);"></a></div></div>
                        '''.format(product_select_list(ticket.product),product_version_select_list(ticket.product_version),product_os_version_select_list(ticket.product_os_version),ticket.product_os_version_name))

                    self.uploaded_products_layout.append(
                        html
                    )
            # if self.instance.ticket_id.all():
            #     for ticket in self.instance.ticket_id.all():
            #         self.uploaded_classification_layout.append(
            #             HTML('''
            #                 <div class="gluu_layout_div"> <div id="div_id_gluu_server_version" class="form-group col-md-4"> <label for="id_gluu_server_version" class="control-label  requiredField">
            #                 Gluu Server Version<span class="star">*</span> </label> {} </div> <div id="div_id_os_version" class="form-group col-md-4"> <label for="id_os_version" class="control-label  requiredField">
            #                 Operating System<span class="star">*</span> </label> {} </div> <div id="div_id_os_version_name" class="form-group col-md-3 os_version_icon"> <label for="id_os_version_name" class="control-label  requiredField">
            #                 OS Version<span class="star">*</span> </label> <div class="controls "> <input class="numberinput form-control os_version_name" id="id_os_version_name" name="os_version_name" value={} step="any" type="number"> </div> </div>
            #                 <div class="col-md-1 remove"><a class="delete_gluu_row" href="javascript:void(0);"></a></div></div>
            #             '''.format(gluu_server_version_select_list (ticket.gluu_server_version),gluu_os_version_list(ticket.os_version),ticket.os_version_name)
            #                 )
            #         )

        self.helper = FormHelper(self)
        self.helper.form_class = 'form-horizontal ticket_form'
        self.helper.help_text_inline = True
        self.helper.layout = Layout(
            # self.uploaded_classification_layout,
            self.classification_layout,
            self.uploaded_products_layout,
            self.product_layout,
            self.description_layout,
            self.category_layout,
            self.additional_layout,
            self.button_layout
        )
コード例 #5
0
ファイル: gluu_tags.py プロジェクト: syntrydy/gluru
def get_link(value):
    return generate_ticket_link(value)
コード例 #6
0
def dashboard(request, page_type=''):

    u = request.user

    q = [Q(is_deleted=False)]
    exq = []
    filter_by_page = []

    columns = [
        'id', 'title', 'ticket_category', 'status', 'issue_type', 'date_added',
        'assigned_to__first_name'
    ]

    order_dash = ['-id']

    if page_type == 'my-assignments' and u.is_admin:
        q.append(Q(assigned_to=u))
        exq.append(Q(status='closed'))

    elif page_type == 'in-progress-tickets' and u.is_admin:
        q.append(Q(assigned_to=u) & Q(status="inprogress"))

    elif page_type == 'pending-tickets' and u.is_admin:
        q.append(Q(assigned_to=u) & Q(status="pending"))

    elif page_type == 'unassigned' and u.is_admin:
        q.append(Q(assigned_to__isnull=True))
        exq.append(Q(status='closed'))

    elif page_type == 'open-tickets' and u.is_admin:
        exq.append(Q(status='closed'))

    elif page_type == 'closed-tickets' and u.is_admin:
        q.append(Q(status='closed'))

    elif page_type == 'my-alerts':
        q.append(Q(ticket_alerts__user=u))

    elif page_type == 'my-tickets':
        q.append((Q(created_by=u) & Q(created_for=None)) | Q(created_for=u))

    elif page_type == 'my-named-tickets' and u.is_named:
        q.append(Q(company_association=u.company_association))

    elif page_type == 'named-open-tickets' and u.is_named:
        q.append(Q(company_association=u.company_association))
        exq.append(Q(status='closed'))

    elif page_type == 'named-closed-tickets' and u.is_named:
        q.append(
            Q(company_association=u.company_association) & Q(status='closed'))

    elif page_type == 'my-open-tickets':
        q.append((Q(created_by=u) & Q(created_for=None)) | Q(created_for=u))
        exq.append(Q(status='closed'))

    elif page_type == 'my-closed-tickets':
        q.append(((Q(created_by=u) & Q(created_for=None)) | Q(created_for=u))
                 & Q(status='closed'))

    elif page_type == 'partner-tickets':
        client = request.GET.get('partner', None)
        if client:
            q.append(Q(company_association__name=client))

    elif page_type == 'company-users':
        return add_company_user(request)

    elif page_type == 'company-partners':
        return add_company_partner(request)

    elif page_type == 'company-booking':
        return book_meeting(request)

    elif page_type == 'my-profile':
        return my_profile(request)

    elif page_type == 'oxd-config':
        return oxd_form(request)

    elif page_type == 'all-tickets' and u.is_admin:
        pass

    elif page_type == 'view-users' and u.is_admin:
        return view_users(request, page_type)

    else:
        messages.error(request,
                       _('You are not authorized to see requested page!'))

        return HttpResponseRedirect(
            reverse('profile:dashboard', kwargs={'page_type': 'my-tickets'}))

    filters = FilterTicketsForm(request.GET, user=request.user)

    if filters.is_valid():

        if filters.cleaned_data['named']:
            q.append((Q(created_by__crm_type='named') & Q(created_for=None))
                     | Q(created_for__crm_type='named'))

        if filters.cleaned_data['status']:
            q.append(Q(status__in=filters.cleaned_data['status']))

        if filters.cleaned_data['category']:
            q.append(Q(ticket_category__in=filters.cleaned_data['category']))

        if filters.cleaned_data['issue_type']:
            if 'community' in filters.cleaned_data['issue_type']:
                q.append(
                    Q(issue_type__in=filters.cleaned_data['issue_type'])
                    | Q(issue_type=''))
            else:
                q.append(Q(issue_type__in=filters.cleaned_data['issue_type']))

        if filters.cleaned_data['company']:
            q.append(
                (Q(created_by__company__in=filters.cleaned_data['company'])
                 & Q(created_for=None))
                | Q(created_for__company__in=filters.cleaned_data['company']))

        if filters.cleaned_data['assigned_to']:
            q.append(Q(assigned_to__in=filters.cleaned_data['assigned_to']))

        if filters.cleaned_data['created_by']:

            q.append((Q(created_by__in=filters.cleaned_data['created_by'])
                      & Q(created_for=None))
                     | Q(created_for__in=filters.cleaned_data['created_by']))

        if filters.cleaned_data['created_date'] or filters.cleaned_data[
                'created_filters']:

            dd = filters.cleaned_data['created_date']
            now = timezone.now()
            today = now.date()

            if filters.cleaned_data['created_filters'] == "eq" and dd:
                s, f = cstm_dates(dd, dd)
                q.append(Q(date_added__gte=s) & Q(date_added__lte=f))

            if filters.cleaned_data['created_filters'] == "not_eq" and dd:
                s, f = cstm_dates(dd, dd)
                q.append(Q(date_added__lt=s) & Q(date_added__gt=f))

            if filters.cleaned_data['created_filters'] == "gt" and dd:
                q.append(Q(date_added__gt=dd))

            if filters.cleaned_data['created_filters'] == "lt" and dd:
                q.append(Q(date_added__lt=dd))

            if filters.cleaned_data['created_filters'] == "last_7_days":
                last_7_days = now.date() - timedelta(days=7)
                s, f = cstm_dates(last_7_days, today)
                q.append(Q(date_added__gte=s) & Q(date_added__lte=f))

            if filters.cleaned_data['created_filters'] == "last_30_days":
                last_30_days = now.date() - timedelta(days=30)
                s, f = cstm_dates(last_30_days, today)
                q.append(Q(date_added__gte=s) & Q(date_added__lte=f))

            if filters.cleaned_data['created_filters'] == "last_month":
                first_last_month = today.replace(month=today.month - 1, day=1)
                last_last_month = today.replace(month=today.month, day=1)
                s, f = cstm_dates(first_last_month, last_last_month)
                q.append(Q(date_added__gte=s) & Q(date_added__lt=f))

            if filters.cleaned_data['created_filters'] == "this_month":
                this_month = today.replace(day=1)
                next_month = today.replace(month=today.month + 1, day=1)
                s, f = cstm_dates(this_month, next_month)
                q.append(Q(date_added__gte=s) & Q(date_added__lte=f))

            if filters.cleaned_data['created_filters'] == "last_year":
                last_year = today.replace(year=today.year - 1, month=1, day=1)
                q.append(Q(date_added__year=last_year.year))

            if filters.cleaned_data['created_filters'] == "this_year":
                q.append(Q(date_added__year=today.year))

    filter_by_page = q

    # TODO Decouple from the rest
    if request.method == 'POST':
        user_filters = []

        if 'search[value]' in request.POST and len(
                request.POST['search[value]']) >= 3:
            search_value = request.POST['search[value]'].strip()

            if len(search_value) == 3 and len(search_value.split(' ')) > 1:
                for word in search_value.split(' '):
                    user_filters.extend([
                        (Q(created_by__first_name=word) & Q(created_for=None))
                        | Q(created_for__first_name=word) |
                        (Q(created_by__last_name=word) & Q(created_for=None))
                        | Q(created_for__last_name=word)
                        | Q(assigned_to__first_name=word)
                    ])
            else:
                q.extend([
                    Q(id__icontains=request.POST['search[value]']) |
                    (Q(created_by__first_name=request.POST['search[value]'])
                     & Q(created_for=None))
                    | Q(created_for__first_name=request.POST['search[value]'])
                    | (Q(created_by__last_name=request.POST['search[value]'])
                       & Q(created_for=None))
                    | Q(created_for__last_name=request.POST['search[value]']) |
                    (Q(created_by__email__icontains=search_value)
                     & Q(created_for=None))
                    | Q(created_for__email__icontains=search_value)
                    | Q(ticket_category=request.POST['search[value]'])
                    | Q(status__icontains=request.POST['search[value]'])
                    | Q(issue_type__icontains=request.POST['search[value]'])
                    | Q(title__icontains=request.POST['search[value]'])
                    | Q(assigned_to__first_name__icontains=request.
                        POST['search[value]'])
                    # Q(["CONCAT_WS(' ', profiles_userprofile.first_name, profiles_userprofile.last_name) like '"+request.POST['search[value]']+"' "])
                ])

        if 'order[0][column]' in request.POST:
            order_sign = '-' if request.POST['order[0][dir]'] == 'desc' else ''
            order_dash = [
                '%s%s' %
                (order_sign, columns[int(request.POST['order[0][column]'])])
            ]

        results = {
            "draw": request.POST['draw'],
            "recordsTotal": 0,
            "recordsFiltered": int(request.POST['length']),
            "data": []
        }
        cur = int(request.POST['start'])
        cur_length = int(request.POST['length']) + cur

        if len(user_filters) > 1:
            tickets = Ticket.objects.get_active(u).filter(*q).exclude(
                *exq).filter(*user_filters).order_by(
                    *order_dash)[cur:cur_length]
        else:
            tickets = Ticket.objects.get_active(u).filter(*q).exclude(
                *exq).order_by(*order_dash)[cur:cur_length]

        if len(user_filters) > 1:
            results['recordsTotal'] = Ticket.objects.get_active(u).filter(
                *filter_by_page).exclude(*exq).filter(*user_filters).count()
            results['recordsFiltered'] = Ticket.objects.get_active(u).filter(
                *q).exclude(*exq).filter(*user_filters).count()
        else:
            results['recordsTotal'] = Ticket.objects.get_active(u).filter(
                *filter_by_page).exclude(*exq).count()
            results['recordsFiltered'] = Ticket.objects.get_active(u).filter(
                *q).exclude(*exq).count()
        staff = UserProfile.objects.filter(
            is_active=True, crm_type__in=['staff', 'admin', 'manager'])

        for t in tickets:
            support_level = ""
            support_plan = crm_interface.get_support_plan(t.owned_by)
            if support_plan:
                support_level = support_plan.get('support_plan')
                if support_level == "blank":
                    support_level = "Community"
            else:
                if t.owned_by.get_company() == "Gluu":
                    support_level = "Staff"
                else:
                    support_level = "Community"
            ht = ''
            description = u'''
                <a style="display:block;font-size:15px;word-break: break-all;" href="{0}">{1}</a> by {2}
                <span data-toggle="tooltip" class="glyphicon glyphicon-info-sign" title="Company: {3} <br />
                    Support Level: {4} <br />
                    Last update by: {5} <br />
                    Last update: {6} <br />
                    Total responses: {7}">
                </span>'''.format(generate_ticket_link(t), t.title, t.owned_by,
                                  t.owned_by.get_company(), support_level,
                                  t.last_updated,
                                  get_fancy_time(t.date_modified),
                                  t.answers_no)

            if u.is_admin:
                ht = u'''<select data-ticket={0} class="dashboard_assign_staff" style="width:100px;" name="assigned_to">
                    <option selected value="">Assign ticket</option>'''.format(
                    t.id)
                for u in staff:
                    selected = ''
                    if t.assigned_to == u:
                        selected = 'selected'
                    ht += u'''<option {0} value="{1}">{2}</option>'''.format(
                        selected, u.id, u)
                ht += '</select>'

            row = [
                t.id, description,
                t.get_ticket_category_display(),
                '<span class="label-table label-{0}">{1}</span>'.format(
                    t.status.lower(), t.status),
                '<span class="label-table label-{0}">{1}</span>'.format(
                    t.priority, t.priority), '{:%m-%d-%Y}'.format(t.date_added)
            ]
            if ht != '':
                row.append(ht)

            results["data"].append(row)

        return HttpResponse(json.dumps(results),
                            content_type="application/json")

    clients = Company.objects.filter(
        clients__is_deleted=False,
        clients__partner=request.user.company_association)
    support_details = {}
    try:
        support_details = utils.get_support_details(request)
    except (KeyError, TypeError) as e:

        log_crm(
            'Unexpected support plan value: {}, {}'.format(support_details, e),
            'ERROR')
        pass

    return render(
        request, 'profiles/dashboard.html', {
            'page': 'dashboard',
            'filters_form': filters,
            'page_type': page_type,
            'clients': clients,
            'support_details': support_details
        })