def get_feedbacks(user, status, priority, type, search=None):
    feedbacks = []
    if type == ALL or type is None:
        type_filter = get_list_from_set(FEEDBACK_TYPE)
    else:
        type_filter = [type]

    if priority == ALL or priority is None:
        priority_filter = get_list_from_set(DEMO_PRIORITY)
    else:
        priority_filter = [priority]

    if status is None or status == 'active':
        status_filter = ['Open', 'Pending', 'In Progress']
    else:
        if status == ALL:
            status_filter = get_list_from_set(FEEDBACK_STATUS)
        else:
            status_filter = [status]
    
    sa_id_list = []
    if user.groups.filter(name=Roles.DEALERS).exists():
        sa_list = get_model('ServiceAdvisor').objects.active_under_dealer(user)
        if sa_list:
            for sa in sa_list:
                sa_id_list.append(sa.service_advisor_id)
        sa_id_list.append(user)
        feedbacks = get_model('Feedback').objects.filter(reporter__name__in=sa_id_list, status__in=status_filter,
                                                       priority__in=priority_filter, type__in=type_filter
                                                    ).order_by('-created_date')
                                                    
    if user.groups.filter(name=Roles.DEALERADMIN).exists():
        dealers = get_model('Dealer').objects.all()
        for dealer in dealers:
            sa_id_list.append(dealer.dealer_id)
        sa_id_list.append(user)
    feedbacks = get_model('Feedback').objects.filter(reporter__name__in=sa_id_list, status__in=status_filter,
                                                       priority__in=priority_filter, type__in=type_filter
                                                    ).order_by('-created_date')    
        
    if user.groups.filter(name=Roles.ASCS).exists():
        sa_list = get_model('ServiceAdvisor').objects.active_under_asc(user)
        sa_id_list = []
        if sa_list:
            for sa in sa_list:
                sa_id_list.append(sa.service_advisor_id)
        sa_id_list.append(user)
        feedbacks = get_model('Feedback').objects.filter(reporter__name__in=sa_id_list, status__in=status_filter,
                                                       priority__in=priority_filter, type__in=type_filter
                                                    ).order_by('-created_date')
    if user.groups.filter(name=Roles.SDMANAGERS).exists():
        feedbacks = get_model('Feedback').objects.filter(status__in=status_filter, priority__in=priority_filter,
                                                   type__in=type_filter).order_by('-created_date')
    if user.groups.filter(name=Roles.SDOWNERS).exists():
        user_profile = get_model('UserProfile').objects.filter(user=user)
        servicedesk_user = get_model('ServiceDeskUser').objects.filter(user_profile=user_profile[0])
        feedbacks = get_model('Feedback').objects.filter(assignee=servicedesk_user[0], status__in=status_filter,
                                                   priority__in=priority_filter, type__in=type_filter).order_by('-created_date')

    return feedbacks
def modify_servicedesk_tickets(request, feedback_id):
    host = get_current_site(request)
    group_name = request.user.groups.filter(name__in=[Roles.SDMANAGERS, Roles.SDOWNERS, Roles.DEALERS, Roles.ASCS, Roles.SDREADONLY, Roles.FSCADMINS])
    status = get_list_from_set(FEEDBACK_STATUS)
    priority_types = get_list_from_set(PRIORITY)
    feedback_types = get_list_from_set(FEEDBACK_TYPE)
    root_cause = get_list_from_set(ROOT_CAUSE)
    feedback_obj = get_feedback(feedback_id, request.user)
    servicedesk_users = get_servicedesk_users(designation=[Roles.SDOWNERS,Roles.SDMANAGERS, Roles.SDREADONLY] )
    comments = get_comments(feedback_id)
    
    if request.method == 'POST':
        host = request.get_host()
        modify_feedback(feedback_obj, request.POST, request.user, host)
    if feedback_obj:
        return render(request, 'service-desk/ticket_modify.html',\
                  {"feedback": feedback_obj, "FEEDBACK_STATUS": status,\
                   "PRIORITY": priority_types,\
                    "FEEDBACK_TYPE": feedback_types,\
                    "ROOT_CAUSE" : root_cause,\
                   "group": group_name[0].name,\
                   'servicedeskuser': servicedesk_users,\
                   'comments': comments,\
                   'user':request.user
                   })
    else:
        return HttpResponseNotFound()
