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()
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
def generate_ticket_url(ticket): url = generate_ticket_link(ticket) return '{}{}'.format(get_base_url(), url)
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 )
def get_link(value): return generate_ticket_link(value)
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 })