from django.shortcuts import render from django.http import HttpResponse, HttpResponseRedirect from django.contrib.auth.hashers import make_password, check_password from django.views.decorators.cache import cache_page from .forms import RegForm, CheckInForm, ForgetPSWForm from .models import Organizer, CheckIn, Item, UserContent from .functions import * # Create your views here. # @cache_page(60 * 60) # 缓存有效时间1小时 def index(request): # Homepage return render(request, 'checkIn/index.html') def checkIn(request, url): # 用户注册界面 if url == 'register': if request.method == 'POST': regForm = RegForm(request.POST) if regForm.is_valid(): organizer = Organizer organizer.username = regForm.cleaned_data['username'].lower().strip() organizer.nickname = regForm.cleaned_data['nickname'].lower().strip() organizer.email = regForm.cleaned_data['email'].lower().strip() organizer.mobile = regForm.cleaned_data['mobile'] organizer.password = make_password(regForm.cleaned_data['psw1']) organizer.photo = '' # 获取注册的IP地址 try: organizer.registerIP = request.META['HTTP_X_FORWARDED_FOR'] except: organizer.registerIP = request.META['REMOTE_ADDR'] organizer.createNew(organizer) organizer = Organizer.searchByUsername(organizer) request.session['loginUser'] = organizer.username request.session['loginID'] = organizer.ID request.session['loginNickname'] = organizer.nickname return render(request, 'checkIn/directPage.html', {'alertMsg': '用户创建成功。', 'dirLink': '/checkIn/main'}) else: return render(request, 'checkIn/register.html', {'registerForm': regForm}) else: return render(request, 'checkIn/register.html', {'registerForm': RegForm}) if url == 'login': # 用户登录页面 if request.method == 'POST': organizer = Organizer organizer.username = request.POST['username'].strip().lower() organizer = Organizer.searchByUsername(organizer) if organizer == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '用户名不存在。', 'dirLink': '/checkIn/login/'}) if check_password(request.POST['password'], organizer.password): request.session['loginUser'] = organizer.username request.session['loginID'] = organizer.ID request.session['loginNickname'] = organizer.nickname return render(request, 'checkIn/directPage.html', {'alertMsg': '登录成功。', 'dirLink': '/checkIn/main/'}) else: return render(request, 'checkIn/directPage.html', {'alertMsg': '用户名或者密码错误。', 'dirLink': '/checkIn/login/'}) else: if getSession(request, 'loginID'): # 如果检测到用户已经登陆就直接跳转 return HttpResponseRedirect('/checkIn/main') else: return render(request, 'checkIn/login.html') # 忘记密码 if url == 'forgetPSW': if checkSession(request, 'loginUser') and checkSession(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '你已经登录了。', 'dirLink': '/'}) if request.method == 'POST': organizer = Organizer form = ForgetPSWForm(request.POST) if form.is_valid(): organizer.username = form.cleaned_data['username'] organizer = Organizer.searchByUsername(organizer) if organizer.mobile == form.cleaned_data['mobile']: organizer.password = make_password('qaz123') Organizer.updateByID(organizer) return render(request, 'checkIn/directPage.html', {'alertMsg': '你的密码已经更改为 qaz123。', 'dirLink': '/checkIn/login'}) else: return render(request, 'checkIn/forgetPSW.html', {'forgetPSWForm': form, 'alert': '你的手机号码与注册的不符。'}) else: del organizer return render(request, 'checkIn/forgetPSW.html', {'forgetPSWForm': form}) # 正常渲染页面 else: form = ForgetPSWForm() return render(request, 'checkIn/forgetPSW.html', {'forgetPSWForm': form}) if url == 'main': # 用户登陆后的页面 if not checkLoginUser(request): return render(request, 'checkIn/directPage.html', {'alertMsg': '登录错误。', 'dirLink': '/checkIn/logout'}) checkIn = CheckIn checkIn.o_ID = getSession(request, 'loginID') existingList = CheckIn.getExistingList(checkIn) # 获取名下的checkIn集合 nickname = request.session['loginNickname'] return render(request, 'checkIn/main.html', {'existingList': existingList, 'nickname': nickname}) if url == 'newCheckIn': # 用户创建新的CheckIn项目 if not checkLoginUser(request): return render(request, 'checkIn/directPage.html', {'alertMsg': '请重新登录。', 'dirLink': '/'}) checkIn = CheckIn if request.method == 'POST': form = CheckInForm(request.POST) if form.is_valid(): if request.GET.get('ID'): # 如果是更新话,先读取原始数据 checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.startTime = form.cleaned_data['startTime'] checkIn.endTime = form.cleaned_data['endTime'] checkIn.o_ID = request.session['loginID'] checkIn.description = form.cleaned_data['description'] checkIn.maxNum = form.cleaned_data['maxNum'] checkIn.creatorConfirm = form.cleaned_data['creatorConfirm'] checkIn.captcha = form.cleaned_data['captcha'] if request.GET.get('ID'): # 如果是更新话,就能获取check In ID,然后调用这一段。 CheckIn.updateByID(checkIn) return HttpResponseRedirect('/checkIn/checkInDetail/?ID=%s' % (checkIn.ID)) else: # 如果是新建的话,GET里面没有ID c_ID =CheckIn.createNew(checkIn) if c_ID == 0: # 检测到重名 alert = '你创建的活动重名了。' return render(request, 'checkIn/newCheckIn.html', {'form': form, 'alert': alert}) else: return HttpResponseRedirect('/checkIn/newItems/?ID=%s' % (c_ID)) # 普通打开页面,不是POST if request.GET.get('ID'): # 如果GET来ID数据的话,就填充表格,修改原有数据 checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) if not checkIn: return render(request, 'checkIn/directPage.html', {'alertMsg': '这个ID不存在。', 'dirLink': '/'}) else: form = CheckInForm data = {'startTime': str(checkIn.startTime), 'description': checkIn.description.strip(), 'o_ID': checkIn.o_ID} if checkIn.endTime: data['endTime'] = str(checkIn.endTime) data['maxNum'] = checkIn.maxNum data['creatorConfirm'] = checkIn.creatorConfirm data['captcha'] = checkIn.captcha form = CheckInForm(data) return render(request, 'checkIn/newCheckIn.html', {'form': form}) else: # 创建新的checkIn # data = {'o_ID': request.session.get('loginID')} form = CheckInForm() # confirmList = [('0', '无需验证'), ('1', '点击确认')] # form.declared_fields['creatorConfirm'].choices = confirmList return render(request, 'checkIn/newCheckIn.html', {'form': form}) if url == 'newItems': # 用户在新的checkIn项目下添加签到内容 if not checkLoginUser(request): return render(request, 'checkIn/directPage.html', {'alertMsg': '请重新登录。', 'dirLink': '/'}) item = Item if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) item.c_ID = request.GET['ID'] checkIn = CheckIn checkIn.ID = item.c_ID checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) if request.method == 'POST': # 新建条目 item.o_ID = getSession(request, 'loginID') checkIn = CheckIn() checkIn.ID = item.c_ID checkIn = CheckIn.searchByID(checkIn) item.c_description = checkIn.description.strip() item.description = request.POST['description'].strip() # 检验重名的Item if Item.sameItem(item): return render(request, 'checkIn/directPage.html', {'alertMsg': '重名了', 'dirLink': '/checkIn/newItems'}) item.type = request.POST['type'] if checkPOST(request, 'uniqueItem'): item.unique = True else: item.unique = False if checkPOST(request, 'reservedFlag'): item.reservedFlag = True item.reservedContent = request.POST['reservedContent'].strip() else: item.reservedFlag = False item.reservedContent = '' if item.type == '4': # 如果是选项需要在选项数据库里面输入 item.itemSelection = request.POST['itemSelection'].strip() #验证完成,创建item Item.createNew(item) existItemList = Item.searchByC_ID(item) return render(request, 'checkIn/newItems.html', {'existItemList': existItemList}) else: existItemList = Item.searchByC_ID(item) return render(request, 'checkIn/newItems.html', {'existItemList': existItemList, 'checkInDesc': checkIn.description}) if url == 'logout': request.session.clear() return render(request, 'checkIn/directPage.html', {'alertMsg': '成功退出。', 'dirLink': '/'}) if url == 'checkInDetail': checkIn = CheckIn if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) request.session['checkInDesc'] = checkIn.description request.session['checkInID'] = checkIn.ID return render(request, 'checkIn/checkInDetail.html', {'checkIn': checkIn}) # 更新item if url == 'itemUpdate': item = Item # 提交表单后更新数据 if request.method == 'POST': # 读取item数据 if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) item.ID = request.GET['ID'] item = Item.searchByID(item) item.description = request.POST['description'].strip() item.type = request.POST['type'] if checkPOST(request, 'uniqueItem'): item.unique = True else: item.unique = False if checkPOST(request, 'reservedFlag'): item.reservedFlag = True item.reservedContent = request.POST['reservedContent'].strip() else: item.reservedFlag = False item.reservedContent = '' # 更新数据 Item.updateItemByID(item) return HttpResponseRedirect('/checkIn/newItems/?ID=%s' % (item.c_ID)) # 非POST else: try: if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) item.ID = request.GET['ID'] item = Item.searchByID(item) if (not checkCorrectO_ID(request, item.o_ID)) or item == '': return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) return render(request, 'checkIn/itemUpdate.html', {'item': item}) except Exception as e: print(e) return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) # 更新用户资料 if url == 'updateInfo': organizer = Organizer if not checkSession(request, 'loginID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '你还没有登录。', 'dirLink': '/'}) organizer.ID = getSession(request, 'loginID') organizer = Organizer.searchByID(organizer) if request.method == 'POST': form = RegForm(request.POST) form.fields['psw1'].required = False form.fields['psw2'].required = False form.fields['username'].widget.attrs['readonly'] = 'readonly' if form.is_valid(): if form.cleaned_data['psw1'] is not None: organizer.password = make_password(form.cleaned_data['psw1']) organizer.nickname = form.cleaned_data['nickname'] organizer.mobile = form.cleaned_data['mobile'] organizer.email = form.cleaned_data['email'] Organizer.updateByID(organizer) return HttpResponseRedirect('/checkIn/main') else: return render(request, 'checkIn/updateInfo.html', {'form': form}) else: form = RegForm(initial={'username': organizer.username, 'nickname': organizer.nickname, 'email': organizer.email, 'mobile': organizer.mobile, 'updateFlag': 'update', 'originalMobile': organizer.mobile}) form.fields['psw1'].required = False form.fields['psw2'].required = False form.fields['username'].widget.attrs['readonly'] = 'readonly' return render(request, 'checkIn/updateInfo.html', {'form': form}) # 生成二维码,并准备发布 if url == 'public': checkIn = CheckIn if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '这个ID不存在。', 'dirLink': '/'}) else: scheme = request.scheme host = request.get_host() import qrcode qr = qrcode.QRCode(version=1, error_correction=qrcode.constants.ERROR_CORRECT_M, box_size=10, border=1) url = '%s://%s/checkIn/user/checkIn/?ID=%s' % (scheme, host, checkIn.ID) qr.add_data(url) qr.make(fit=True) img = qr.make_image() import os BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) imgLoc = '%s\\checkIn\\checkIn_media\\qrcode\\c_ID_%s.png' % (BASE_DIR, checkIn.ID) img.save(imgLoc) img_url = '/checkIn_media/qrcode/c_ID_%s.png' %(checkIn.ID) # 需要在服务器上添加checkIn_media为静态目录 status = {} status['code'] = checkIn.status if status['code'] == 'draft': status['desc'] = '准备中' elif status['code'] == 'active': status['desc'] = '进行中' elif status['code'] == 'pause': status['desc'] = '暂停' return render(request, 'checkIn/public.html', {'url': url, 'image': img_url, 'c_ID': checkIn.ID, 'status': status, 'description': checkIn.description}) # 组织者查看签到记录 if url == 'checkInStatus': checkIn = CheckIn checkInResult = UserContent if not checkGET(request, 'ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) # 验证checkIn 用户和登录用户是否一致。 if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) checkInResult.c_ID = checkIn.ID result = UserContent.getContentList(checkInResult) # result = mongoSearchByID(checkIn.ID) result2 = None keys = None if len(result) != 0: keys = eval(result[0]['content']).keys() result2 = [] for x in result: result2.append(eval(x['content']).values()) return render(request, 'checkIn/checkInStatus.html', {'result': result2, 'keys': keys, 'c_ID': checkIn.ID}) # 下载CSV if url == 'getCSV': checkIn = CheckIn checkInResult = UserContent if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) # 验证checkIn 用户和登录用户是否一致。 if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) # 获取数据,生成response response = HttpResponse(content_type='text/csv') response['Content-Disposition'] = 'attachment; filename="checkIn_%s.csv"' % (checkIn.ID) import csv writer = csv.writer(response) checkInResult.c_ID = checkIn.ID result = UserContent.getContentList(checkInResult) # result = mongoSearchByID(checkIn.ID) keys = eval(result[0]['content']).keys() writer.writerow(keys) result2 = [] for x in result: writer.writerow(eval(x['content']).values()) return response # 更改签到状态 if url == 'statusChange': checkIn = CheckIn if not checkGET(request, 'status'): return render(request, 'checkIn/directPage.html', {'alertMsg': 'status错误', 'dirLink': '/'}) if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入cID或者cID错误', 'dirLink': '/checkIn/logout'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) allowedStatus = {'draft': '准备中', 'active': '进行中', 'pause': '暂停'} if request.GET['status'] in allowedStatus.keys(): # 判断当前c_ID下item是否为空 item = Item() item.c_ID = request.GET['c_ID'] item = Item.searchByC_ID(item) if len(item) == 0: return render(request, 'checkIn/directPage.html', {'alertMsg': '项目收集信息为空,请添加至少一项。', 'dirLink': '/checkIn/checkInDetail/?ID=%s' % (checkIn.ID)}) else: checkIn.status = request.GET['status'] CheckIn.updateByID(checkIn) statusDesc = '签到已经更改成%s状态了' % (allowedStatus[checkIn.status]) return render(request, 'checkIn/directPage.html', {'alertMsg': statusDesc, 'dirLink': '/checkIn/public/?ID=%s' % (checkIn.ID)}) else: return render(request, 'checkIn/directPage.html', {'alertMsg': '参数错误', 'dirLink': '/checkIn/logout'}) # 删除checkIn if url == 'deleteCheckIn': checkIn = CheckIn() if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入cID或者cID错误', 'dirLink': '/checkIn/logout'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if (not checkCorrectO_ID(request, checkIn.o_ID)) or checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) checkIn.status = 'delete' CheckIn.updateByID(checkIn) return HttpResponseRedirect('/checkIn/main') # 删除Item if url == 'deleteItem': if not checkGET(request, 'itemID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入itemID', 'dirLink': '/'}) item = Item item.ID = request.GET.get('itemID') item = Item.searchByID(item) c_ID = item.c_ID if (not checkCorrectO_ID(request, item.o_ID)) or item == None: return render(request, 'checkIn/directPage.html', {'alertMsg': 'c_ID有错误,请重新登录。', 'dirLink': '/checkIn/logout'}) if Item.deleteByID(item): return HttpResponseRedirect('/checkIn/newItems/?ID=%s' %(c_ID)) else: return HttpResponse('系统错误。') # 删除签到数据 if url == "deleteContent": if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入cID或者cID错误', 'dirLink': '/checkIn/logout'}) # 判断是不是本人的checkIn checkIn = CheckIn() checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) if checkIn.o_ID != request.session['loginID']: del checkIn return render(request, 'checkIn/directPage.html', {'alertMsg': '非本人的活动项目!', 'dirLink': '/checkIn/logout'}) userContent = UserContent() userContent.c_ID = request.GET['c_ID'] if UserContent.clearByC_ID(userContent): checkIn.status = 'draft' # 重置checkIn的状态为Draft CheckIn.updateByID(checkIn) del checkIn del userContent return HttpResponseRedirect('/checkIn/checkInDetail/?ID=%s' % (request.GET['c_ID'])) # 打印版本 if url == 'print': checkIn = CheckIn if not checkGET(request, 'c_ID'): return render(request, 'checkIn/directPage.html', {'alertMsg': '没有输入ID或者ID错误', 'dirLink': '/'}) checkIn.ID = request.GET['c_ID'] checkIn = CheckIn.searchByID(checkIn) if checkIn == None: return render(request, 'checkIn/directPage.html', {'alertMsg': '这个ID不存在。', 'dirLink': '/'}) else: img_url = '/checkIn_media/qrcode/c_ID_%s.png' %(checkIn.ID) # 需要在服务器上添加checkIn_media为静态目录 return render(request, 'checkIn/print.html', {'url': url, 'image': img_url, 'description': checkIn.description})