def get_servicedesk_tickets(request):
    groups = utils.stringify_groups(request.user)
    status = request.GET.get('status')
    priority = request.GET.get('priority')
    type = request.GET.get('type')
    search = request.GET.get('search')
    count = request.GET.get('count') or BY_DEFAULT_RECORDS_PER_PAGE
    page_details = {}
    feedback_obects = get_feedbacks(request.user, status, priority, type, search)
    paginator = Paginator(feedback_obects, count)
    page = request.GET.get('page', 1)
    feedbacks = paginator.page(page)
    page_details['total_objects'] = paginator.count
    page_details['from'] = feedbacks.start_index()
    page_details['to'] = feedbacks.end_index()
    training_material = models.Service.objects.filter(service_type__name=Services.SERVICE_DESK)
    if len(training_material)>0:
        training_material = training_material[0].training_material_url
    else:
        training_material = None

    return render(request, 'service-desk/tickets.html', {"feedbacks" : feedbacks,
                                          "status": utils.get_list_from_set(FEEDBACK_STATUS),
                                          "types": utils.get_list_from_set(FEEDBACK_TYPE),
                                          "priorities": utils.get_list_from_set(PRIORITY),
                                          "pagination_links": PAGINATION_LINKS,
                                          "page_details": page_details,
                                          "record_showing_counts": RECORDS_PER_PAGE,
                                          "training_material" : training_material,
                                          "groups":groups[0],
                                          "filter_params": {'status': status, 'priority': priority, 'type': type,
                                                            'count': str(count), 'search': search}}
                                        )
 def dehydrate(self, bundle):
     if PRIORITIES.has_key(settings.BRAND):
         priority =  PRIORITIES[settings.BRAND]
     else:
         priority =  PRIORITIES['bajaj']
         
     bundle.data['STATUS'] = get_list_from_set(FEEDBACK_STATUS)
     bundle.data['PRIORITY'] = get_list_from_set(priority)
     comments = models.Comment.objects.filter(feedback_object=bundle.data['id'])
     bundle.data['comments'] = [model_to_dict_for_datetime(c) for c in comments]
     
     return bundle
def service_desk(request):
    status = request.GET.get('status')
    priority = request.GET.get('priority')
    type = request.GET.get('type')
    search = request.GET.get('search')
    count = request.GET.get('count') or BY_DEFAULT_RECORDS_PER_PAGE
    page_details = {}
    feedback_obects = get_feedbacks(request.user, status, priority, type, search)
    paginator = Paginator(feedback_obects, count)
    page = request.GET.get('page', 1)
    feedbacks = paginator.page(page)
    page_details['total_objects'] = paginator.count
    page_details['from'] = feedbacks.start_index()
    page_details['to'] = feedbacks.end_index()
    groups = utils.stringify_groups(request.user)
    training_material = models.Service.objects.filter(service_type__name=Services.SERVICE_DESK)
    if len(training_material)>0:
        training_material = training_material[0].training_material_url
    else:
        training_material = None
    if request.method == 'GET':
        template = 'service-desk/feedback_details.html'
        data = None
        if request.user.groups.filter(name=Roles.DEALERS).exists():
            data = models.ServiceAdvisor.objects.active_under_dealer(request.user)
        else:
            data = models.ServiceAdvisor.objects.active_under_asc(request.user)
        dealer_asc_details = models.UserProfile.objects.get(user__username=request.user)
        return render(request, template, {"feedbacks" : feedbacks,
                                          'active_menu': 'support',
                                          "data": data, 'groups': groups,
                                          "status": utils.get_list_from_set(FEEDBACK_STATUS),
                                          "pagination_links": PAGINATION_LINKS,
                                          "page_details": page_details,
                                          "record_showing_counts": RECORDS_PER_PAGE,
                                          "types": utils.get_list_from_set(FEEDBACK_TYPE),
                                          "priorities": utils.get_list_from_set(PRIORITY),
                                          "training_material" : training_material,
                                          "dealer_asc" : dealer_asc_details,
                                          "filter_params": {'status': status, 'priority': priority, 'type': type,
                                                            'count': str(count), 'search': search}}
                                        )
    elif request.method == 'POST':
        try:
            data = save_help_desk_data(request)
            return HttpResponse(content=json.dumps(data),
                                content_type='application/json')
        except Exception as ex:
            LOG.error('Exception while saving data : {0}'.format(ex))
            return HttpResponseBadRequest()
    else:
        return HttpResponseBadRequest()
