264 lines
12 KiB
Python
264 lines
12 KiB
Python
import datetime
|
|
|
|
from django.db.models import Q
|
|
from django.shortcuts import render, redirect, get_object_or_404
|
|
from django.http import HttpResponse
|
|
from django.contrib.auth.models import User
|
|
from django.contrib.auth.decorators import login_required
|
|
|
|
from ..models import Action, Customer
|
|
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def customerAction(request, c_id):
|
|
# استفاده از get_object_or_404 برای امنیت بیشتر
|
|
customer = get_object_or_404(Customer, id=c_id)
|
|
|
|
# دریافت پارامترهای فیلتر از URL (پیشفرض: all)
|
|
filter_type = request.GET.get('actionType', 'all')
|
|
filter_status = request.GET.get('status', 'all')
|
|
|
|
# کوئری پایه برای اقدامات این مشتری
|
|
actions = Action.objects.filter(customer=customer)
|
|
|
|
# اعمال فیلتر بر اساس نوع اقدام (بازدید، نصب و ...)
|
|
if filter_type != 'all':
|
|
actions = actions.filter(actionType=filter_type)
|
|
|
|
# اعمال فیلتر بر اساس وضعیت (انجام شده، در انتظار و ...)
|
|
if filter_status != 'all':
|
|
actions = actions.filter(status=filter_status)
|
|
|
|
# مرتبسازی نزولی بر اساس تاریخ ایجاد
|
|
actions = actions.order_by("-createdDT")
|
|
|
|
allUsers = User.objects.filter().exclude(username='admin').exclude(username='fesahat')
|
|
|
|
data = {
|
|
'customer': customer,
|
|
'actions': actions,
|
|
'allUsers': allUsers,
|
|
# ارسال مقادیر فیلتر به قالب برای حفظ وضعیت انتخابشده در دراپداونها
|
|
'filter_type': filter_type,
|
|
'filter_status': filter_status
|
|
}
|
|
|
|
return render(request, 'admin_panel/customerAction.html', data)
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def customerNazar(request ,c_id):
|
|
customer = Customer.objects.get(id=c_id)
|
|
actions = Action.objects.filter(customer=customer, nazarDT__isnull=False).order_by("-createdDT")
|
|
allUsers = User.objects.filter().exclude(username='admin').exclude(username='fesahat')
|
|
data = {'customer': customer, 'actions': actions, 'allUsers': allUsers}
|
|
return render(request, 'admin_panel/customer/nazar.html', data)
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def customerNewAction(request ,c_id):
|
|
actionType = request.POST.get('actionType', None)
|
|
dateTimeAnjam = request.POST.get('dateTimeAnjam', None)
|
|
#return HttpResponse(float(dateTimeAnjam+".0"))
|
|
try:
|
|
dateTimeAnjam = datetime.datetime.fromtimestamp(int(dateTimeAnjam)/1e3)
|
|
except:
|
|
pass
|
|
desc = request.POST.get('desc', None)
|
|
userID = request.POST.get('userID', None)
|
|
is_done = request.POST.get('is_done', None)
|
|
result = request.POST.get('result', None)
|
|
FinishDateTime = request.POST.get('FinishDateTime', None)
|
|
try:
|
|
FinishDateTime = datetime.datetime.fromtimestamp(int(FinishDateTime)/1e3)
|
|
except:
|
|
pass
|
|
|
|
customer_obj = Customer.objects.get(id=int(c_id))
|
|
newAction = Action()
|
|
newAction.actionType = actionType
|
|
newAction.actionDateTime = dateTimeAnjam
|
|
newAction.desc = desc
|
|
newAction.forUser = User.objects.get(id=int(userID))
|
|
newAction.customer = customer_obj
|
|
if is_done:
|
|
newAction.status = 'finish'
|
|
newAction.finishDateTime = FinishDateTime
|
|
newAction.result = result
|
|
else:
|
|
newAction.status = 'waite'
|
|
newAction.save()
|
|
|
|
if newAction.status == 'finish' and newAction.actionType == 'bazdid':
|
|
customer_obj.last_bazdid_dt = newAction.finishDateTime
|
|
customer_obj.save()
|
|
|
|
return redirect('/panel/customer/'+str(c_id)+'/action')
|
|
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def ActionList(request):
|
|
actions = Action.objects.filter(forUser__id=request.user.id, status='waite').order_by("-createdDT")
|
|
allUsers = User.objects.filter().exclude(username='admin').exclude(username='fesahat')
|
|
data = {'actions': actions, 'allUsers': allUsers}
|
|
return render(request, 'admin_panel/ActionList.html', data)
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def ActionListUser(request, u_id):
|
|
actions = Action.objects.filter(forUser__id=u_id, status='waite').order_by("-createdDT")
|
|
allUsers = User.objects.filter().exclude(username='admin').exclude(username='fesahat')
|
|
data = {'actions': actions, 'allUsers': allUsers}
|
|
return render(request, 'admin_panel/ActionList.html', data)
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def customerEditAction(request ,c_id, action_id):
|
|
|
|
actionType = request.POST.get('actionType', None)
|
|
dateTimeAnjam = request.POST.get('dateTimeAnjam', None)
|
|
print("ok")
|
|
#return HttpResponse(float(dateTimeAnjam+".0"))
|
|
try:
|
|
dateTimeAnjam = datetime.datetime.fromtimestamp(int(dateTimeAnjam)/1e3)
|
|
except:
|
|
pass
|
|
desc = request.POST.get('desc', None)
|
|
userID = request.POST.get('userID', None)
|
|
is_done = request.POST.get('is_done', None)
|
|
result = request.POST.get('result', None)
|
|
FinishDateTime = request.POST.get('FinishDateTime', None)
|
|
try:
|
|
FinishDateTime = datetime.datetime.fromtimestamp(int(FinishDateTime)/1e3)
|
|
except:
|
|
pass
|
|
|
|
customer_obj = Customer.objects.get(id=int(c_id))
|
|
newAction = Action.objects.get(id=action_id)
|
|
newAction.actionType = actionType
|
|
newAction.actionDateTime = dateTimeAnjam
|
|
newAction.desc = desc
|
|
newAction.forUser = User.objects.get(id=int(userID))
|
|
newAction.customer = customer_obj
|
|
if is_done:
|
|
newAction.status = 'finish'
|
|
newAction.finishDateTime = FinishDateTime
|
|
newAction.result = result
|
|
else:
|
|
newAction.status = 'waite'
|
|
newAction.save()
|
|
|
|
if newAction.status == 'finish' and newAction.actionType == 'bazdid':
|
|
customer_obj.last_bazdid_dt = newAction.finishDateTime
|
|
customer_obj.save()
|
|
#return redirect('/panel/customer/'+str(c_id)+'/action')
|
|
return redirect(request.META.get('HTTP_REFERER', 'redirect_if_referer_not_found'))
|
|
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def ActionListAll(request):
|
|
actions = Action.objects.filter().order_by("-id")
|
|
allUsers = User.objects.filter().exclude(username='admin').exclude(username='fesahat')
|
|
data = {'actions': actions, 'allUsers': allUsers}
|
|
return render(request, 'admin_panel/ActionList.html', data)
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def ActionListToday(request):
|
|
startTodayDT= datetime.datetime.today().strftime('%Y-%m-%d 00:00:00')
|
|
endTodayDT= datetime.datetime.today().strftime('%Y-%m-%d 23:59:59')
|
|
#startTodayDT = datetime.datetime.strptime(startTodayDT, '%Y-%m-%d-00:00:00')
|
|
#endTodayDT = datetime.datetime.strptime(endTodayDT, '%Y-%m-%d-23:59:59')
|
|
#return HttpResponse(todayDT)
|
|
actions = Action.objects.filter(actionDateTime__gte=startTodayDT,actionDateTime__lte=endTodayDT, forUser__id=request.user.id, status='waite').order_by("-actionDateTime")[:50]
|
|
allUsers = User.objects.filter().exclude(username='admin').exclude(username='fesahat')
|
|
data = {'actions': actions, 'allUsers': allUsers}
|
|
return render(request, 'admin_panel/ActionList.html', data)
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def ActionListUserToday(request, u_id):
|
|
dateTimeAction = request.GET.get('dateTime', None)
|
|
status = request.GET.get('status', None)
|
|
unixADT = dateTimeAction
|
|
if dateTimeAction:
|
|
dateTimeAction = datetime.datetime.fromtimestamp(int(dateTimeAction)/1e3)
|
|
startTodayDT = dateTimeAction.strftime('%Y-%m-%d 00:00:00')
|
|
endTodayDT= dateTimeAction.strftime('%Y-%m-%d 23:59:59')
|
|
else:
|
|
startTodayDT= datetime.datetime.today().strftime('%Y-%m-%d 00:00:00')
|
|
endTodayDT= datetime.datetime.today().strftime('%Y-%m-%d 23:59:59')
|
|
#startTodayDT = datetime.datetime.strptime(startTodayDT, '%Y-%m-%d-00:00:00')
|
|
#endTodayDT = datetime.datetime.strptime(endTodayDT, '%Y-%m-%d-23:59:59')
|
|
#return HttpResponse(todayDT)
|
|
if status == 'waite' or status == None or status == '' or status == ' ':
|
|
status = 'waite'
|
|
actions = Action.objects.filter(actionDateTime__gte=startTodayDT,actionDateTime__lte=endTodayDT, forUser__id=u_id, status=status).order_by("-actionDateTime")[:50]
|
|
actionPr = Action.objects.filter(actionDateTime__lt=startTodayDT, forUser__id=u_id, status=status).order_by("-actionDateTime")[:200]
|
|
elif status == 'finish':
|
|
actionPr = None
|
|
actions = Action.objects.filter(actionDateTime__gte=startTodayDT,actionDateTime__lte=endTodayDT, forUser__id=u_id, status=status).order_by("-actionDateTime")[:50]
|
|
|
|
allUsers = User.objects.filter().exclude(username='admin').exclude(username='fesahat')
|
|
data = {'actions': actions, 'allUsers': allUsers, 'u_id': u_id, "unixADT": unixADT, "status": status, 'actionPr': actionPr}
|
|
return render(request, 'admin_panel/ActionList.html', data)
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def rezayat(request):
|
|
statusRezayat = request.GET.get('status', 'waite')
|
|
now = datetime.datetime.now()
|
|
|
|
# محاسبه بازههای زمانی ۳۰ روز و ۶۰ روز قبل
|
|
dt_30_days_ago = now - datetime.timedelta(days=30)
|
|
dt_60_days_ago = now - datetime.timedelta(days=60)
|
|
|
|
if statusRezayat == 'finish':
|
|
# نمایش نظرسنجیهای تعیینتکلیف شده (ثبت شده یا کنسل شده)
|
|
actions = Action.objects.exclude(actionType='vosol').filter(
|
|
status='finish',
|
|
nazarDT__isnull=False
|
|
).order_by("-nazarDT")[:500]
|
|
else:
|
|
statusRezayat = 'waite'
|
|
# نمایش نظرسنجیهای در انتظار با اعمال شرط عدم انقضای زمان
|
|
actions = Action.objects.exclude(actionType='vosol').filter(
|
|
status='finish',
|
|
nazarDT__isnull=True, # نظرسنجی هنوز نهایی نشده
|
|
createdDT__gte=dt_60_days_ago # حداکثر ۶۰ روز از ایجاد گذشته باشد
|
|
).filter(
|
|
Q(finishDateTime__isnull=True) | Q(finishDateTime__gte=dt_30_days_ago) # حداکثر ۳۰ روز از اتمام گذشته باشد
|
|
).filter(
|
|
Q(nextNazarDT__isnull=True) | Q(nextNazarDT__lte=now) # موعد پیگیری رسیده یا تعویقی نداشته باشد
|
|
).order_by("-id")[:500]
|
|
|
|
data = {'actions': actions, "status": statusRezayat}
|
|
return render(request, 'admin_panel/customerRezayat.html', data)
|
|
|
|
|
|
@login_required(login_url='/panel/p_login/')
|
|
def rezayatEdit(request, ac_id):
|
|
csGrade = request.POST.get('csGrade', None)
|
|
csDesc = request.POST.get('csDesc', None)
|
|
|
|
if csDesc and csGrade:
|
|
action = get_object_or_404(Action, id=ac_id)
|
|
|
|
if csGrade == '-1':
|
|
# عدم موفقیت: تنظیم nextNazarDT برای ۳ روز بعد (nazarDT پر نمیشود تا نهایی نشود)
|
|
action.nazar = csDesc
|
|
action.grade = int(csGrade)
|
|
action.nextNazarDT = datetime.datetime.now() + datetime.timedelta(days=3)
|
|
|
|
elif csGrade == '-2':
|
|
# کنسل کردن: پر کردن nazarDT برای خروج کامل از لیست کارهای در انتظار
|
|
action.nazar = csDesc
|
|
action.grade = int(csGrade)
|
|
action.nazarDT = datetime.datetime.now()
|
|
action.nextNazarDT = None
|
|
|
|
else:
|
|
# ثبت امتیاز عادی
|
|
action.nazar = csDesc
|
|
action.grade = int(csGrade)
|
|
action.nazarDT = datetime.datetime.now()
|
|
action.nextNazarDT = None
|
|
|
|
action.save()
|
|
return redirect('/panel/rezayat/')
|
|
else:
|
|
return HttpResponse('لطفا همه فیلد ها را پر کنید')
|