You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
596 lines
20 KiB
596 lines
20 KiB
# -*- coding: utf-8 -*-
|
|
from django.shortcuts import render, HttpResponse
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.shortcuts import get_object_or_404
|
|
from django.http import HttpResponseRedirect
|
|
from django.core.urlresolvers import reverse
|
|
from django.contrib import messages
|
|
from django.db.models import Q
|
|
from django.db.models import Count
|
|
from todo.forms import *
|
|
from todo.models import Item, ProjectList, ItemComment
|
|
import simplejson
|
|
import datetime
|
|
import xlwt
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def dashboard(request):
|
|
|
|
getnewtask = Item.objects.filter(Q(created_by=request.user) |
|
|
Q(assigned_to=request.user)).filter(status=1, is_delete=False)
|
|
base_num = getnewtask.filter(tasktype=1).count()
|
|
business_num = getnewtask.filter(tasktype=2).count()
|
|
pro_num = getnewtask.filter(tasktype=3).count()
|
|
latest = getnewtask.order_by('-created_date')[:10]
|
|
return render(request, 'todo/dashboard.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def MyToDo(request, stat):
|
|
|
|
if request.method == 'POST':
|
|
|
|
if 'addtask' in request.POST:
|
|
|
|
form = ItemForm(request.POST, initial={'created_by': request.user})
|
|
|
|
if form.is_valid():
|
|
try:
|
|
|
|
form.save()
|
|
messages.success(request, u"一个新的任务被添加.")
|
|
|
|
return HttpResponseRedirect(reverse('mytodo', args=['list']))
|
|
except Exception, e:
|
|
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
else:
|
|
messages.warning(request, u'任务添加失败')
|
|
return HttpResponseRedirect(reverse('mytodo', args=['list']))
|
|
|
|
elif 'mark_done' in request.POST:
|
|
del_list = request.POST.getlist('mark_done')
|
|
|
|
Item.objects.filter(id__in=del_list).update(is_delete=True)
|
|
messages.info(request, u'任务已经删除')
|
|
|
|
else:
|
|
form = ItemForm(initial={'created_by': request.user, 'tasktype': 2})
|
|
|
|
if stat == 'list':
|
|
|
|
latest = Item.objects.filter(tasktype=2, status__in=[1, 2], is_delete=False).filter(
|
|
Q(created_by=request.user) | Q(assigned_to=request.user)).order_by('-created_date')
|
|
else:
|
|
latest = Item.objects.filter(tasktype=2, status__in=[3, 4]).filter(
|
|
Q(created_by=request.user) | Q(assigned_to=request.user)).order_by('-created_date')
|
|
return render(request, 'todo/todo.html', locals())
|
|
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def AddProject(request):
|
|
|
|
if request.method == 'POST':
|
|
|
|
form = ProjectListForm(request.POST, initial={"created_by": request.user})
|
|
|
|
if form.is_valid():
|
|
try:
|
|
form.save()
|
|
messages.success(request, u"一个新的事项被添加.")
|
|
|
|
return HttpResponseRedirect(reverse('projectlist', args=['list']))
|
|
except Exception, e:
|
|
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
|
|
else:
|
|
form = ProjectListForm(initial={"created_by": request.user})
|
|
return render(request, 'todo/baseform.html', locals())
|
|
|
|
|
|
# type2 计次任务
|
|
@login_required(login_url='/login/')
|
|
def AddBusiness(request):
|
|
|
|
if request.method == 'POST':
|
|
|
|
form = ItemForm(request.POST, initial={'created_by': request.user})
|
|
|
|
if form.is_valid():
|
|
try:
|
|
|
|
form.save()
|
|
messages.success(request, u"一个新的事项被添加.")
|
|
|
|
return HttpResponseRedirect(reverse('mytodo', args=['list']))
|
|
except Exception, e:
|
|
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
else:
|
|
form = ItemForm(initial={'created_by': request.user, 'tasktype': 2})
|
|
return render(request, 'todo/baseform.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def AddBaseItem(request):
|
|
|
|
if request.method == 'POST':
|
|
|
|
form = BaseItemForm(request.POST, initial={'created_by': request.user})
|
|
|
|
if form.is_valid():
|
|
try:
|
|
form.save()
|
|
messages.success(request, u"一个新的事项被添加.")
|
|
return HttpResponseRedirect(reverse('baseitemlist'))
|
|
except:
|
|
messages.warning(request,
|
|
u"新事项保存有一个问题. 最有可能已经存在在同一组具有相同名称的事项."+e)
|
|
|
|
else:
|
|
form = BaseItemForm(initial={'created_by': request.user})
|
|
return render(request, 'todo/baseform.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def TaskView(request, pid):
|
|
|
|
taskitem = Item.objects.get(pk=pid)
|
|
|
|
itemcomment = taskitem.itemcomment_set.all().order_by('-date')
|
|
|
|
if request.method == 'POST':
|
|
c = ItemComment(
|
|
author=request.user,
|
|
task=taskitem,
|
|
body=request.POST.get('comment-body', None),
|
|
)
|
|
c.save()
|
|
|
|
return HttpResponseRedirect(request.path)
|
|
|
|
return render(request, 'todo/taskview.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def EditTask(request, id):
|
|
|
|
GetTask = get_object_or_404(Item, pk=id)
|
|
|
|
TaskType = GetTask.tasktype
|
|
|
|
if request.method == 'POST':
|
|
|
|
if TaskType == 2:
|
|
url = 'mytodo'
|
|
getarg = 'list'
|
|
|
|
form = ItemForm(request.POST, instance=GetTask)
|
|
|
|
elif TaskType == 1:
|
|
url = 'baseitemlist'
|
|
getarg = 'list'
|
|
form = BaseItemForm(request.POST, instance=GetTask)
|
|
|
|
elif TaskType == 3:
|
|
url = 'subprojectlist'
|
|
getarg = GetTask.project.id
|
|
form = EditSubProjectForm(request.POST, instance=GetTask)
|
|
else:
|
|
url = 'mytodo'
|
|
messages.warning(request, u'不能识别的任务类型!')
|
|
return HttpResponseRedirect(request.path)
|
|
|
|
if form.is_valid():
|
|
try:
|
|
form.save()
|
|
messages.success(request, u"任务修改完成.")
|
|
return HttpResponseRedirect(reverse(url, args=[getarg]))
|
|
except Exception, e:
|
|
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
|
|
else:
|
|
|
|
if TaskType == 2:
|
|
form = ItemForm(instance=GetTask)
|
|
elif TaskType == 1:
|
|
form = BaseItemForm(instance=GetTask)
|
|
elif TaskType == 3:
|
|
form = EditSubProjectForm(instance=GetTask)
|
|
elif TaskType == 4:
|
|
form = CronItemForm(instance=GetTask)
|
|
else:
|
|
messages.warning(request, u'未知的任务类型')
|
|
|
|
return HttpResponseRedirect(reverse('dashboard'))
|
|
|
|
return render(request, 'todo/baseform.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def DelItem(request):
|
|
|
|
type = request.GET.get('type')
|
|
itemid = request.GET.get('id')
|
|
|
|
if request.method == 'POST':
|
|
if 'mark_doen' in request.POST:
|
|
return HttpResponse(simplejson.dumps(request.POST.getlist('mark_done')))
|
|
|
|
if not type or not itemid:
|
|
messages.warning(request, u'参数错误!')
|
|
return HttpResponseRedirect(request.path)
|
|
|
|
if type == 'task':
|
|
delitem = get_object_or_404(Item, pk=itemid)
|
|
if delitem.lock:
|
|
return HttpResponse(u'不可以删除绩效锁定的任务,请先删除对应绩效成绩后再联系上级领导处理')
|
|
if not delitem.is_delete:
|
|
delitem.is_delete = True
|
|
delitem.save()
|
|
else:
|
|
delitem.delete()
|
|
elif type == 'pro':
|
|
#delitem = get_object_or_404(ProjectList, pk=itemid)
|
|
pass
|
|
elif type == 'rollback':
|
|
delitem = get_object_or_404(Item, pk=itemid)
|
|
if delitem.tasktype == 3 and delitem.project.stat == 3:
|
|
|
|
messages.warning(request, u'父项目已经关闭,无法恢复!')
|
|
return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
|
|
|
|
if delitem.is_delete:
|
|
delitem.is_delete = False
|
|
delitem.save()
|
|
|
|
else:
|
|
messages.warning(request, u'参数错误!')
|
|
|
|
return HttpResponseRedirect(request.META.get('HTTP_REFERER', '/'))
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def ViewProjectList(request, stat):
|
|
|
|
if request.method == 'POST':
|
|
|
|
form = ProjectListForm(request.POST, initial = {"created_by": request.user})
|
|
|
|
if form.is_valid():
|
|
try:
|
|
form.save()
|
|
messages.success(request, u"一个新的项目被添加.")
|
|
|
|
return HttpResponseRedirect(reverse('projectlist'))
|
|
except Exception, e:
|
|
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
|
|
else:
|
|
form = ProjectListForm(initial = {"created_by": request.user})
|
|
|
|
if stat == 'list':
|
|
|
|
if request.user.is_superuser:
|
|
project = ProjectList.objects.filter(stat=1)
|
|
else:
|
|
|
|
project = ProjectList.objects.filter(Q(created_by=request.user) | Q(assigned_to__in=[request.user.id]))
|
|
|
|
else:
|
|
project = ProjectList.objects.filter(created_by=request.user, stat__in=[2, 3])
|
|
|
|
return render(request, 'todo/projectlist.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def ViewSubProject(request, pid):
|
|
"""
|
|
项目列表, 可以创建新项目
|
|
|
|
"""
|
|
|
|
project = ProjectList.objects.get(pk=pid)
|
|
subproject = project.item_set.filter(is_delete=False)
|
|
if request.method == 'POST':
|
|
form = SubProjectForm(request.POST)
|
|
if form.is_valid():
|
|
try:
|
|
form.save()
|
|
messages.success(request, u"一个新的任务被添加.")
|
|
|
|
return HttpResponseRedirect(reverse('subprojectlist', args=[pid]))
|
|
except Exception, e:
|
|
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
|
|
else:
|
|
form = SubProjectForm(initial = {"project": project, "created_by": request.user, 'tasktype': 3})
|
|
return render(request, 'todo/subproject.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def Trashlist(request):
|
|
"""
|
|
这里是所有删除任务的列表, 只能做彻底删除和回复操作
|
|
"""
|
|
latest = Item.objects.filter(is_delete=True).filter(Q(created_by=request.user) | Q(assigned_to=request.user))
|
|
return render(request, 'todo/trash.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def BaseItemList(request, stat):
|
|
|
|
if request.method == 'POST':
|
|
|
|
form = BaseItemForm(request.POST, initial={'created_by': request.user})
|
|
|
|
if form.is_valid():
|
|
try:
|
|
form.save()
|
|
messages.success(request, u"一个新的任务被添加.")
|
|
return HttpResponseRedirect(reverse('baseitemlist', args=['list']))
|
|
except Exception, e:
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
|
|
else:
|
|
form = BaseItemForm(initial={'created_by': request.user, 'status': 3})
|
|
|
|
if stat == 'list':
|
|
latest = Item.objects.filter(tasktype=1, is_delete=False, status__in=[1, 2]).filter(
|
|
Q(created_by=request.user) | Q(assigned_to__in=[request.user.id])).order_by('-created_date')
|
|
else:
|
|
latest = Item.objects.filter(tasktype=1, is_delete=False, status__in=[3, 4]).filter(
|
|
Q(created_by=request.user) | Q(assigned_to__in=[request.user.id])).order_by('-created_date')
|
|
return render(request, 'todo/todobase.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def EditProjectList(request, id):
|
|
"""
|
|
编辑项目实例
|
|
|
|
"""
|
|
|
|
ProjectItem = get_object_or_404(ProjectList, pk=id)
|
|
if request.method == 'POST':
|
|
form = ProjectListForm(request.POST, instance=ProjectItem)
|
|
|
|
if form.is_valid():
|
|
try:
|
|
form.save()
|
|
messages.success(request, u"一个新的任务被添加.")
|
|
return HttpResponseRedirect(reverse('projectlist', args=['list']))
|
|
except Exception, e:
|
|
|
|
event = '新任务保存有一个问题: %s' % e
|
|
messages.warning(request, event)
|
|
|
|
else:
|
|
form = ProjectListForm(instance=ProjectItem)
|
|
|
|
return render(request, 'todo/baseform.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def Search(request):
|
|
if request.method == 'POST':
|
|
|
|
qs = []
|
|
tasktype = request.POST.get('tasktype')
|
|
owner = request.POST.getlist('owner')
|
|
startdate = request.POST.get('start_date')
|
|
enddate = request.POST.get('end_date')
|
|
|
|
status = request.POST.get('status')
|
|
|
|
if tasktype and tasktype != '4':
|
|
qs.append(Q(tasktype=tasktype))
|
|
|
|
if status and status != '5':
|
|
qs.append(Q(status=status))
|
|
|
|
if owner:
|
|
qs.append(Q(created_by__in=owner) | Q(assigned_to__in=owner))
|
|
else:
|
|
qs.append(Q(created_by=request.user) | Q(assigned_to=request.user))
|
|
|
|
if startdate and enddate:
|
|
enddate = datetime.datetime.strptime(enddate, '%Y-%m-%d') + datetime.timedelta(days=1)
|
|
qs.append(Q(created_date__range=(startdate, enddate)))
|
|
else:
|
|
messages.warning(request, u'日期 为必填项')
|
|
return HttpResponseRedirect(reverse('searchlist'))
|
|
|
|
q = None
|
|
|
|
for x in qs:
|
|
if q:
|
|
q &= x
|
|
else:
|
|
q = x
|
|
|
|
if q is None:
|
|
messages.warning(request, u'查询内容不能为空')
|
|
return HttpResponseRedirect(request.path)
|
|
else:
|
|
search_results = Item.objects.filter(q).filter(is_delete=False)
|
|
if not search_results:
|
|
messages.warning(request, u'您的查询没有返回结果')
|
|
return HttpResponseRedirect(reverse('searchlist'))
|
|
|
|
else:
|
|
form = SearchForm(initial={'user': request.user.username})
|
|
return render(request, 'todo/search.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def MyGroup(request):
|
|
"""
|
|
管理视图, 用来展示个人和小组当周完成和未完成的任务, 可以导出excel表
|
|
"""
|
|
|
|
Curr_Week = datetime.date.today().weekday()
|
|
Mon_Date = datetime.date.today() - datetime.timedelta(days=Curr_Week)
|
|
try:
|
|
# owner = GetOrgStructure(request.user.username)
|
|
owner = 'all'
|
|
if isinstance(owner, list):
|
|
owneritem = []
|
|
search_results = Item.objects.filter(Q(created_by__username__in=owner) |
|
|
Q(assigned_to__username__in=owner)).filter(
|
|
Q(completed_date__gte=Mon_Date, )|Q(status__in=['1', '2'], is_delete=False)
|
|
).order_by('-updte_time', 'priority', 'created_date')
|
|
elif owner == 'all':
|
|
search_results = Item.objects.filter(Q(completed_date__gte=Mon_Date, )|
|
|
Q(status__in=['1', '2'], is_delete=False)
|
|
).order_by('-updte_time', 'priority', 'created_date')
|
|
else:
|
|
search_results = Item.objects.filter(Q(created_by=request.user) |
|
|
Q(assigned_to=request.user)).filter(
|
|
Q(completed_date__gte=Mon_Date, )|Q(status__in=['1', '2'], is_delete=False)
|
|
).order_by('-updte_time', 'priority', 'created_date')
|
|
|
|
if request.method == 'POST':
|
|
if 'export' in request.POST:
|
|
response = HttpResponse(content_type="application/ms-excel")
|
|
response['Content-Disposition'] = 'attachment; filename='+Mon_Date.strftime('%Y%m%d')+'周报.xls'
|
|
wb = xlwt.Workbook()
|
|
|
|
ws = wb.add_sheet(u'本周工作完成情况')
|
|
ws.write(0, 0, u'任务')
|
|
ws.write(0, 1, u'创建时间')
|
|
ws.write(0, 2, u'创建人')
|
|
ws.write(0, 3, u'分配给')
|
|
ws.write(0, 4, u'更新时间')
|
|
ws.write(0, 5, u'截止日期')
|
|
ws.write(0, 6, u'权重')
|
|
ws.write(0, 7, u'进度')
|
|
ws.write(0, 8, u'完成情况')
|
|
|
|
row = 1
|
|
for i in search_results:
|
|
created_dt = i.created_date.strftime('%Y-%m-%d')
|
|
uptime_time = i.updte_time.strftime('%Y-%m-%d %H:%M:%S')
|
|
if not i.due_date:
|
|
due_dt = None
|
|
else:
|
|
due_dt = i.due_date.strftime('%Y-%m-%d')
|
|
|
|
try:
|
|
assigned_to = i.assigned_to.username
|
|
except:
|
|
assigned_to = ''
|
|
|
|
ws.write(row, 0, i.title)
|
|
ws.write(row, 1, created_dt)
|
|
ws.write(row, 2, i.created_by.username)
|
|
ws.write(row, 3, assigned_to)
|
|
ws.write(row, 4, uptime_time)
|
|
ws.write(row, 5, due_dt)
|
|
ws.write(row, 6, i.get_priority_display())
|
|
ws.write(row, 7, i.progress)
|
|
ws.write(row, 8, i.get_status_display())
|
|
row += 1
|
|
wb.save(response)
|
|
return response
|
|
|
|
except:
|
|
messages.warning(request, u'您的帐号没有权限!')
|
|
|
|
return render(request, 'todo/mygroup.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def showgantt(request, gid):
|
|
"""
|
|
甘特图展示
|
|
"""
|
|
return render(request, 'todo/gantt.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def TaskStatistics(request):
|
|
|
|
Curr_Week = datetime.date.today().weekday()
|
|
Mon_Date = datetime.date.today() - datetime.timedelta(days=Curr_Week)
|
|
|
|
CreateNum = User.objects.filter(item_assigned_to__created_date__gte=Mon_Date).annotate(
|
|
task_num=Count('item_assigned_to')).order_by('-task_num')
|
|
|
|
ComNum = User.objects.filter(item_assigned_to__created_date__gte=Mon_Date, item_assigned_to__status=3).annotate(
|
|
task_num=Count('item_assigned_to')).order_by('-task_num')
|
|
|
|
return render(request, 'todo/statis.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def MultiAdd(request):
|
|
|
|
if request.method == 'POST':
|
|
|
|
data = request.POST.copy()
|
|
assigned_to_list = request.POST.getlist('assigned_to')
|
|
|
|
for i in assigned_to_list:
|
|
data['assigned_to'] = i
|
|
form = MultiItemForm(data)
|
|
|
|
if form.is_valid():
|
|
form.save()
|
|
|
|
else:
|
|
|
|
event = u'用户%s 分配任务失败' % i
|
|
messages.warning(request, event)
|
|
|
|
continue
|
|
|
|
return HttpResponseRedirect(reverse('mytodo', args=['list']))
|
|
else:
|
|
form = MultiItemForm(initial={'user': request.user.username, 'created_by': request.user, 'tasktype': 2})
|
|
|
|
return render(request, 'todo/baseform.html', locals())
|
|
|
|
|
|
@login_required(login_url='/login/')
|
|
def MultiAddCount(request):
|
|
|
|
if request.method == 'POST':
|
|
|
|
data = request.POST.copy()
|
|
assigned_to_list = request.POST.getlist('assigned_to')
|
|
|
|
for i in assigned_to_list:
|
|
data['assigned_to'] = i
|
|
|
|
form = MultiCountItemForm(data)
|
|
|
|
if form.is_valid():
|
|
form.save()
|
|
|
|
else:
|
|
|
|
event = u'用户%s 分配任务失败' % i
|
|
messages.warning(request, event)
|
|
|
|
continue
|
|
|
|
return HttpResponseRedirect(reverse('baseitemlist'))
|
|
else:
|
|
form = MultiCountItemForm(initial={'user': request.user.username, 'created_by': request.user})
|
|
|
|
return render(request, 'todo/baseform.html', locals())
|