def service_desk(request):
    status = request.GET.get('status')
    priority = request.GET.get('priority')
    type = request.GET.get('type')
    search = request.GET.get('search')
    count = request.GET.get('count') or BY_DEFAULT_RECORDS_PER_PAGE
    page_details = {}
    feedback_obects = get_feedbacks(request.user, status, priority, type, search)
    paginator = Paginator(feedback_obects, count)
    page = request.GET.get('page', 1)
    feedbacks = paginator.page(page)
    page_details['total_objects'] = paginator.count
    page_details['from'] = feedbacks.start_index()
    page_details['to'] = feedbacks.end_index()
    groups = utils.stringify_groups(request.user)
    brand_departments = get_brand_departments()
    training_material = get_model('Service').objects.filter(service_type__name=Services.SERVICE_DESK)
    department_sub_categories= get_subcategories()
    if len(training_material)>0:
        training_material = training_material[0].training_material_url
    else:
        training_material = None
    if request.method == 'GET':
        template = 'portal/feedback_details.html'
        data = None
        if request.user.groups.filter(name=Roles.DEALERS).exists():
            data = get_model('ServiceAdvisor').objects.active_under_dealer(request.user)
        else:
            data = get_model('ServiceAdvisor').objects.active_under_asc(request.user)
        dealer_asc_details = get_model('UserProfile').objects.get(user__username=request.user)
        return render(request, template, {"feedbacks" : feedbacks,
                                          'active_menu': 'support',
                                          "data": data, 'groups': groups,
                                          "status": utils.get_list_from_set(FEEDBACK_STATUS),
                                          "pagination_links": PAGINATION_LINKS,
                                          "page_details": page_details,
                                          "departments": brand_departments,
                                          "department_sub_categories" : department_sub_categories,
                                          "record_showing_counts": RECORDS_PER_PAGE,
                                          "types": utils.get_list_from_set(FEEDBACK_TYPE),
                                          "priorities": utils.get_list_from_set(DEMO_PRIORITY),
                                          "training_material" : training_material,
                                          "dealer_asc" : dealer_asc_details,
                                          "filter_params": {'status': status, 'priority': priority, 'type': type,
                                                            'count': str(count), 'search': search}}
                                        )
    else:
        return HttpResponseBadRequest()
