def bonus(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request, '../login/') rdata, op, suser = Utils.get_request_basis(request) rdata['credit'] = request.GET.get('credit', 0) return render(request, 'bonus.html', rdata)
def prize_store(request): if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_all: return render(request, 'permission_denied.html', {}) if op == 'change_nickname': SUser.objects.filter(id=int(request.POST.get('sid'))).update( nickname=request.POST.get('nickname')) return HttpResponse(json.dumps({})) if op == 'get_prize_list': sid = int(request.POST.get('sid')) prizes = Prize.objects.all() prize_list = [] for prize in prizes: prize_list.append({ 'pid': prize.id, 'title': prize.title, 'in': sid in json.loads(prize.store) }) return HttpResponse(json.dumps({'prize_list': prize_list})) if op == 'renew_prize_for_store': sid = int(request.POST.get('sid')) pid_list = [ int(pid) for pid in json.loads(request.POST.get('pid_list')) ] manage_list = [] for prize in Prize.objects.all(): stores = json.loads(prize.store) exp_in = prize.id in pid_list pre_in = sid in stores if exp_in != pre_in: if exp_in: stores.append(sid) else: stores.remove(sid) prize.store = json.dumps(stores) prize.save() return HttpResponse(json.dumps({})) storepairs = [] for store in SUser.objects.filter(is_store=True): d = {'store': store} prizes = [] for prize in Prize.objects.all(): prizestores = json.loads(prize.store) print(store, id, prizestores) if store.id in prizestores: prizes.append(prize) d['prizes'] = prizes storepairs.append(d) rdata['storepairs'] = storepairs rdata['prizes'] = Prize.objects.all() return render(request, 'prize_store.html', rdata)
def index(request): # 检查身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) rq_list = [] if not suser.is_store: anweraire_queries = { answeraire.qid: answeraire.submitted for answeraire in Answeraire.objects.filter( username=suser.username) } for questionaire in Questionaire.objects.all(): rq = None # 高级管理员 if suser.admin_all: rq = Utils.remakeq(suser, questionaire, True, anweraire_queries) rq['filled_number'] = Answeraire.objects.filter( qid=questionaire.id).count() rq['submitted_number'] = Answeraire.objects.filter( qid=questionaire.id, submitted=True).count() # 问卷管理员:自己发的问卷 elif suser.admin_survey and questionaire.founder == suser.username: rq = Utils.remakeq(suser, questionaire, True, anweraire_queries) # 普通用户:被允许填的问卷,正在开放填写已经填写 elif Utils.check_allow(suser, questionaire): if (questionaire.status == 1) or (questionaire.status in [2, 3] and Utils.check_fill2( anweraire_queries, questionaire.id) > 1): rq = Utils.remakeq(suser, questionaire, False, anweraire_queries) if rq == None: continue rq_list.append(rq) # 导入问卷 f = request.FILES.get('upload', None) if not f is None: filepath = Utils.upload_file(f) qstring = load_survey(filepath) now = datetime.datetime.now() questionaire = Questionaire.objects.create(status=0, create_time=now, update_time=now, founder=suser.username, questions=qstring) return HttpResponseRedirect('/survey/' + str(questionaire.id) + '/') def cmp_by_time(x): return x['create_time'] rq_list.sort(key=lambda x: x['create_time'], reverse=True) rdata['rq_list'] = rq_list rdata['editable'] = suser.admin_all or suser.admin_survey return render(request, 'index.html', rdata)
def prize(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) # 商家重导向 if suser.is_store: return HttpResponseRedirect('/prize_ticket/u/' + str(suser.id) + '/') if op == 'delete': pid = int(request.POST.get('pid')) Prize.objects.filter(id=pid).delete() return HttpResponse(json.dumps({})) if op == 'change_title': pid = int(request.POST.get('pid')) title = request.POST.get('title') Prize.objects.filter(id=pid).update(title=title) return HttpResponse(json.dumps({})) if op == 'change_credit': pid = int(request.POST.get('pid')) credit = int(request.POST.get('credit')) Prize.objects.filter(id=pid).update(credit=credit) return HttpResponse(json.dumps({})) if op == 'change_price': pid = int(request.POST.get('pid')) price = int(request.POST.get('price')) Prize.objects.filter(id=pid).update(price=price) return HttpResponse(json.dumps({})) if op == 'change_description': pid = int(request.POST.get('pid')) Prize.objects.filter(id=pid).update( description=request.POST.get('description')) return HttpResponse(json.dumps({})) if op == 'exchange': jdata = {'result': 'ok'} pid = int(request.POST.get('pid')) prize = Prize.objects.get(id=pid) if suser.credit < prize.credit: jdata['result'] = '没有足够积分' return HttpResponse(json.dumps(jdata)) suser.credit -= prize.credit suser.save() PrizeTicket.objects.create(uid=suser.id, pid=pid, count=1, used=False, exchange_time=datetime.datetime.now()) return HttpResponse(json.dumps(jdata)) rdata['prizes'] = prizes = list(reversed(Prize.objects.all())) return render(request, 'prize.html', rdata)
def upload_file(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) f = request.FILES.get('file', None) if not f is None: f_path = Utils.upload_file(f) return HttpResponse(json.dumps({'status': 'yes', 'url': f_path})) else: return HttpResponse(json.dumps({'status': 'no'}))
def backend_admin(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if suser.username != 'root': return render(request, 'permission_denied.html', {}) if op == 'export_multi': qids = json.loads(request.POST.get('qids')) excel_name = Analysis.export_multi(qids) return HttpResponse( json.dumps({ 'result': 'yes', 'export_path': excel_name })) if op == 'del_ans': cnt_del_ans = 0 for answeraire in Answeraire.objects.all(): questionaires = Questionaire.objects.filter(id=answeraire.qid) if len(questionaires) == 0: answeraire.delete() cnt_del_ans += 1 cnt_del_rep = 0 for report in Report.objects.all(): questionaires = Questionaire.objects.filter(id=report.qid) if len(questionaires) == 0: report.delete() cnt_del_rep += 1 return HttpResponse( json.dumps({ 'cnt_del_ans': cnt_del_ans, 'cnt_del_rep': cnt_del_rep })) if op == 'del_tsinghua': cnt_del_tsinghua = 0 for suser in SUser.objects.all(): username = suser.username if username.isdigit() and len(username) == 10: User.objects.filter(username=username).delete() suser.delete() cnt_del_tsinghua += 1 for user in User.objects.all(): username = user.username if username.isdigit() and len(username) == 10: SUser.objects.filter(username=username).delete() user.delete() cnt_del_tsinghua += 1 return HttpResponse(json.dumps({'cnt_del_tsinghua': cnt_del_tsinghua})) return render(request, 'backend_admin.html', {})
def help_center(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if suser.admin_all: helps = reversed(Help.objects.all()) else: helps = reversed(Help.objects.filter(released=True)) rdata['helps'] = helps return render(request, 'helps.html', rdata)
def search(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_all: return render(request, 'permission_denied.html', {}) def context(s, klen, pos): l = max(0, pos - 5) r = min(len(s), pos + klen + 5) context_left = s[l:pos] if l != 0: context_left = '...' + context_left context_right = s[pos + klen:r] if r != len(s): context_right = context_right + '...' return context_left, s[pos:pos + klen], context_right if op == 'search': keyword = request.POST.get('keyword') questionaire_list = Questionaire.objects.all() result = [] for questionaire in questionaire_list: d = {} p = questionaire.title.find(keyword) if p != -1: d['id'] = questionaire.id d['title'] = questionaire.title d['update_time'] = str(questionaire.update_time)[:19] d['context_left'], d['context_mid'], d[ 'context_right'] = context(questionaire.title, len(keyword), p) result.append(d) continue p = questionaire.questions.find(keyword) if p != -1: d['id'] = questionaire.id d['title'] = questionaire.title d['update_time'] = str(questionaire.update_time)[:19] d['context_left'], d['context_mid'], d[ 'context_right'] = context(questionaire.questions, len(keyword), p) result.append(d) return HttpResponse(json.dumps({'result': result})) return render(request, 'search.html', rdata)
def tip(request, hid): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) helps = Help.objects.filter(id=int(hid)) if len(helps) == 0: rdata['info'] = '帮助不存在' else: help = helps[0] if not suser.admin_all and not help.released: return render(request, 'permission_denied.html', {}) if op == 'create': help = Help.objects.create(founder=suser.id, create_time=datetime.datetime.now()) return HttpResponse(json.dumps({'hid': help.id})) if op == 'load': return HttpResponse( json.dumps({ 'title': help.title, 'content': help.content, 'attachment': help.attachment, 'released': help.released })) if op == 'save' or op == 'release': tip_string = json.loads(request.POST.get('tip')) title = tip_string['title'] content = tip_string['html'] attachment = tip_string['attachments'] released = (op == 'release') help = Help.objects.filter(id=int(hid)).update( title=title, content=content, attachment=attachment, released=released, release_time=datetime.datetime.now()) return HttpResponse(json.dumps({})) if op == 'delete': help.delete() return HttpResponse(json.dumps({})) return render(request, 'tip.html', rdata)
def admin_list(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_super: return render(request, 'permission_denied.html', {}) def get_admin_list(): admin_list = [] for admin in SUser.objects.filter(Q(admin_all=1) | Q( admin_survey=1)).filter(~Q(username='******')): admin_list.append({ 'uid': admin.id, 'username': admin.username, 'name': admin.name, 'admin_all': admin.admin_all, 'admin_survey': admin.admin_survey }) return admin_list # 加载 if op == 'load': return HttpResponse(json.dumps({'admin_list': get_admin_list()})) # 修改管理员状态 if op == 'add': username = request.POST.get('username') level = request.POST.get('level') value = int(request.POST.get('value')) if level == 'chief': susers = SUser.objects.filter(username=username) susers.update(admin_all=value) ulen = len(susers) elif level == 'survey': susers = SUser.objects.filter(username=username) susers.update(admin_survey=value) ulen = len(susers) return HttpResponse( json.dumps({ 'ulen': ulen, 'admin_list': get_admin_list() })) rdata['admin_list'] = get_admin_list() return render(request, 'admin_list.html', rdata)
def profile(request, uid): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if (not suser.admin_all) and (int(suser.id) != int(uid)): return render(request, 'permission_denied.html', {}) rdata['psuser'] = psuser = SUser.objects.get(id=uid) puser = User.objects.get(id=psuser.uid) if op == 'change_nickname': psuser.nickname = request.POST.get('nickname') psuser.save() return HttpResponse(json.dumps({})) if op == 'change_password': old_password = Utils.uglyDecrypt(request.POST.get('old_password')) new_password = Utils.uglyDecrypt(request.POST.get('new_password')) puser2 = auth.authenticate(username=puser.username, password=old_password) jdata = {} if puser2 is not None and puser2 == puser and puser2.is_active: puser.set_password(new_password) puser.save() jdata['result'] = 'yes' return HttpResponse(json.dumps(jdata)) else: jdata['result'] = 'no' return HttpResponse(json.dumps(jdata)) rq_list = [] anweraire_queries = { answeraire.qid: answeraire.submitted for answeraire in Answeraire.objects.filter(username=suser.username) } for questionaire in Questionaire.objects.all(): if questionaire.status in [1, 2, 3] and Utils.check_fill2( anweraire_queries, questionaire.id) in [2, 3]: rq_list.append( Utils.remakeq(suser, questionaire, False, anweraire_queries)) rq_list.sort(key=lambda x: x['create_time'], reverse=True) rdata['rq_list'] = rq_list return render(request, 'profile.html', rdata)
def prize_exchange(request, tid): # 验证身份,只有特定商家和特定用户 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) rdata['ticket'] = ticket = PrizeTicket.objects.get(id=tid) rdata['prize'] = prize = Prize.objects.get(id=ticket.pid) if suser.is_store: store = json.loads(prize.store) if not suser.id in store: return render(request, 'permission_denied.html', {}) else: if ticket.uid != suser.id: return render(request, 'permission_denied.html', {}) op = request.POST.get("op") if op == "exchange": if suser.is_store: ticket.use_status = ticket.use_status | 2 ticket.oid = suser.id else: ticket.use_status = ticket.use_status | 4 if ticket.use_status == 7: ticket.used = True ticket.use_time = datetime.datetime.now() ticket.save() return HttpResponse(json.dumps({})) if op == "if_confirm": jdata = {'result': 'not confirmed'} if ticket.use_status == 7: jdata['result'] = 'confirmed' return HttpResponse(json.dumps(jdata)) if ticket.used == True: return render(request, 'permission_denied.html', {}) if suser.is_store: ticket.use_status = ticket.use_status | 1 ticket.save() return render(request, 'prize_exchange.html', rdata)
def prize_add(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_all: return render(request, 'permission_denied.html', {}) if op == 'add_prize': title = request.POST.get('title') description = request.POST.get('description') credit = int(request.POST.get('credit')) price = int(request.POST.get('price')) expire_time = request.POST.get('expire_time') prize = Prize.objects.create(title=title, description=description, credit=credit, price=price, expire_time=expire_time) return HttpResponse(json.dumps({})) return render(request, 'prize_add.html', rdata)
def prize_add_store(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_all: return render(request, 'permission_denied.html', {}) if op == 'add_store': jdata = {'result': 'ok'} username = request.POST.get('username') if username.isdigit() and len(username) == 10: jdata['result'] = '请勿使用清华学号' elif len(SUser.objects.filter(username=username)) > 0: jdata['result'] = '用户名已存在' else: nickname = request.POST.get('nickname') password = Utils.uglyDecrypt(request.POST.get('password')) pid_list = json.loads(request.POST.get('pid_list')) user = User.objects.create_user(username=username, password=password) suser = SUser.objects.create(username=username, nickname=nickname, uid=user.id, is_sample=0, is_store=1) for pid in pid_list: prize = Prize.objects.get(id=int(pid)) store = json.loads(prize.store) store.append(suser.id) prize.store = json.dumps(store) prize.save() return HttpResponse(json.dumps(jdata)) rdata['prizes'] = prizes = list(reversed(Prize.objects.all())) return render(request, 'prize_add_store.html', rdata)
def survey_status(request, qid): if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_all: return render(request, 'permission_denied.html', {}) rdata['qid'] = qid questionaires = Questionaire.objects.filter(id=qid) if len(questionaires) == 0: rdata['info'] = '问卷不存在' return render(request, 'survey_status.html', rdata) questionaire = questionaires[0] def add_column(d, filter0, suser, s): val = eval('suser.' + s) d[s] = val if not val in filter0[s]: filter0[s][val] = True if op == 'get_list': items = [] filter0 = json.loads(request.POST.get('filter', {})) if len(filter0) == 0: filter0 = { 'submitted': { '是': True, '否': True }, 'username': ['', ''], 'submit_time': ['', ''], 'student_type': {}, 'political_status': {}, 'department': {}, 'enrollment_mode': {} } answeraires = Answeraire.objects.filter(qid=qid) for answeraire in answeraires: d = {} d['submitted'] = '是' if answeraire.submitted else '否' d['username'] = answeraire.username d['submit_time'] = answeraire.submit_time.strftime( '%Y-%m-%d %H:%M:%S') susers = SUser.objects.filter(username=answeraire.username) if len(susers) > 0: suser = susers[0] d['uid'] = suser.id add_column(d, filter0, suser, 'student_type') add_column(d, filter0, suser, 'political_status') add_column(d, filter0, suser, 'department') add_column(d, filter0, suser, 'enrollment_mode') else: d['student_type'] = d['political_status'] = d[ 'department'] = d['enrollment_mode'] = '已删除' addin = True addin &= filter0['submitted'][d['submitted']] if filter0['username'][0] != '': addin &= (filter0['username'][0] <= d['username']) if filter0['username'][1] != '': addin &= (filter0['username'][1] >= d['username']) if filter0['submit_time'][0] != '': addin &= (filter0['submit_time'][0] <= d['submit_time']) if filter0['submit_time'][1] != '': addin &= (filter0['submit_time'][1] >= d['submit_time']) addin &= filter0['student_type'][d['student_type']] addin &= filter0['political_status'][d['political_status']] addin &= filter0['department'][d['department']] addin &= filter0['enrollment_mode'][d['enrollment_mode']] if addin: items.append(d) order = request.POST.get('order', '') if_reversed = int(request.POST.get('reversed', 0)) if order != '': items = sorted(items, key=lambda item: item[order], reverse=if_reversed) return HttpResponse(json.dumps({ 'item_list': items, 'filter': filter0 })) return render(request, 'survey_status.html', rdata)
def prize_ticket(request, ptype, qid=-1): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) qid = int(qid) if op == 'clear_scaned': tid = int(request.POST.get('tid')) PrizeTicket.objects.filter(id=tid).update(use_status=0) return HttpResponse(json.dumps({})) if op == 'if_scan_qrcode': jdata = {'result': 'not scaned'} print(request.POST.get('tid')) tid = int(request.POST.get('tid')) if PrizeTicket.objects.get(id=tid).use_status > 0: jdata['result'] = 'scaned' return HttpResponse(json.dumps(jdata)) if ptype == 'p': # 某商品交易记录 rdata['personal'] = False prizes = Prize.objects.filter(id=qid) if len(prizes) == 0: return render(request, 'permission_denied.html', {}) prize = prizes[0] if (not suser.admin_all) and (not suser.id in json.loads(prize.store)): return render(request, 'permission_denied.html', {}) tickets = PrizeTicket.objects.filter(pid=qid) elif ptype == 'u': if (not suser.admin_all) and (suser.id != qid): return render(request, 'permission_denied.html', {}) qsuser = SUser.objects.get(id=qid) if qsuser.is_store: # 某商家交易记录 rdata['personal'] = False rdata['is_store'] = True tickets = PrizeTicket.objects.filter(oid=qid) else: # 某用户兑换记录 rdata['personal'] = True tickets = PrizeTicket.objects.filter(uid=qid) else: return render(request, 'permission_denied.html', {}) def remake_tickets(tickets, d): # 去掉不合法的 ticket_list = [] for ticket in tickets: prizes = Prize.objects.filter(id=ticket.pid) if len(prizes) == 0: continue susers = SUser.objects.filter(id=ticket.uid) if len(susers) == 0: nickname = '已删除' else: nickname = susers[0].nickname prize = prizes[0] ticket_list.append({ 'tid': ticket.id, 'pid': prize.id, 'title': prize.title, 'nickname': nickname, 'credit': prize.credit, 'price': prize.price, 'used': ticket.used, 'cleared': ticket.cleared, 'use_time': ticket.use_time.strftime('%Y-%m-%d %H:%M:%S'), 'clear_time': ticket.clear_time.strftime('%Y-%m-%d %H:%M:%S'), 'description': prize.description }) d['tickets'] = list(reversed(ticket_list)) return if op == 'refresh_prize_list': tp = request.POST.get('type') if tp == 'cleared': tickets = tickets.filter(cleared=True) elif tp == 'uncleared': tickets = tickets.filter(cleared=False).filter(used=True) elif tp == 'unused': tickets = tickets.filter(used=False) d = {} remake_tickets(tickets, d) return HttpResponse(json.dumps(d)) remake_tickets(tickets, rdata) if op == 'clear_money': money = 0 for t in rdata['tickets']: ticket = PrizeTicket.objects.get(id=t['tid']) prize = Prize.objects.get(id=t['pid']) money += (int(ticket.used) - int(ticket.cleared)) * prize.price ticket.cleared = True ticket.clear_time = datetime.datetime.now() ticket.save() return HttpResponse(json.dumps({'money': money})) # 计算金额 if not rdata['personal']: used = 0 cleared = 0 money = 0 for t in rdata['tickets']: used += int(t['used']) cleared += int(t['cleared']) money += (int(t['used']) - int(t['cleared'])) * int(t['price']) rdata['total'] = len(rdata['tickets']) rdata['cleared'] = cleared rdata['uncleared'] = used - cleared rdata['unused'] = rdata['total'] - used rdata['money'] = money return render(request, 'prize_ticket.html', rdata)
def report(request, qid): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) return render(request, 'report.html', rdata)
def survey(request, qid): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) rdata['viewable'] = 1 rdata['qid'] = qid status = -1 now = datetime.datetime.now() def update_questionaire(questionaire, title, qstring): questionaire.title = title questionaire.questions = qstring questionaire.update_time = datetime.datetime.now() def release_to_users(questionaire): sample_list_id = questionaire.sample_list_id if sample_list_id == -1: susers = SUser.objects.filter(is_sample=1) else: sample_list = SampleList.objects.filter(id=sample_list_id) susers = [] if len(sample_list) > 0: sample_list = json.loads(sample_list[0].sample_list) for suser_id in sample_list: suser = SUser.objects.filter(id=suser_id) if len(suser) > 0: susers.append(suser[0]) questionaire.status = 1 questionaire.save() # 添加新问卷 if op == 'create': questionaire = Questionaire.objects.create(status=0, create_time=now, update_time=now, founder=suser.username) questionaire.save() return HttpResponse(json.dumps({'qid': questionaire.id})) questionaires = Questionaire.objects.filter(id=qid) if len(questionaires) == 0: rdata['viewable'] = 0 rdata['info'] = '问卷不存在' else: questionaire = questionaires[0] answered = len( Answeraire.objects.filter(qid=questionaire.id, username=suser.username, submitted=True)) > 0 status = questionaire.status # 加载问卷请求 if op == 'load': if status == 0 or status == 4 or status == 5: return HttpResponse( json.dumps({ 'status': status, 'title': questionaire.title, 'qstring': questionaire.questions })) elif status == 1: answeraire = Answeraire.objects.filter(qid=qid, username=suser.username) if len(answeraire): astring = answeraire[0].answers else: astring = '{}' return HttpResponse( json.dumps({ 'status': status, 'title': questionaire.title, 'qstring': questionaire.questions, 'astring': astring })) elif status == 2 or status == 3: answeraire = Answeraire.objects.filter(qid=qid, username=suser.username) if len(answeraire): astring = answeraire[0].answers else: astring = '{}' report = Analysis.get_report(qid) return HttpResponse( json.dumps({ 'status': status, 'title': questionaire.title, 'qstring': questionaire.questions, 'report': report, 'gender_code': suser.gender_code, 'student_type_code': suser.student_type_code, 'astring': astring, 'is_staff': suser.admin_all, 'report_template': questionaire.report_template })) else: assert (False) # 删除问卷 if op == 'delete': Answeraire.objects.filter(qid=questionaire.id).delete() Report.objects.filter(qid=questionaire.id).delete() questionaire.delete() return HttpResponse(json.dumps({})) # 复制问卷 if op == 'copy': new_questionaire = Questionaire.objects.create( status=0, create_time=now, update_time=now, founder=suser.username, title=questionaire.title, questions=questionaire.questions) new_questionaire.save() return HttpResponse(json.dumps({})) # 导出问卷 if op == 'export' or op == 'export_all': if status == 1 or status == 2 or status == 3: export_all = (True if op == 'export_all' else False) excel_name = Analysis.export(qid, export_all=export_all) if excel_name == None: return HttpResponse( json.dumps({ 'result': 'no', 'info': '尚未有人填写问卷!' })) else: return HttpResponse( json.dumps({ 'result': 'yes', 'export_path': excel_name })) else: return HttpResponse( json.dumps({ 'result': 'no', 'info': '问卷尚未发布!' })) # 存储问卷模板 if op == 'save_report_template': report_template = request.POST.get('report_template') questionaire.report_template = report_template questionaire.save() return HttpResponse(json.dumps({})) # 开放报告 if op == 'release_report': questionaire.status = 3 questionaire.save() return HttpResponse(json.dumps({})) # 撤回报告 if op == 'withdraw_report': questionaire.status = 2 questionaire.save() return HttpResponse(json.dumps({})) # 审核通过 if op == 'verify_yes': questionaire.status = 1 questionaire.save() return HttpResponse(json.dumps({})) # 审核不通过 if op == 'verify_no': questionaire.status = 5 questionaire.save() return HttpResponse(json.dumps({})) rdata['editable'] = editable = (suser.admin_all or questionaire.founder == suser.username) # 问卷修改状态 if status == 0 or status == 5: # 添加可选样本列表 rdata['sample_lists'] = SampleList.objects.all() # 修改中管理员可见 if not editable: rdata['viewable'] = 0 rdata['info'] = '非管理员不能修改' else: # 修改问卷请求 if op == 'save': update_questionaire(questionaire, request.POST.get('title'), request.POST.get('qstring')) questionaire.save() return HttpResponse(json.dumps({})) # 发布问卷请求 elif op == 'release': jdata = {} questionaire.public = ifpublic = bool( int(request.POST.get('ifpublic'))) questionaire.credit = credit = int( request.POST.get('credit')) if request.POST.get('sample_list_id') is not None: questionaire.sample_list_id = sample_list_id = int( request.POST.get('sample_list_id')) if suser.admin_all or credit == 0: release_to_users(questionaire) jdata['result'] = '发布成功' else: questionaire.status = 4 jdata['result'] = '已提交审核' questionaire.release_time = now update_questionaire(questionaire, request.POST.get('title'), request.POST.get('qstring')) questionaire.save() return HttpResponse(json.dumps(jdata)) # 问卷填写状态 elif status == 1: # 检验是否可见、是否已经填写 if Utils.check_allow(suser, questionaire) != 1: rdata['viewable'] = 0 rdata['info'] = '没有权限访问' else: rdata['viewable'] = 1 if Utils.check_fill(suser, questionaire) == 3: rdata['info'] = '已经填写该问卷' rdata['permission_submit'] = 0 else: rdata['permission_submit'] = 1 # 提交问卷请求 if op == 'submit': # 获取信息 if 'HTTP_X_FORWARDED_FOR' in request.META: ip = request.META['HTTP_X_FORWARDED_FOR'] else: ip = request.META['REMOTE_ADDR'] agent = request.META.get('HTTP_USER_AGENT', 'unknown') os = request.META.get('OS', 'unknown') # 记录 astring = request.POST.get('astring') complete = request.POST.get('complete', 'no') answeraire = Answeraire.objects.filter(qid=qid, username=suser.username) if len(answeraire) > 0: answeraire = answeraire[0] else: answeraire = Answeraire.objects.create( qid=qid, username=suser.username) answeraire.load_time = request.POST['load_time'] answeraire.submit_time = request.POST['submit_time'] answeraire.ip = ip answeraire.agent = agent answeraire.os = os answeraire.answers = astring answeraire.save() # 判断暂存还是提交 if complete == 'yes': answeraire.submitted = True answeraire.save() # 计算积分 suser.credit += questionaire.credit suser.save() return HttpResponse( json.dumps({'credit': questionaire.credit})) else: return HttpResponse(json.dumps({})) # 关闭问卷请求 if op == 'closeup': questionaire.close_time = datetime.datetime.now() questionaire.status = 2 questionaire.save() Answeraire.objects.filter(qid=questionaire.id).update( submitted=True) return HttpResponse(json.dumps({})) # 问卷结束/报告编辑状态 elif status == 2: if not editable: rdata['viewable'] = 0 rdata['info'] = '没有权限访问' # 报告公开状态 elif status == 3: if not editable and Utils.check_fill(suser, questionaire) != 3: rdata['viewable'] = 0 rdata['info'] = '没有权限访问' # 问卷管理员发布,待审核状态 elif status == 4: if not editable: rdata['viewable'] = 0 rdata['info'] = '没有权限访问' else: if questionaire.public: sample_list_name = '公共问卷' else: sample_list_id = questionaire.sample_list_id if sample_list_id != -1: sample_lists = SampleList.objects.filter( id=sample_list_id) if len(sample_lists) > 0: sample_list_name = sample_lists[0].name else: sample_list_name = '(未找到)' else: sample_list_name = '(全体样本)' rdata['sample_list_name'] = sample_list_name rdata['credit'] = questionaire.credit # 问卷出错状态 else: rdata['viewable'] = 0 rdata['info'] = '错误?没有该状态码' rdata['status'] = status return render(request, 'survey.html', rdata)
def sample_list(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_all and not suser.admin_survey: return render(request, 'permission_denied.html', {}) sample_list_id = int(request.GET.get('samplelist', -1)) page_n = int(request.GET.get('page', 1)) global temp global l if not temp: if sample_list_id == -1: l = {} else: sample_list = SampleList.objects.get(id=sample_list_id) l = set(json.loads(sample_list.sample_list)) print(temp, l) def get_suser_list(): ITEM_PER_PAGE = 50 susers = SUser.objects.order_by('id') n_susers = len(susers) page_s = (page_n - 1) * ITEM_PER_PAGE page_t = min(page_s + ITEM_PER_PAGE, n_susers) rdata['page_current'] = page_n rdata['page_max'] = (n_susers - 1) // ITEM_PER_PAGE + 1 return [{ 'uid': suser.id, 'username': suser.username, 'name': suser.name, 'is_sample': suser.username in l, 'credit': suser.credit } for suser in susers[page_s:page_t]] # 加载 if op == 'load': jdata = {} jdata['user_list'] = get_suser_list() jdata['sample_lists'] = sample_lists = [{ 'id': sample_list.id, 'name': sample_list.name } for sample_list in SampleList.objects.all()] jdata['sample_list_id'] = sample_list_id jdata['sample_list_size'] = len(l) # gender, student_type, department, policical_status, enrollment_mode show_statistic_option_ids = [6, 4, 33, 13, 40] jdata['show_statistic_options'] = [[ SUser.__var_name__[i], SUser.__var_chinese__[i] ] for i in show_statistic_option_ids] jdata['constraint_options'] = [[ SUser.__var_name__[i], SUser.__var_chinese__[i] ] for i in range(len(SUser.__var_name__))] return HttpResponse(json.dumps(jdata)) # 更改样本列表 if op == 'change_sample_list': temp = False return HttpResponse({}) # 新建用户列表 if op == 'new_sample_list': name = request.POST.get('sample_list_name', '') if name == '': name = time.strftime('%Y%m%d%H%M%S') sample_list = SampleList.objects.create(name=name, sample_list='[]') return HttpResponse( json.dumps({ 'id': sample_list.id, 'name': sample_list.name })) # 保存样本列表 if op == 'save_sample_list': jdata = {} sample_lists = SampleList.objects.filter(id=sample_list_id) if len(sample_lists) == 0: jdata['info'] = '没有找到此样本列表' else: sample_list = sample_lists[0] sample_list.sample_list = json.dumps(list(l)) sample_list.save() jdata['info'] = '保存成功' return HttpResponse(json.dumps(jdata)) # 导出样本列表 if op == 'export_sample_list': jdata = {} try: sample_list = SampleList.objects.get(id=sample_list_id) suser_usernames = json.loads(sample_list.sample_list) print(suser_usernames) susers = [ SUser.objects.get(username=suser_username) for suser_username in suser_usernames ] excel_name = Utils.export_user_list(susers) jdata['info'] = '导出成功' jdata['export_path'] = excel_name except Exception as e: print(e) jdata['info'] = '导出错误' return HttpResponse(json.dumps(jdata)) # 删除样本列表 if op == 'delete_sample_list': SampleList.objects.filter(id=sample_list_id).delete() return HttpResponse(json.dumps({'info': '删除成功'})) # 设置为样本 if op == 'sample_yes': temp = True usernames = json.loads(request.POST.get('usernames')) for username in usernames: l.add(username) return HttpResponse(json.dumps({'user_list': get_suser_list()})) # 设置为非样本 if op == 'sample_no': temp = True usernames = json.loads(request.POST.get('usernames')) for username in usernames: if username in l: l.remove(username) return HttpResponse(json.dumps({'user_list': get_suser_list()})) # 显示样本统计 if op == 'show_statistic': jdata = {} try: field = request.POST.get('field') susers = [SUser.objects.get(username=username) for username in l] cnt = {} for suser in susers: key = eval('suser.' + field) if not key in cnt: cnt[key] = 0 cnt[key] += 1 s = '' length = max(sum([cnt[key] for key in cnt]), 1) for key in cnt: value = cnt[key] s += key + ': ' + str(value) + ' (' + str( int(value / length * 100)) + '%)\n' jdata['res'] = s except Exception as e: print(e) jdata['res'] = '错误' return HttpResponse(json.dumps(jdata)) if op == 'autosampling': jdata = {} try: constraints = json.loads(request.POST.get('constraints')) ratio = int(request.POST.get('ratio')) / 100.0 cmd = 'SUser.objects.filter(~Q(username="******") & Q(is_store=False)).filter( ' for i in range(len(constraints)): c = constraints[i] if i > 0: if c[0] == 'and': cmd += ' & ' if c[0] == 'or': cmd += ' | ' if c[2] == 'gt': cmd += 'Q(' + c[1] + '__gt="' + c[3] + '")' elif c[2] == 'lt': cmd += 'Q(' + c[1] + '__lt="' + c[3] + '")' elif c[2] == 'eq': cmd += 'Q(' + c[1] + '="' + c[3] + '")' elif c[2] == 'neq': cmd += '~Q(' + c[1] + '="' + c[3] + '")' cmd += ' )' # print(cmd) susers = eval(cmd) n_sample = math.ceil(ratio * len(susers) - 1e-7) susers = list(susers) random.shuffle(susers) l = set([susers[i].username for i in range(n_sample)]) temp = True jdata['n_sample'] = n_sample jdata['user_list'] = get_suser_list() jdata['res'] = 'yes' except Exception as e: print(e) jdata['res'] = '错误' return HttpResponse(json.dumps(jdata)) '''# 自动样本生成 if op == 'auto_sample': # 构造命令 constraints = json.loads(request.POST.get('constraints')) upperbound = request.POST.get('upperbound') if upperbound == '': upperbound = 100 upperbound = float(upperbound) / 100.0 susers = SUser.objects.filter(~Q(username='******')) cnt = {} for i in range(len(susers)): suser = susers[i] suser.is_sample = False suser.save() tag = '' for constraint in constraints: tag += eval('suser.' + SUser.__var_name__[int(constraint)]) + '&' if not tag in cnt: cnt[tag] = [] cnt[tag].append(i) # 采样 sampled_susers = [] for tag in cnt: arr = cnt[tag] nn = int(math.ceil(len(arr) * upperbound)) sampled = random.sample(arr, nn) for sampled_idx in sampled: suser = susers[sampled_idx] suser.is_sample = True suser.save() return HttpResponse(json.dumps({}))''' get_suser_list() return render(request, 'sample_list.html', rdata)
def user_list(request): # 验证身份 if not request.user.is_authenticated: return Utils.redirect_login(request) rdata, op, suser = Utils.get_request_basis(request) if not suser.admin_all: return render(request, 'permission_denied.html', {}) ITEM_PER_PAGE = 50 lis = request.GET.get('list', 'all') page_n = int(request.GET.get('page', 1)) def get_suser_list(): susers = [] if lis == 'all': susers = SUser.objects.order_by('id') elif lis == 'sample': susers = SUser.objects.filter(is_sample=True).order_by('id') elif lis[0] == 'q': susers = SUser.objects.filter(username=lis[1:]) else: pass n_susers = len(susers) rdata['page_current'] = page_n rdata['page_max'] = (n_susers - 1) // ITEM_PER_PAGE + 1 page_s = (page_n - 1) * ITEM_PER_PAGE page_t = min(page_s + ITEM_PER_PAGE, n_susers) return [{ 'uid': suser.uid, 'username': suser.username, 'name': suser.name, 'department': suser.department, 'credit': suser.credit } for suser in susers[page_s:page_t]] # 导入 if op == 'load': return HttpResponse(json.dumps({'user_list': get_suser_list()})) # 删除用户 if op == 'delete': username_list = json.loads(request.POST.get('username_list')) for username in username_list: if username == 'root': continue susers = SUser.objects.filter(username=username) if len(susers) > 0: suser = susers[0] uid = suser.uid users = User.objects.filter(id=uid) if len(users) > 0: user = users[0] user.delete() suser.delete() return HttpResponse(json.dumps({'user_list': get_suser_list()})) # 删除所有用户 if op == 'delete_all': susers = SUser.objects.filter(~Q(username='******')) for suser in susers: uid = suser.uid users = User.objects.filter(id=uid) if len(users) > 0: user = users[0] user.delete() suser.delete() return HttpResponse(json.dumps({'user_list': get_suser_list()})) # 添加用户 if op == 'add_new_user': username = request.POST.get('username') # 检查username susers = SUser.objects.filter(username=username) if len(susers) > 0: result = '用户名已存在' else: password = username # password = Utils.hash_md5(username) user = User.objects.create_user(username=username, password=password) suser = SUser.objects.create(uid=user.id, username=username, nickname=username) result = 'yes' return HttpResponse( json.dumps({ 'result': result, 'user_list': get_suser_list() })) # 修改积分 if op == 'change_credit': username = request.POST.get('username') credit = request.POST.get('credit') suser = SUser.objects.get(username=username) suser.credit = credit suser.save() return HttpResponse(json.dumps({})) # 导入用户名单 f = request.FILES.get('upload', None) if not f is None: f_path = Utils.upload_file(f) # 读入每一行 f = codecs.open(f_path, 'r', 'gbk') # f = open(f_path, 'r', encoding='gbk') line_no = -1 while True: line_no += 1 try: line = f.readline() except: print(line_no, 'ignore') continue if len(line) == 0: break if line_no == 0: continue if line[-2:] == '\r\n': line = line[:-2] # a = line.split(',') a = [] s = '' inquote = False for i in range(len(line)): c = line[i] if c == '\"': if i > 0 and line[i - 1] == '\"': s += '\"' inquote = not inquote elif c == ',' and not inquote: a.append(s) s = '' else: s += c a.append(s) print(line_no) username = a[0] users = User.objects.filter(username=username) if len(users) > 0: # 修改用户信息 suser = SUser.objects.filter(username=username).update( name=a[1], name_english=a[2], student_type_code=a[3], student_type=a[4], gender_code=a[5], gender=a[6], birthday=a[7], ethnic_code=a[8], ethnic=a[9], nationality_code=a[10], nationality=a[11], political_status_code=a[12], political_status=a[13], certificate_type_code=a[14], certificate_type=a[15], certificate_number=a[16], marital_status_code=a[17], marital_status=a[18], original_education_code=a[19], original_education=a[20], bachelor_school=a[21], bachelor_school_code=a[22], bachelor_major=a[23], bachelor_major_code=a[24], bachelor_graduate_time=a[25], master_school=a[26], master_school_code=a[27], master_major=a[28], master_major_code=a[29], master_graduate_time=a[30], master_degree_date=a[31], department_number=a[32], department=a[33], secondary_subject_code=a[34], secondary_subject=a[35], advisor_certificate_number=a[36], enrollment_time=a[37], scheme_time=a[38], enrollment_mode_code=a[39], enrollment_mode=a[40], admission_type_code=a[41], admission_type=a[42], targeted_area_type_code=a[43], targeted_area_type=a[44], student_source_code=a[45], student_source=a[46], examination_ticket_number=a[47], bachelor_student_number=a[48], master_student_number=a[49], origin_place_code=a[50], origin_place=a[51], dormitory_address=a[52], dormitory_telephone=a[53], original_unit=a[54], client_unit=a[55], email=a[56], if_bed=a[57], if_socialized_madicine=a[58], if_resident_migration=a[59], if_internal_school_roll=a[60], if_national_school_roll=a[61], if_school_roll_abnormity=a[62], if_international_student=a[63], estimated_graduate_date=a[64], defense_date=a[65], completion_date=a[66], if_graduate=a[67], completion_mode_code=a[68], completion_mode=a[69], graduate_certificate_number=a[70], degree_confer_date=a[71], degree_confer_mode_code=a[72], degree_confer_mode=a[73], training_type_code=a[74], training_type=a[75], training_direction_code=a[76], training_direction=a[77], disciplines_field_code=a[78], disciplines_field=a[79], major_code=a[80], major=a[81], diploma_number=a[82], school_roll_status_code=a[83], campus_code=a[84], campus=a[85], remark=a[86], advisor_name=a[87], special_condition_code=a[88], special_condition=a[89], if_primary_subject=a[90], origin_province_code=a[91], origin_province=a[92], origin_city_code=a[93], origin_city=a[94], address_province_code=a[95], address_province=a[96], client_unit_city_code=a[97], client_unit_city=a[98], original_student_number=a[99], abnormity_type_code=a[100], abnormity_type=a[101], alteration_date=a[102]) else: # 新建用户信息 password = username user = User.objects.create_user(username=username, password=password) suser = SUser.objects.create(uid=user.id, username=a[0], nickname=a[0], name=a[1], name_english=a[2], student_type_code=a[3], student_type=a[4], gender_code=a[5], gender=a[6], birthday=a[7], ethnic_code=a[8], ethnic=a[9], nationality_code=a[10], nationality=a[11], political_status_code=a[12], political_status=a[13], certificate_type_code=a[14], certificate_type=a[15], certificate_number=a[16], marital_status_code=a[17], marital_status=a[18], original_education_code=a[19], original_education=a[20], bachelor_school=a[21], bachelor_school_code=a[22], bachelor_major=a[23], bachelor_major_code=a[24], bachelor_graduate_time=a[25], master_school=a[26], master_school_code=a[27], master_major=a[28], master_major_code=a[29], master_graduate_time=a[30], master_degree_date=a[31], department_number=a[32], department=a[33], secondary_subject_code=a[34], secondary_subject=a[35], advisor_certificate_number=a[36], enrollment_time=a[37], scheme_time=a[38], enrollment_mode_code=a[39], enrollment_mode=a[40], admission_type_code=a[41], admission_type=a[42], targeted_area_type_code=a[43], targeted_area_type=a[44], student_source_code=a[45], student_source=a[46], examination_ticket_number=a[47], bachelor_student_number=a[48], master_student_number=a[49], origin_place_code=a[50], origin_place=a[51], dormitory_address=a[52], dormitory_telephone=a[53], original_unit=a[54], client_unit=a[55], email=a[56], if_bed=a[57], if_socialized_madicine=a[58], if_resident_migration=a[59], if_internal_school_roll=a[60], if_national_school_roll=a[61], if_school_roll_abnormity=a[62], if_international_student=a[63], estimated_graduate_date=a[64], defense_date=a[65], completion_date=a[66], if_graduate=a[67], completion_mode_code=a[68], completion_mode=a[69], graduate_certificate_number=a[70], degree_confer_date=a[71], degree_confer_mode_code=a[72], degree_confer_mode=a[73], training_type_code=a[74], training_type=a[75], training_direction_code=a[76], training_direction=a[77], disciplines_field_code=a[78], disciplines_field=a[79], major_code=a[80], major=a[81], diploma_number=a[82], school_roll_status_code=a[83], campus_code=a[84], campus=a[85], remark=a[86], advisor_name=a[87], special_condition_code=a[88], special_condition=a[89], if_primary_subject=a[90], origin_province_code=a[91], origin_province=a[92], origin_city_code=a[93], origin_city=a[94], address_province_code=a[95], address_province=a[96], client_unit_city_code=a[97], client_unit_city=a[98], original_student_number=a[99], abnormity_type_code=a[100], abnormity_type=a[101], alteration_date=a[102]) f.close() # 导出用户名单 if op == 'export': size = request.POST.get('size') if size == 'all': susers = SUser.objects.all() elif size == 'sample': susers = SUser.objects.filter(is_sample=True) else: susers = [] excel_name = Utils.export_user_list(susers) return HttpResponse(json.dumps({'export_path': excel_name})) get_suser_list() return render(request, 'user_list.html', rdata)