def upload_path(self, instance, filename): # file will be uploaded to MEDIA_ROOT/file/<ym>/<stamp>.<ext> return '{ym}/{stamp}{ext}'.format( ym=tc.local_string(format='%Y%m'), stamp=tc.local_timestamp(ms=True), ext=os.path.splitext(filename)[1].lower(), )
def djfile_content_storage(content, ext='jpeg', base_path='file', file_path=None): if not file_path: # Joint File Path # Base Path base_path = settings.DJANGO_FILE_DOWNLOAD_BASE_PATH if hasattr( settings, 'DJANGO_FILE_DOWNLOAD_BASE_PATH') else base_path # YM Path ym_path = tc.local_string(format='%Y%m') if hasattr( settings, 'DJANGO_FILE_DOWNLOAD_USE_YM' ) and settings.DJANGO_FILE_DOWNLOAD_USE_YM else '' # File Name file_name = tc.local_string(format='%Y%m%d%H%M%S') if hasattr( settings, 'DJANGO_FILE_DOWNLOAD_USE_DT' ) and settings.DJANGO_FILE_DOWNLOAD_USE_DT else hashlib.md5( content).hexdigest() # File Path file_path = '{0}/{1}{2}{3}.{4}'.format(base_path, ym_path, ym_path and '/', file_name, ext) # File Save if not default_storage.exists(file_path): default_storage.save(file_path, ContentFile(content)) # File URL file_url = '{0}{1}'.format( settings.DOMAIN if hasattr(settings, 'DOMAIN') else '', default_storage.url(file_path)) return file_path, file_url
def upgrade_data(self): return { 'uid': self.uid, 'is_upgrade': self.final_is_upgrade, 'upgrade_time': tc.datetime_to_string(tc.to_local_datetime(self.upgrade_time)) if self.final_is_upgrade and self.upgrade_time else '', 'expire_time': tc.datetime_to_string(tc.to_local_datetime(self.expire_time)) if self.final_is_upgrade and self.expire_time else '', 'upgrade_count': self.upgrade_count, }
def upload_img_path(self, filename): '''上传图片的默认路径''' # usonpython.JPG return 'images/{ym}/{stamp}.{ext}'.format( ym=tc.local_string(format='%Y-%m'), stamp=tc.local_timestamp(), # ext=filename.split('.')[1].lower(), ext=os.path.splitext(filename)[1].lower(), )
def music(self, touser=None, fromuser=None, title=None, description=None, music_url=None, hq_music_url=None, media_id=None): """ <xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[music] ]></MsgType> <Music> <Title>< ![CDATA[TITLE] ]></Title> <Description>< ![CDATA[DESCRIPTION] ]></Description> <MusicUrl>< ![CDATA[MUSIC_Url] ]></MusicUrl> <HQMusicUrl>< ![CDATA[HQ_MUSIC_Url] ]></HQMusicUrl> <ThumbMediaId>< ![CDATA[media_id] ]></ThumbMediaId> </Music> </xml> """ return pair_to_xml([('ToUserName', touser), ('FromUserName', fromuser), ('CreateTime', tc.utc_timestamp()), ('MsgType', 'music'), ('Music', [ ('Title', title), ('Description', description), ('MusicUrl', music_url), ('HQMusicUrl', hq_music_url), ('ThumbMediaId', media_id), ])])
def Crawl(self, num, date, direct, distance): self.rec_id = num self.rec_date = date self.id_tag = self.rec_id[0:2] self.id_num = int(self.rec_id[2:10]) self.receipt = {} cont = 0 cont2 = 0 while (abs(int(self.id_num) - int(self.rec_id[2:10])) < distance): success = self.Query() if success is True: self.id_num += direct cont = 0 cont2 = 0 elif (success is False) and (abs(cont2) < 3): print '!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' self.id_num += direct cont2 += direct elif (success is False) and (cont == 0) and (abs(cont2) >= 3): self.rec_date = TimeConvert(self.rec_date, direct) print "TimeConvert : " + self.rec_date self.id_num -= cont2 cont2 = 0 cont += 1 elif (success is False) and (cont != 0) and (abs(cont2) >= 3): break else: log.error('main loop unusually break') sys.exit(1) return self.receipt
def upload_file_path(self, filename): ''' 上传模板文件 :param filename: 模板文件名 :return: 文件存放路径 ''' return "templatefile/{ym}/".format(ym=tc.local_string( format='%Y-%m')) + filename
def get_questions(request): """ 获取题目信息接口 :param request: 请求对象 :return: 返回json数据: user_info: 用户信息;kind_info: 比赛信息;qa_id: 比赛答题记录;questions: 比赛随机后的题目; """ kind_id = request.GET.get('kind_id', '') # 获取kind_id uid = request.GET.get('uid', '') # 获取uid try: # 获取比赛信息 kind_info = CompetitionKindInfo.objects.select_for_update().get( kind_id=kind_id) except CompetitionKindInfo.DoesNotExist: # 未获取到,返回错误码100001 return json_response(*CompetitionError.CompetitionNotFound) try: # 获取题库信息 bank_info = BankInfo.objects.get(bank_id=kind_info.bank_id) except BankInfo.DoesNotExist: # 未获取到,返回错误码100004 return json_response(*CompetitionError.BankInfoNotFound) try: # 获取用户信息 profile = Profile.objects.get(uid=uid) except Profile.DoesNotExist: # 未获取到,返回错误码200001 return json_response(*ProfileError.ProfileNotFound) qc = ChoiceInfo.objects.filter(bank_id=kind_info.bank_id) # 选择题 qf = FillInBlankInfo.objects.filter(bank_id=kind_info.bank_id) # 填空题 questions = [] # 将两种题型放到同一个列表中 for i in qc.iterator(): questions.append(i.data) for i in qf.iterator(): questions.append(i.data) question_num = kind_info.question_num # 出题数 q_count = bank_info.total_question_num # 总题数 if q_count < question_num: # 出题数大于总题数,返回错误码100005 return json_response(CompetitionError.QuestionNotSufficient) qs = random.sample(questions, question_num) # 随机分配题目 qa_info = CompetitionQAInfo.objects.select_for_update( ).create( # 创建答题log数据 kind_id=kind_id, uid=uid, qsrecord=[q['question'] for q in qs], asrecord=[q['answer'] for q in qs], total_num=question_num, started_stamp=tc.utc_timestamp(ms=True, milli=True), # 设置开始时间戳 started=True) for i in qs: # 剔除答案信息 i.pop('answer') return json_response( 200, 'OK', { # 返回JSON数据,包括题目信息,答题log信息等 'kind_info': kind_info.data, 'user_info': profile.data, 'qa_id': qa_info.qa_id, 'questions': qs })
def test_time_format(self): assert tc.format() == tc.TIME_FORMAT timeformat = '%Y%m%d%H%M%S' tc.__init__(format=timeformat) assert tc.TIME_FORMAT == timeformat assert tc.format() == timeformat tc.__init__(format=tc.BASE_TIME_FORMAT)
def text(self, touser=None, fromuser=None, content=None): """ <xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[text] ]></MsgType> <Content>< ![CDATA[你好] ]></Content> </xml> """ return pair_to_xml([('ToUserName', touser), ('FromUserName', fromuser), ('CreateTime', tc.utc_timestamp()), ('MsgType', 'text'), ('Content', content)])
def short_url_redirect(request, surl): """ >> Chrome 请求 ?nickname=姜戈 >> Django 获取 u'?nickname=%E5%A7%9C%E6%88%88' >> furl(lurl).add(furl(request.get_raw_uri()).query.params).url ?nickname=%C3%A5%C2%A7%C2%9C%C3%A6%C2%88%C2%88 >> furl(lurl).add(furl(cc.Convert2Utf8(request.get_raw_uri())).query.params).url ?nickname=%E5%A7%9C%E6%88%88 """ try: lurl = ShortURL.objects.get(surl=surl).lurl except ShortURL.DoesNotExist: lurl = None # Short URL Not Exists if not lurl: redirect_url = '' if hasattr(settings, 'DJANGO_SHORT_URL_REDIRECT_URL'): redirect_url = settings.DJANGO_SHORT_URL_REDIRECT_URL if hasattr(settings, 'DJANGO_SHORT_URL_FUNC') and hasattr( settings.DJANGO_SHORT_URL_FUNC, '__call__'): redirect_url = settings.DJANGO_SHORT_URL_FUNC(request) if not redirect_url: return render(request, 'django_short_url/errmsg.html', { 'title': 'Error', 'errmsg': 'Short URL not Exists' }) return redirect(redirect_url) flurl = furl(lurl) if hasattr(settings, 'DJANGO_SHORT_URL_ADD_TIMESTAMP') and getattr( settings, 'DJANGO_SHORT_URL_ADD_TIMESTAMP'): stamp_key = getattr( settings, 'DJANGO_SHORT_URL_TIMESTAMP_KEY') if hasattr( settings, 'DJANGO_SHORT_URL_TIMESTAMP_KEY') else 't' flurl = flurl.remove([stamp_key]).add({stamp_key: tc.utc_timestamp()}) return redirect( flurl.add(furl(cc.Convert2Utf8( request.get_raw_uri())).query.params).url)
def voice(self, touser=None, fromuser=None, media_id=None): """ <xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[voice] ]></MsgType> <Voice> <MediaId>< ![CDATA[media_id] ]></MediaId> </Voice> </xml> """ return pair_to_xml([('ToUserName', touser), ('FromUserName', fromuser), ('CreateTime', tc.utc_timestamp()), ('MsgType', 'voice'), ('Voice', [('MediaId', media_id)])])
def news(self, touser=None, fromuser=None, items=[]): """ <xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[news] ]></MsgType> <ArticleCount>2</ArticleCount> <Articles> <item> <Title>< ![CDATA[title1] ]></Title> <Description>< ![CDATA[description1] ]></Description> <PicUrl>< ![CDATA[picurl] ]></PicUrl> <Url>< ![CDATA[url] ]></Url> </item> <item> <Title>< ![CDATA[title] ]></Title> <Description>< ![CDATA[description] ]></Description> <PicUrl>< ![CDATA[picurl] ]></PicUrl> <Url>< ![CDATA[url] ]></Url> </item> </Articles> </xml> """ articleCount = len(items) if not 0 < articleCount < 8: return return pair_to_xml([ ('ToUserName', touser), ('FromUserName', fromuser), ('CreateTime', tc.utc_timestamp()), ('MsgType', 'news'), ('ArticleCount', articleCount), ('Articles', [[('Title', item.get('title', '')), ('Description', item.get('description', '')), ('PicUrl', item.get('picurl', '')), ('Url', item.get('url', ''))] for item in items]) ])
def video(self, touser=None, fromuser=None, media_id=None, title=None, description=None): """ <xml> <ToUserName>< ![CDATA[toUser] ]></ToUserName> <FromUserName>< ![CDATA[fromUser] ]></FromUserName> <CreateTime>12345678</CreateTime> <MsgType>< ![CDATA[video] ]></MsgType> <Video> <MediaId>< ![CDATA[media_id] ]></MediaId> <Title>< ![CDATA[title] ]></Title> <Description>< ![CDATA[description] ]></Description> </Video> </xml> """ return pair_to_xml([('ToUserName', touser), ('FromUserName', fromuser), ('CreateTime', tc.utc_timestamp()), ('MsgType', 'video'), ('Video', [('MediaId', media_id), ('Title', title), ('Description', description)])])
def test_remove_microsecond(self): dt = tc.remove_microsecond(tc.utc_datetime()) assert dt.microsecond == 0
def test_several_days_ago(self): assert isinstance(tc.several_days_ago(days=1), datetime.datetime)
def test_validate_string(self): assert tc.validate_string('1988-06-15 12:12:12', '%Y-%m-%d %H:%M:%S') assert not tc.validate_string('19880615121212', '%Y-%m-%d %H:%M:%S')
def main(): # Variable print(">> tc.TIME_ZONE") print(" Exec: {}".format("tc.TIME_ZONE")) print(" Result: {}".format(tc.TIME_ZONE)) print() print(">> tc.TIME_FORM") print(" Exec: {}".format("tc.TIME_FORMAT")) print(" Result: {}".format(tc.TIME_FORMAT)) print() # DATETIME print(">> utc_datetime()") print(" Exec: {}".format("tc.utc_datetime()")) print(" Result: {}".format(tc.utc_datetime())) print() print(">> local_datetime()") print(" Exec: {}".format("tc.local_datetime()")) print(" Result: {}".format(tc.local_datetime())) print() print(">> to_utc_datetime(local_dt, timezone=TIME_ZONE)") print(" Exec: {}".format("tc.to_utc_datetime(datetime.datetime.now(), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.to_utc_datetime(datetime.datetime.now(), timezone=TIME_ZONE))) print(" Exec: {}".format("tc.to_utc_datetime(tc.local_datetime(), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.to_utc_datetime(tc.local_datetime(), timezone=TIME_ZONE))) print(" Exec: {}".format("tc.to_utc_datetime(tc.utc_datetime(), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.to_utc_datetime(tc.utc_datetime(), timezone=TIME_ZONE))) print(" Exec: {}".format("tc.to_utc_datetime(tc.make_naive(tc.utc_datetime()), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.to_utc_datetime(tc.make_naive(tc.utc_datetime()), timezone=TIME_ZONE))) print() print(">> to_local_datetime(utc_dt, timezone=TIME_ZONE)") print(" Exec: {}".format("tc.to_local_datetime(datetime.datetime.utcnow(), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.to_local_datetime(datetime.datetime.utcnow(), timezone=TIME_ZONE))) print(" Exec: {}".format("tc.to_local_datetime(tc.utc_datetime(), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.to_local_datetime(tc.utc_datetime(), timezone=TIME_ZONE))) print() print(">> yesterday_utc_datetime()") print(" Exec: {}".format("tc.yesterday_utc_datetime()")) print(" Result: {}".format(tc.yesterday_utc_datetime())) print() print(">> tomorrow_utc_datetime()") print(" Exec: {}".format("tc.tomorrow_utc_datetime()")) print(" Result: {}".format(tc.tomorrow_utc_datetime())) print() print(">> yesterday_local_datetime()") print(" Exec: {}".format("tc.yesterday_local_datetime()")) print(" Result: {}".format(tc.yesterday_local_datetime())) print() print(">> tomorrow_local_datetime()") print(" Exec: {}".format("tc.tomorrow_local_datetime()")) print(" Result: {}".format(tc.tomorrow_local_datetime())) print() # STRING print(">> utc_string(utc_dt=None, format=TIME_FORMAT)") print(" Exec: {}".format("tc.utc_string(utc_dt=None, format=TIME_FORMAT)")) print(" Result: {}".format(tc.utc_string(utc_dt=None, format=TIME_FORMAT))) print() print(">> local_string(local_dt=None, format=TIME_FORMAT)") print(" Exec: {}".format("tc.local_string(local_dt=None, format=TIME_FORMAT)")) print(" Result: {}".format(tc.local_string(local_dt=None, format=TIME_FORMAT))) print() print(">> datetime_to_string(dt, format=TIME_FORMAT)") print(" Exec: {}".format("tc.datetime_to_string(datetime.datetime.now(), format=TIME_FORMAT)")) print(" Result: {}".format(tc.datetime_to_string(datetime.datetime.now(), format=TIME_FORMAT))) print() # TIMESTAMP print(">> utc_timestamp(utc_dt=None)") print(" Exec: {}".format("tc.utc_timestamp(utc_dt=None)")) print(" Result: {}".format(tc.utc_timestamp(utc_dt=None))) print() print(">> local_timestamp(local_dt=None)") print(" Exec: {}".format("tc.local_timestamp(local_dt=None)")) print(" Result: {}".format(tc.local_timestamp(local_dt=None))) print() print(">> datetime_to_timestamp(dt, format=TIME_FORMAT)") print(" Exec: {}".format("tc.datetime_to_timestamp(datetime.datetime.now())")) print(" Result: {}".format(tc.datetime_to_timestamp(datetime.datetime.now()))) print() # STRING ==> DATETIME print(">> string_to_utc_datetime(string, format=TIME_FORMAT)") print(" Exec: {}".format("tc.string_to_utc_datetime('2015-10-04 12:12:12', format=TIME_FORMAT)")) print(" Result: {}".format(tc.string_to_utc_datetime('2015-10-04 12:12:12', format=TIME_FORMAT))) print() print(">> string_to_local_datetime(string, format=TIME_FORMAT)") print(" Exec: {}".format("tc.string_to_local_datetime('2015-10-04 12:12:12', format=TIME_FORMAT)")) print(" Result: {}".format(tc.string_to_local_datetime('2015-10-04 12:12:12', format=TIME_FORMAT))) print() print(">> utc_string_to_utc_datetime(utc_string, format=TIME_FORMAT)") print(" Exec: {}".format("tc.utc_string_to_utc_datetime('2015-10-04 12:12:12', format=TIME_FORMAT)")) print(" Result: {}".format(tc.utc_string_to_utc_datetime('2015-10-04 12:12:12', format=TIME_FORMAT))) print() # STRING ==> TIMESTAMP print(">> string_to_timestamp(string, format=TIME_FORMAT)") print(" Exec: {}".format("tc.string_to_timestamp('2015-10-04 12:12:12', format=TIME_FORMAT)")) print(" Result: {}".format(tc.string_to_timestamp('2015-10-04 12:12:12', format=TIME_FORMAT))) print() print(">> string_to_utc_timestamp(string, format=TIME_FORMAT)") print(" Exec: {}".format("tc.string_to_utc_timestamp('2015-10-04 12:12:12', format=TIME_FORMAT)")) print(" Result: {}".format(tc.string_to_utc_timestamp('2015-10-04 12:12:12', format=TIME_FORMAT))) print() print(">> string_to_local_timestamp(string, format=TIME_FORMAT)") print(" Exec: {}".format("tc.string_to_local_timestamp('2015-10-04 12:12:12', format=TIME_FORMAT)")) print(" Result: {}".format(tc.string_to_local_timestamp('2015-10-04 12:12:12', format=TIME_FORMAT))) print() # TIME_DELTA print(">> timestamp_delta(stamp1, stamp2)") print(" Exec: {}".format("tc.timestamp_delta(tc.utc_timestamp(), tc.utc_timestamp() + 10000)")) print(" Result: {}".format(tc.timestamp_delta(tc.utc_timestamp(), tc.utc_timestamp() + 10000))) print() print(">> datetime_delta(dt1, dt2)") print(" Exec: {}".format("tc.datetime_delta(tc.utc_datetime(), tc.tomorrow_utc_datetime())")) print(" Result: {}".format(tc.datetime_delta(tc.utc_datetime(), tc.tomorrow_utc_datetime()))) print() print(">> string_delta(string1, string2, format=TIME_FORMAT, format1='', format2='')") print(" Exec: {}".format("tc.string_delta('2015-09-10 10:10:10', '2015-09-09 09:09:09')")) print(" Result: {}".format(tc.string_delta('2015-09-10 10:10:10', '2015-09-09 09:09:09'))) print() # TIME_COUNT_DOWN print(">> timestamp_countdown(stamp)") print(" Exec: {}".format("tc.timestamp_countdown(tc.utc_timestamp() + 10000)")) print(" Result: {}".format(tc.timestamp_countdown(tc.utc_timestamp() + 10000))) print() print(">> datetime_countdown(dt)") print(" Exec: {}".format("tc.datetime_countdown(tc.tomorrow_utc_datetime())")) print(" Result: {}".format(tc.datetime_countdown(tc.tomorrow_utc_datetime()))) print() print(">> string_countdown(string, format=TIME_FORMAT)") print(" Exec: {}".format("tc.string_countdown('2999-09-09 09:09:09')")) print(" Result: {}".format(tc.string_countdown('2999-09-09 09:09:09'))) print() # AWARE vs NAIVE print(">> is_aware(value)") print(" Exec: {}".format("tc.is_aware(tc.utc_datetime())")) print(" Result: {}".format(tc.is_aware(tc.utc_datetime()))) print() print(">> make_naive(value, timezone=TIME_ZONE)") print(" Exec: {}".format("tc.make_naive(tc.utc_datetime(), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.make_naive(tc.utc_datetime(), timezone=TIME_ZONE))) print() print(">> is_naive(value)") print(" Exec: {}".format("tc.is_naive(datetime.datetime.now())")) print(" Result: {}".format(tc.is_naive(datetime.datetime.now()))) print() print(">> make_aware(value, timezone=TIME_ZONE)") print(" Exec: {}".format("tc.make_aware(datetime.datetime.now(), timezone=TIME_ZONE)")) print(" Result: {}".format(tc.make_aware(datetime.datetime.now(), timezone=TIME_ZONE))) print()
def get_questions(request): """ 获取题目信息接口 :param request: 请求对象 :return: 返回json数据: user_info: 用户信息;kind_info: 比赛信息;qa_id: 比赛答题记录;questions: 比赛随机后的题目; """ kind_id = request.GET.get('kind_id', '') uid = request.GET.get('uid', '') try: kind_info = CompetitionKindInfo.objects.select_for_update().get(kind_id=kind_id) except CompetitionKindInfo.DoesNotExist: return json_response(*CompetitionError.CompetitionNotFound) try: bank_info = BankInfo.objects.get(bank_id=kind_info.bank_id) except BankInfo.DoesNotExist: return json_response(*CompetitionError.BankInfoNotFound) try: profile = Profile.objects.get(uid=uid) except Profile.DoesNotExist: return json_response(*ProfileError.ProfileNotFound) qc = ChoiceInfo.objects.filter(bank_id=kind_info.bank_id) qf = FillInBlankInfo.objects.filter(bank_id=kind_info.bank_id) questions = [] for i in qc.iterator(): questions.append(i.data) for i in qf.iterator(): questions.append(i.data) question_num = kind_info.question_num q_count = bank_info.total_question_num if q_count < question_num: return json_response(CompetitionError.QuestionNotSufficient) qs = random.sample(questions, question_num) qa_info = CompetitionQAInfo.objects.select_for_update().create( kind_id=kind_id, uid=uid, qsrecord=[q['question'] for q in qs], asrecord=[q['answer'] for q in qs], total_num=question_num, started_stamp=tc.utc_timestamp(ms=True, milli=True), started=True ) for i in qs: i.pop('answer') return json_response(200, 'OK', { 'kind_info': kind_info.data, 'user_info': profile.data, 'qa_id': qa_info.qa_id, 'questions': qs })
def test_utc_datetime(self): dt = tc.utc_datetime() assert dt.tzinfo == pytz.utc dt = tc.utc_datetime(ms=False) assert dt.microsecond == 0
def test_is_local_datetime(self): assert tc.is_local_datetime(tc.local_datetime()) assert tc.is_local_datetime(tc.local_datetime(), local_tz=tc.TIME_ZONE) assert not tc.is_local_datetime(tc.utc_datetime())
def test_time_zone(self): assert tc.timezone() == tc.TIME_ZONE timezone = 'UTC' tc.__init__(timezone=timezone) assert tc.TIME_ZONE == timezone assert tc.timezone() == timezone
def test_local_date(self): assert tc.local_date() == datetime.datetime.date( datetime.datetime.now())
def test_utc_date(self): assert isinstance(tc.local_date(), datetime.date)
def test_local_datetime(self): dt = tc.local_datetime() assert str(dt.tzinfo) == tc.TIME_ZONE dt = tc.local_datetime(ms=False) assert dt.microsecond == 0
def test_to_local_datetime(self): assert tc.is_local_datetime(tc.to_local_datetime(tc.utc_datetime())) assert tc.is_local_datetime(tc.to_local_datetime(tc.local_datetime()))
def get_questions(request): """ 获取题目信息接口 :param request: 请求对象 :return: 返回json数据: user_info: 用户信息;kind_info: 比赛信息;qa_id: 比赛答题记录;questions: 比赛随机后的题目; """ kind_id = request.GET.get('kind_id', '') # 获取kind_id uid = request.GET.get('uid', '') # 获取uid #一次只有一条在测试的记录,提交之后的测试不会被删除 CompetitionQAInfo.objects.filter( kind_id=kind_id, uid=uid, started=True, finished=False, ).delete() try: # 获取比赛信息 kind_info = CompetitionKindInfo.objects.select_for_update().get( kind_id=kind_id) except CompetitionKindInfo.DoesNotExist: # 未获取到,返回错误码100001 return json_response(*CompetitionError.CompetitionNotFound) try: # 获取题库信息 bank_info = BankInfo.objects.get(bank_id=kind_info.bank_id) except BankInfo.DoesNotExist: # 未获取到,返回错误码100004 return json_response(*CompetitionError.BankInfoNotFound) try: # 获取用户信息 profile = Profile.objects.get(uid=uid) except Profile.DoesNotExist: # 未获取到,返回错误码200001 return json_response(*ProfileError.ProfileNotFound) A3QuestionGroup = QuestionGroupInfo.objects.filter( bank_id=kind_info.bank_id).filter(question_group_type=1) # A3选择题 BQuestionGroup = QuestionGroupInfo.objects.filter( bank_id=kind_info.bank_id).filter(question_group_type=2) # B选择题 A3QuestionGroups = [] for i in A3QuestionGroup.iterator(): A3QuestionGroups.append(i.data) A3QuestionGroups = random.sample(A3QuestionGroups, kind_info.A3_choice_num) BQuestionGroups = [] for i in BQuestionGroup.iterator(): BQuestionGroups.append(i.data) BQuestionGroups = random.sample(BQuestionGroups, kind_info.B_choice_num) A3QuestionNum = 0 A3qs = [] for i in A3QuestionGroups: A3chioces = ChoiceInfo.objects.filter(question_group_id=i["pk"]) for j in A3chioces.iterator(): A3QuestionNum += 1 A3data = j.data A3data.update({"group_question_txt": i["group_question_txt"]}) A3data.update({"group_question_count": i["group_question_count"]}) A3qs.append(A3data) BQuestionNum = 0 Bqs = [] for i in BQuestionGroups: Bchioces = ChoiceInfo.objects.filter(question_group_id=i["pk"]) for j in Bchioces.iterator(): BQuestionNum += 1 Bdata = j.data Bdata.update({"group_question_count": i["group_question_count"]}) Bqs.append(Bdata) actualQuestionNum = kind_info.A1_choice_num + kind_info.A2_choice_num + A3QuestionNum + BQuestionNum newA1ChoiceNum = kind_info.A1_choice_num newA2ChoiceNum = kind_info.A2_choice_num if actualQuestionNum < kind_info.question_num: diff = kind_info.question_num - actualQuestionNum newA1ChoiceNum = newA1ChoiceNum + diff // 2 newA2ChoiceNum = newA2ChoiceNum + diff // 2 newA1ChoiceNum = newA1ChoiceNum + diff % 2 # qf = FillInBlankInfo.objects.filter(bank_id=kind_info.bank_id) # 填空题 A1qc = ChoiceInfo.objects.filter(bank_id=kind_info.bank_id).filter( ctype=1) # A1选择题 A2qc = ChoiceInfo.objects.filter(bank_id=kind_info.bank_id).filter( ctype=2) # A2选择题 A1questions = [] for i in A1qc.iterator(): A1questions.append(i.data) A1qs = random.sample(A1questions, newA1ChoiceNum) A2questions = [] for i in A2qc.iterator(): A2questions.append(i.data) A2qs = random.sample(A2questions, newA2ChoiceNum) qs = A1qs + A2qs + A3qs + Bqs # 将两种题型放到同一个列表中 # for i in qc.iterator(): # questions.append(i.data) # for i in qf.iterator(): # questions.append(i.data) question_num = kind_info.question_num # 出题数 q_count = bank_info.total_question_num # 总题数 if q_count < question_num: # 出题数大于总题数,返回错误码100005 return json_response(CompetitionError.QuestionNotSufficient) # qs = random.sample(questions, question_num) # 随机分配题目 qa_info = CompetitionQAInfo.objects.select_for_update( ).create( # 创建答题log数据 kind_id=kind_id, uid=uid, qsrecord=[q['question'] for q in qs], asrecord=[q['answer'] for q in qs], total_num=question_num, started_stamp=tc.utc_timestamp(ms=True, milli=True), # 设置开始时间戳 started=True) for i in qs: # 剔除答案信息 tAnswers = i['answer'].split("|") if len(tAnswers) > 1: i['multiChoice'] = True else: i['multiChoice'] = False # i.pop('answer') return json_response( 200, 'OK', { # 返回JSON数据,包括题目信息,答题log信息等 'kind_info': kind_info.data, 'user_info': profile.data, 'qa_id': qa_info.qa_id, 'questions': qs })
def test_is_utc_datetime(self): assert tc.is_utc_datetime(tc.utc_datetime()) assert not tc.is_utc_datetime(tc.local_datetime())
def test_time_format(self): assert tc.format() == tc.TIME_FORMAT timeformat = '%Y%m%d%H%M%S' tc.__init__(format=timeformat) assert tc.TIME_FORMAT == timeformat assert tc.format() == timeformat
def submit_answer(request): """ 提交答案接口 :param request: 请求对象 :return: 返回json数据: user_info: 用户信息; qa_id: 比赛答题记录标识; kind_id: 比赛唯一标识 """ stop_stamp = tc.utc_timestamp(ms=True, milli=True) # 结束时间戳 qa_id = request.POST.get('qa_id', '') # 获取qa_id uid = request.POST.get('uid', '') # 获取uid kind_id = request.POST.get('kind_id', '') # 获取kind_id answer = request.POST.get('answer', '') # 获取answer try: # 获取比赛信息 kind_info = CompetitionKindInfo.objects.get(kind_id=kind_id) except CompetitionKindInfo.DoesNotExist: # 未获取到,返回错误码100001 return json_response(*CompetitionError.CompetitionNotFound) try: # 获取题库信息 bank_info = BankInfo.objects.get(bank_id=kind_info.bank_id) except BankInfo.DoesNotExist: # 未获取到返回错误码100004 return json_response(*CompetitionError.BankInfoNotFound) try: # 获取用户信息 profile = Profile.objects.get(uid=uid) except Profile.DoesNotExist: # 未获取到,返回错误码200001 return json_response(*ProfileError.ProfileNotFound) try: # 获取答题log信息 qa_info = CompetitionQAInfo.objects.select_for_update().get( qa_id=qa_id) except CompetitionQAInfo.DoesNotExist: # 未获取到,返回错误码100006 return json_response(*CompetitionError.QuestionNotFound) answer = answer.rstrip('#').split('#') # 处理答案数据 # print(answer) total, correct, wrong, correct_list, wrong_list = check_correct_num( answer) # 检查答题情况 # print(total) # print(correct) # print(wrong) # print(correct_list) # print(wrong_list) # return json_response(300, 'OK', { # 返回JSON数据 # 'qa_id': qa_id, # 'user_info': profile.data, # 'kind_id': kind_id, # }) qa_info.aslogrecord = answer qa_info.correct_list = correct_list qa_info.wrong_list = wrong_list qa_info.finished_stamp = stop_stamp qa_info.expend_time = stop_stamp - qa_info.started_stamp qa_info.finished = True qa_info.correct_num = correct # if total == qa_info.total_num else 0 qa_info.incorrect_num = wrong #if total == qa_info.total_num else qa_info.total_num qa_info.save() # 保存答题log if qa_info.correct_num == kind_info.question_num: # 得分处理 score = kind_info.total_score elif not qa_info.correct_num: score = 0 else: score = round( (kind_info.total_score / kind_info.question_num) * correct, 3) qa_info.score = score # 继续保存答题log qa_info.save() kind_info.total_partin_num += 1 # 保存比赛数据 kind_info.save() # 比赛答题次数 bank_info.partin_num += 1 bank_info.save() # 题库答题次数 if (kind_info.period_time > 0) and (qa_info.expend_time > kind_info.period_time * 60 * 1000): # 超时,不加入排行榜 qa_info.status = CompetitionQAInfo.OVERTIME qa_info.save() else: # 正常完成,加入排行榜 # add_to_rank(uid, kind_id, qa_info.score, qa_info.expend_time, qa_info.qa_id) qa_info.status = CompetitionQAInfo.COMPLETED qa_info.save() return json_response(200, 'OK', { # 返回JSON数据 'qa_id': qa_id, 'user_info': profile.data, 'kind_id': kind_id, })
def final_is_upgrade(self): return int(self.is_upgrade and tc.utc_datetime() < self.expire_time)
# -*- coding:utf-8 -*- import os import RBCS as aiml import re from CustomDesigns import CustomDesign import CustomConfig as cf # cd = CustomDesign(verbose=True) # 列举规则 测试 # cd.listRule(cf.custom_designColl, userID="alice") # 添加规则 测试。 # cd.setRuleFromFile(cf.custom_designColl, "bot", "alice", "rule_file") # cd.setSingleRule(cf.custom_designColl, "alice", "bob", "^.*你好呀$", "你好吗") # ruleList = [("^.*你好 $", "你好"), ("^.*你好吗$","你好吗"), ("^.*你好\?$#","你好?"),("^.*你好china\?$", " 你好?")] # cd.setRuleBatch(cf.custom_designColl, "alice", "bob", ruleList) def chain(): res = "我要出发" return res,"" if __name__ == "__main__": from TimeConvert import TimeConvert tn = TimeConvert(isPreferFuture=True) res = tn.parse(u'明天早晨') print res
def test_yesterday_local_datetime(self): assert isinstance(tc.yesterday_local_datetime(), datetime.datetime)
def submit_answer(request): """ 提交答案接口 :param request: 请求对象 :return: 返回json数据: user_info: 用户信息; qa_id: 比赛答题记录标识; kind_id: 比赛唯一标识 """ stop_stamp = tc.utc_timestamp(ms=True, milli=True) qa_id = request.POST.get('qa_id', '') uid = request.POST.get('uid', '') kind_id = request.POST.get('kind_id', '') answer = request.POST.get('answer', '') try: kind_info = CompetitionKindInfo.objects.get(kind_id=kind_id) except CompetitionKindInfo.DoesNotExist: return json_response(*CompetitionError.CompetitionNotFound) try: bank_info = BankInfo.objects.get(bank_id=kind_info.bank_id) except BankInfo.DoesNotExist: return json_response(*CompetitionError.BankInfoNotFound) try: profile = Profile.objects.get(uid=uid) except Profile.DoesNotExist: return json_response(*ProfileError.ProfileNotFound) try: qa_info = CompetitionQAInfo.objects.select_for_update().get(qa_id=qa_id) except CompetitionQAInfo.DoesNotExist: return json_response(*CompetitionError.QuestionNotFound) answer = answer.rstrip('#').split('#') total, correct, wrong, correct_list, wrong_list = check_correct_num(answer) qa_info.aslogrecord = answer qa_info.finished_stamp = stop_stamp qa_info.expend_time = stop_stamp - qa_info.started_stamp qa_info.finished = True qa_info.correct_num = correct if total == qa_info.total_num else 0 qa_info.incorrect_num = wrong if total == qa_info.total_num else qa_info.total_num qa_info.correct_list = correct_list qa_info.wrong_list = wrong_list qa_info.save() if qa_info.correct_num == kind_info.question_num: score = kind_info.total_score elif not qa_info.correct_num: score = 0 else: score = round((kind_info.total_score / kind_info.question_num) * correct, 3) qa_info.score = score qa_info.save() kind_info.total_partin_num += 1 kind_info.save() # 比赛答题次数 bank_info.partin_num += 1 bank_info.save() # 题库答题次数 if (kind_info.period_time > 0) and (qa_info.expend_time > kind_info.period_time * 60 * 1000): # 超时,不加入排行榜 qa_info.status = CompetitionQAInfo.OVERTIME qa_info.save() else: # 正常完成,加入排行榜 add_to_rank(uid, kind_id, qa_info.score, qa_info.expend_time) qa_info.status = CompetitionQAInfo.COMPLETED qa_info.save() return json_response(200, 'OK', { 'qa_id': qa_id, 'user_info': profile.data, 'kind_id': kind_id, })
def test_tomorrow_local_datetime(self): assert isinstance(tc.tomorrow_local_datetime(), datetime.datetime)
def test_offset(self): assert tc.offset() == datetime.timedelta(0, 28800)