def modify_feedback(feedback_obj, data, user, host):
    try:
        status = get_list_from_set(FEEDBACK_STATUS)
        comment_object = None
        assign_status = False
        pending_status = False
        reporter_email_id = get_reporter_details(feedback_obj.reporter, "email")
        reporter_phone_number = get_reporter_details(feedback_obj.reporter)
        previous_status = feedback_obj.status
        dealer_asc_obj = get_dealer_asc_email(feedback_obj)
        
        # check if status is pending
        if feedback_obj.status == status[4]:
            pending_status = True
     
        if feedback_obj.assignee:
            assign_number = feedback_obj.assignee.user_profile.phone_number
        else:
            assign_number = None
        assign = feedback_obj.assignee
        
        if data['status'] == status[0] and previous_status == (status[1] or status[2]):
            feedback_obj.fcr = False
    
        if feedback_obj.due_date:
            due_date = convert_utc_to_local_time(feedback_obj.due_date)
            feedback_obj.due_date = data['due_date']
            feedback_obj.due_date = datetime.datetime.strptime(data['due_date'], '%Y-%m-%d %H:%M:%S')
            feedback_obj.save(using=settings.BRAND)
            if due_date != feedback_obj.due_date:
                update_feedback_activities(feedback_obj, SDActions.DUE_DATE, due_date, feedback_obj.due_date, user)
                if reporter_email_id:
                    send_mail_to_reporter(reporter_email_id, feedback_obj, 'DUE_DATE_MAIL_TO_INITIATOR')
                else:
                    LOG.info("Reporter emailId not found.")
                    
                    if dealer_asc_obj.user.email:
                        send_mail_to_dealer(feedback_obj, dealer_asc_obj.user.email, 'DUE_DATE_MAIL_TO_DEALER')
                    else:
                        LOG.info("Dealer / Asc emailId not found.")
                if reporter_phone_number:
                    send_sms('INITIATOR_FEEDBACK_DUE_DATE_CHANGE', reporter_phone_number,
                     feedback_obj)
        
        if feedback_obj.priority:
            priority = feedback_obj.priority
            feedback_obj.priority = data['Priority']
            feedback_obj.save(using=settings.BRAND)
            if priority != feedback_obj.priority:
                due_date = feedback_obj.due_date
                date = set_due_date(data['Priority'], feedback_obj)
                feedback_obj.due_date = date['due_date']
                feedback_obj.reminder_date = date['reminder_date'] 
                feedback_obj.save(using=settings.BRAND)
                update_feedback_activities(feedback_obj, SDActions.PRIORITY, priority, feedback_obj.priority, user)
                update_feedback_activities(feedback_obj, SDActions.DUE_DATE, due_date, feedback_obj.due_date, user)
                if due_date != convert_utc_to_local_time(feedback_obj.due_date):
                    if reporter_email_id:
                        send_mail_to_reporter(reporter_email_id, feedback_obj, 'DUE_DATE_MAIL_TO_INITIATOR')
                else:
                    LOG.info("Reporter emailId not found.")
                    if dealer_asc_obj.user.email:
                        send_mail_to_dealer(feedback_obj, dealer_asc_obj.user.email, 'DUE_DATE_MAIL_TO_DEALER')
                    else:
                        LOG.info("Dealer / Asc emailId not found.")
                if reporter_phone_number:
                    send_sms('INITIATOR_FEEDBACK_DUE_DATE_CHANGE', reporter_phone_number,
                     feedback_obj)
            
        if assign is None:
            assign_status = True
        if data['assign_to'] == '':
            feedback_obj.status = data['status']
            feedback_obj.priority = data['Priority']
            feedback_obj.assignee = None
         
        else:
            if json.loads(data.get('reporter_status')):
                feedback_obj.previous_assignee = feedback_obj.assignee
                feedback_obj.assign_to_reporter = True
                feedback_obj.assignee = feedback_obj.reporter
                
            else:
                if data['assign_to'] :
                    servicedesk_user = get_model('ServiceDeskUser').objects.filter(user_profile__user__username=str(data['assign_to']))
                    feedback_obj.assignee = servicedesk_user[0]
                    feedback_obj.assign_to_reporter = False
            feedback_obj.status = data['status']
            feedback_obj.priority = data['Priority']
    
        # check if status is pending
        if data['status'] == status[4]:
            feedback_obj.pending_from = datetime.datetime.now()
        
        # check if status is progress
        if data['status'] == status[3]:
            if previous_status == 'Pending':
                feedback_obj.assignee = feedback_obj.previous_assignee
        
        # check if status is closed
        if data['status'] == status[1]:
            feedback_obj.closed_date = datetime.datetime.now()
        feedback_obj.save(using=settings.BRAND)
    
        if assign_status and feedback_obj.assignee:
            feedback_obj.previous_assignee = feedback_obj.assignee
            feedback_obj.assignee_created_date = datetime.datetime.now()
            date = set_due_date(data['Priority'], feedback_obj)
            feedback_obj.due_date = date['due_date']
            feedback_obj.reminder_date = date['reminder_date'] 
            feedback_obj.save(using=settings.BRAND)
            update_feedback_activities(feedback_obj, SDActions.STATUS, None, data['status'], user)
            context = create_context('INITIATOR_FEEDBACK_MAIL_DETAIL',
                                     feedback_obj)
            if reporter_email_id:
                mail.send_email_to_initiator_after_issue_assigned(context,
                                                             reporter_email_id)
            else:
                LOG.info("Reporter emailId not found.")
                if dealer_asc_obj.user.email:
                    context = create_context('INITIATOR_FEEDBACK_MAIL_DETAIL_TO_DEALER',
                                     feedback_obj)
                    mail.send_email_to_dealer_after_issue_assigned(context,
                                                             dealer_asc_obj.user.email)
                else:
                    LOG.info("Dealer / Asc emailId not found.")
            if reporter_phone_number:
                send_sms('INITIATOR_FEEDBACK_DETAILS', reporter_phone_number,
                     feedback_obj)
    
        if data['comments']:
            comment_object = get_model('Comment')(
                                            comment=data['comments'],
                                            user=user, created_date=datetime.datetime.now(),
                                            modified_date=datetime.datetime.now(),
                                            feedback_object=feedback_obj)
            comment_object.save(using=settings.BRAND)
            update_feedback_activities(feedback_obj, SDActions.COMMENT, None, data['comments'], user)
    
    # check if status is resolved
        if feedback_obj.status == status[2]:
            if previous_status == status[0]:
                feedback_obj.fcr = True
            servicedesk_obj_all = User.objects.filter(groups__name=Roles.SDMANAGERS)
            feedback_obj.resolved_date = datetime.datetime.now()
            feedback_obj.resolved_date = datetime.datetime.now()
            feedback_obj.root_cause = data['rootcause']
            feedback_obj.resolution = data['resolution']
            feedback_obj.save(using=settings.BRAND)
            comments = get_model('Comment').objects.filter(feedback_object=feedback_obj.id).order_by('-created_date')
            if reporter_email_id:
                context = create_context('INITIATOR_FEEDBACK_RESOLVED_MAIL_DETAIL',
                                      feedback_obj, comments[0])
                mail.send_email_to_initiator_after_issue_resolved(context,
                                                              feedback_obj, host, reporter_email_id)
            else:
                LOG.info("Reporter emailId not found.")
                if dealer_asc_obj.user.email:
                    context = create_context('FEEDBACK_RESOLVED_MAIL_TO_DEALER',
                                     feedback_obj)
                    mail.send_email_to_dealer_after_issue_assigned(context,
                                                             dealer_asc_obj.user.email)
                else:
                    LOG.info("Dealer / Asc emailId not found.")
    
            context = create_context('TICKET_RESOLVED_DETAIL_TO_BAJAJ',
                                     feedback_obj)
            mail.send_email_to_brand_after_issue_resolved(context)
            context = create_context('TICKET_RESOLVED_DETAIL_TO_MANAGER',
                                     feedback_obj)
            mail.send_email_to_manager_after_issue_resolved(context, servicedesk_obj_all[0])
            if reporter_phone_number:
                send_sms('INITIATOR_FEEDBACK_STATUS', reporter_phone_number,
                     feedback_obj)
        
        if previous_status != feedback_obj.status:
            update_feedback_activities(feedback_obj, SDActions.STATUS, previous_status, feedback_obj.status, user)
            
        if pending_status:
            set_wait_time(feedback_obj)
     
        if feedback_obj.assignee:
            if assign_number != feedback_obj.assignee.user_profile.phone_number:
                update_feedback_activities(feedback_obj, SDActions.ASSIGNEE, assign_number,
                                           feedback_obj.assignee.user_profile.phone_number, user)
                context = create_context('ASSIGNEE_FEEDBACK_MAIL_DETAIL',
                                          feedback_obj)
                mail.send_email_to_assignee(context, feedback_obj.assignee.user_profile.user.email)
                send_sms('SEND_MSG_TO_ASSIGNEE',
                         feedback_obj.assignee.user_profile.phone_number,
                         feedback_obj, comment_object)
        return True

    except Exception as ex:
        exc_type, exc_obj, exc_tb = sys.exc_info()
        fname = os.path.split(exc_tb.tb_frame.f_code.co_filename)[1]
        error = "{0} {1} {2}".format(exc_type, fname, exc_tb.tb_lineno)
        LOG.error('Exception while modifying ticket details : {0} {1}'.format(ex, error))
        return False
 def test_get_list_from_set(self):
     data = get_list_from_set(FEEDBACK_TYPE)
     self.assertEqual(len(data), 4) 
     data = get_list_from_set(PRIORITY)
     self.assertEqual(len(data), 4)