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

# -*- 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())