def handle(self): if self.is_msg_type('event'): """ lib = WeChatLib(WECHAT_TOKEN, WECHAT_APPID, WECHAT_SECRET) acti_list = lib.get_wechat_menu()[1]['sub_button'] for acti in acti_list: if acti['key'] == self.input['EventKey']: activity_name = acti['name'] break try: activity = Activity.objects.get(name=activity_name) """ activity_id = int(self.input['EventKey'] [len(self.view.event_keys['book_header']):]) try: activity = Activity.objects.get(id=activity_id) except: return self.reply_text('该活动不存在') elif self.is_msg_type('text'): try: activity_name = self.input['Content'].split()[1] except: return self.reply_text('格式错误0_0 抢票请输入"抢票 活动名"') try: activity = Activity.objects.get(name=activity_name) except: return self.reply_text('活动名错误?_? 该活动不存在或有重名活动') if not self.user.student_id: return self.reply_text('你还没绑定学号哟') if len( Ticket.objects.filter(activity=activity, student_id=self.user.student_id)) > 0: return self.reply_text('一个人只能抢一张票哦') currentTime = int(time.time()) if int(time.mktime(activity.book_start.timetuple())) > currentTime: return self.reply_text('抢票尚未开始') elif int(time.mktime(activity.book_end.timetuple())) < currentTime: return self.reply_text('抢票已结束') remainTicketsLock.acquire() if activity.remain_tickets <= 0: remainTicketsLock.release() return self.reply_text('来晚啦T_T 票都被抢光啦') else: activity.remain_tickets -= 1 activity.save() remainTicketsLock.release() ticket = Ticket( student_id=self.user.student_id, unique_id=self.user.student_id + ''.join( random.choice(string.digits + string.ascii_letters) for x in range(32)), activity=activity, status=Ticket.STATUS_VALID, ) ticket.save() return self.reply_text('恭喜^_^抢票成功')
def bookTicket(user, act): ticket = Ticket(student_id=user.student_id, unique_id=str(datetime.now()), status=Ticket.STATUS_VALID, activity_id=act.id) ticket.save() return ticket
def setUp(self): User.objects.get_or_create(open_id=test_user_openid) published_activity.save() ticket_test = Ticket(student_id=test_student_id, unique_id=ticket_unique_id, activity_id=published_activity.id, status=Ticket.STATUS_VALID) ticket_test.save()
def handle(self): if not self.user.student_id: return self.reply_text("请先绑定学号= =!") with transaction.atomic(): activity = self.get_activity_atomic() if activity: if activity.count() == 1: activity = activity[0] if activity.book_start < datetime.utcnow().replace( tzinfo=pytz.timezone('UTC')): if activity.book_end > datetime.utcnow().replace( tzinfo=pytz.timezone('UTC')): my_ticket = Ticket.objects.filter( activity=activity, student_id=self.user.student_id) if not my_ticket.exists(): if activity.remain_tickets != 0: my_ticket = Ticket( unique_id=str(uuid.uuid4()), student_id=self.user.student_id, activity=activity, status=1) my_ticket.save() activity.remain_tickets -= 1 activity.save() else: return self.reply_text( "您没能抢到票,回去再练二十年手速吧!") else: my_ticket = my_ticket[0] return self.reply_single_news({ 'Title': self.get_message( "ticket_title", act_name=my_ticket.activity.name, status=my_ticket.status), 'PicUrl': my_ticket.activity.pic_url, 'Url': self.url_ticket({ "openid": self.user.open_id, "ticket": my_ticket.unique_id }) }) else: return self.reply_text("活动订票已结束") else: return self.reply_text("活动订票尚未开始") else: return self.reply_text("存在重名活动,请利用菜单抢票") else: return self.reply_text("您要找的活动并不存在哦")
def get(self): openID = self.request.GET.get('openid', '') actKey = self.request.GET.get('key', '') userModel = User.objects.all().filter(open_id=openID) if len(userModel) == 0: raise NotExistError('User not exist') userModel = userModel[0] if userModel.student_id == '': raise NotBindError('You should bind student id.') try: with transaction.atomic(): # Transaction # decrease remain ticket count in Activity table actModel = Activity.objects.filter( key=actKey, status=Activity.STATUS_PUBLISHED) if len(actModel) == 0: raise NotAvailableError('Activity not exists') actModel = actModel[0] if (actModel.book_start.timestamp() > timezone.now().timestamp()) or ( actModel.book_end.timestamp() < timezone.now().timestamp()): raise NotAvailableError('Ticketing is not in progress') if actModel.remain_tickets <= 0: raise NotAvailableError('No ticket') actModel.remain_tickets -= 1 actModel.save() # insert new ticket to Activity table ticketID = str(uuid.uuid4()) + openID[-5:] ticketModel = Ticket(student_id=userModel.student_id, unique_id=ticketID, activity=actModel, status=Ticket.STATUS_VALID) ticketModel.save() except IntegrityError: raise TransactionError('Please try again') return 1
def handle(self): # 权限检查 @binding_required user = User.objects.get(open_id=self.input['FromUserName']) if (user.system_user is None) or (not user.system_user.is_active): return self.reply_text("请先绑定清华邮箱。回复“绑定”以开始。") # 取输入字段 email = user.system_user.email eventKey = self.input['EventKey'] actId = int( eventKey[17:]) # 17 == len(self.view.event_keys['book_header']) timestamp = self.input['CreateTime'] # 已抢到票数量检查 n = Ticket.objects.filter(status=Ticket.STATUS_VALID, email=email, activity=actId).count() if n >= 1: return self.reply_text("一人只能抢一张,不要太贪心哟!") # 减库存 with transaction.atomic(): activity = Activity.objects.only( "remain_tickets").select_for_update().get(id=actId) remainTickets = activity.remain_tickets if remainTickets > 0: activity.remain_tickets = remainTickets - 1 activity.save() if remainTickets <= 0: return self.reply_text("没票了,你来晚啦 :(") # 生成票 ticket = Ticket(email=email, activity=activity, status=Ticket.STATUS_VALID, unique_id=slugify("-".join( [str(actId), email, timestamp])) #TODO: salted hashing ) ticket.save() return self.reply_text("抢票成功!")
def setUp(self): User.objects.create(open_id="123456789", student_id="2016010649") new_activity = Activity( name='玩玩', key='玩 ', description='桌游', start_time=datetime.datetime.fromtimestamp(1539844241), end_time=datetime.datetime.fromtimestamp(1539844945), place='THU ', book_start=datetime.datetime.fromtimestamp(1539844345), book_end=datetime.datetime.fromtimestamp(1539844545), total_tickets=11, pic_url='www.baidu.com', remain_tickets=10, status=1, ) new_activity.save() new_ticket = Ticket( student_id='2016010649', unique_id='789456123', activity=new_activity, status=1, ) new_ticket.save()
def handle(self): if self.is_msg_type('text'): # 通过抢票命令进入 search = self.input['Content'].split() if len(search) == 1: return self.reply_text('找不到此活动Orz') else: search = search[1] # 在name字段匹配 if search is not None: activity_1 = Activity.get_all_activities() if activity_1: activity_1 = activity_1.filter(name=search) if activity_1 and len(activity_1) > 0: activity_1 = activity_1[0] else: activity_1 = None # 在key字段匹配 if search is not None: activity_2 = Activity.get_all_activities() if activity_2: activity_2 = activity_2.filter(name=search) if activity_2 and len(activity_2) > 0: activity_2 = activity_2[0] else: activity_2 = None if activity_1: activity = activity_1 elif activity_2: activity = activity_2 else: # STATUS_NO_ACTIVITY return self.reply_text('找不到此活动Orz') elif self.is_msg_type('event'): activity_id = int(self.input['EventKey'].replace( self.view.event_keys['book_header'], '')) try: activity = Activity.get_by_id(activity_id) except LogicError: # STATUS_NO_ACTIVITY return self.reply_text('找不到此活动Orz') if not activity: # STATUS_NO_ACTIVITY return self.reply_text('找不到此活动Orz') # 此时activity必定存在 my_ticket = Ticket.get_by_activity_and_student_number( activity.id, self.user.student_id) temp = [] for tic in my_ticket: temp.append(tic) my_ticket = temp while len( my_ticket) > 0 and my_ticket[0].status != Ticket.STATUS_VALID: my_ticket.pop(0) if len(my_ticket) == 0: if activity.remain_tickets > 0: activity.remain_tickets = activity.remain_tickets - 1 activity.save() unique = '%s%s' % (str(int(round( time.time() * 1000))), str(uuid.uuid1())) ticket = Ticket(student_id=self.user.student_id, unique_id=unique, status=Ticket.STATUS_VALID, activity=activity) ticket.save() # STATUS_NO_VALID return self.reply_single_news({ 'Title': '[' + activity.name + '] 抢票成功!', 'Description': '活动名称:' + activity.name + '\n活动代称:' + activity.key + '\n请于活动开始时前往现场使用,您可以通过 [查票] 菜单查询电子票、或发送 [取票/退票 活动名称或代称] 查询或退票(・◇・)', 'Url': self.url_ticket_detail(ticket.unique_id), }) else: return self.reply_text('此活动的电子票已经全部发出,没有抢到QwQ') else: my_ticket = my_ticket[0] # STATUS_HAS_GOT return self.reply_single_news({ 'Title': '[' + activity.name + '] 电子票', 'Description': '活动名称:' + activity.name + '\n活动代称:' + activity.key, 'Url': self.url_ticket_detail(my_ticket.unique_id), })
def status(self): if self.is_msg_type('text'): # 通过抢票命令进入 search = self.input['Content'].split() if len(search) == 1: return self.reply_text('找不到此活动Orz') else: search = search[1] # 在name字段匹配 if search is not None: activity_1 = Activity.get_all_activities() if activity_1: activity_1 = activity_1.filter(name=search) if activity_1 and len(activity_1) > 0: activity_1 = activity_1[0] else: activity_1 = None # 在key字段匹配 if search is not None: activity_2 = Activity.get_all_activities() if activity_2: activity_2 = activity_2.filter(name=search) if activity_2 and len(activity_2) > 0: activity_2 = activity_2[0] else: activity_2 = None if activity_1: activity = activity_1 elif activity_2: activity = activity_2 else: return self.STATUS_NO_ACTIVITY elif self.is_msg_type('event'): activity_id = int(self.input['EventKey'].replace( self.view.event_keys['book_header'], '')) try: activity = Activity.get_by_id(activity_id) except LogicError: return self.STATUS_NO_ACTIVITY if not activity: return self.STATUS_NO_ACTIVITY # 此时activity必定存在 my_ticket = Ticket.get_by_activity_and_student_number( activity.id, self.user.student_id) temp = [] for tic in my_ticket: temp.append(tic) my_ticket = temp while len( my_ticket) > 0 and my_ticket[0].status != Ticket.STATUS_VALID: my_ticket.pop(0) if len(my_ticket) == 0: if activity.remain_tickets > 0: activity.remain_tickets = activity.remain_tickets - 1 activity.save() unique = '%s%s' % (str(int(round( time.time() * 1000))), str(uuid.uuid1())) ticket = Ticket(student_id=self.user.student_id, unique_id=unique, status=Ticket.STATUS_VALID, activity=activity) ticket.save() return self.STATUS_VALID else: return self.STATUS_NO_TICKET else: return self.STATUS_HAS_GOT
def handle(self): try: input_event = self.input['EventKey'].split('_') except: content = self.input['Content'].split()[1] try: act = Activity.objects.get(name=content) except: try: act = Activity.objects.get(key=content) except: return self.reply_text( self.get_message('book_fail_command')) else: act_id = int(input_event[2]) try: act = Activity.objects.get(id=act_id) except: return self.reply_text(self.get_message('book_fail_command')) openid = self.input['FromUserName'] studentid = User.objects.get(open_id=openid).student_id if studentid == '': return self.reply_text( self.get_message('book_fail_validate', activity_name=act.name)) bookstart = self.datetimeToStamp(act.book_start) bookend = self.datetimeToStamp(act.book_end) current = int(time.mktime(timezone.now().timetuple())) # 判断有无票 try: Ticket.objects.get(student_id=studentid, activity_id=act.id) except: # 判断活动时间 try: if current < bookstart or current > bookend: raise Exception('not booking time') except: return self.reply_text( self.get_message('book_fail_time', activity_name=act.name, book_start=act.book_start, book_end=act.book_end)) try: remain = act.remain_tickets if remain <= 0: raise Exception('no more tickets left') except: return self.reply_text( self.get_message('book_fail_no_remain', activity_name=act.name)) # 创建票 else: uniqueid = self.createUniqueId() print(uniqueid) sta = Ticket.STATUS_VALID ticket = Ticket(student_id=studentid, unique_id=uniqueid, activity_id=act.id, status=sta) ticket.save() act.remain_tickets -= 1 act.save() return self.reply_text( self.get_message('book_success', activity_name=act.name, unique_id=uniqueid)) else: ticket = Ticket.objects.get(student_id=studentid, activity_id=act.id) # 票取消过 if ticket.status == Ticket.STATUS_VALID: return self.reply_text( self.get_message('book_fail_exist', activity_name=act.name)) elif ticket.status == Ticket.STATUS_CANCELLED: ticket.status = Ticket.STATUS_VALID return self.reply_text( self.get_message('book_success', activity_name=act.name, unique_id=ticket.unique_id))
def setUp(self): User.objects.create_superuser(adminForTest['username'], adminForTest['email'], adminForTest['password']) User.objects.create_user(userForTest['username'], userForTest['email'], userForTest['password']) current_time = timezone.now() delta_1 = timezone.timedelta(hours=1) delta_2 = timezone.timedelta(days=1) valid_activity = Activity(id=self.ValidID, name='published', key='key', place='place', description='description', start_time=current_time - delta_1, pic_url="pic_url", end_time=current_time + delta_1, book_start=timezone.now(), book_end=timezone.now(), total_tickets=100, status=Activity.STATUS_PUBLISHED, remain_tickets=100) ended_activity = Activity(id=self.EndedID, name='published', key='key', place='place', description='description', start_time=current_time - delta_2, pic_url="pic_url", end_time=current_time - delta_1, book_start=timezone.now(), book_end=timezone.now(), total_tickets=100, status=Activity.STATUS_PUBLISHED, remain_tickets=100) wrong_activity = Activity( id=self.WrongID, name='published', key='key', place='place', description='description', start_time=timezone.make_aware(datetime(2018, 10, 15, 18, 0, 0, 0)), pic_url="pic_url", end_time=timezone.make_aware(datetime(2018, 10, 15, 23, 0, 0, 0)), book_start=timezone.now(), book_end=timezone.now(), total_tickets=100, status=Activity.STATUS_PUBLISHED, remain_tickets=100) valid_ticket = Ticket(student_id='valid_student_id', unique_id='valid_unique_id', activity_id=valid_activity.id, status=Ticket.STATUS_VALID) used_ticket = Ticket(student_id='used_student_id', unique_id='used_unique_id', activity_id=valid_activity.id, status=Ticket.STATUS_USED) canceled_ticket = Ticket(student_id='canceled_student_id', unique_id='canceled_unique_id', activity_id=valid_activity.id, status=Ticket.STATUS_CANCELLED) ended_ticket = Ticket(student_id='ended_student_id', unique_id='ended_unique_id', activity_id=ended_activity.id, status=Ticket.STATUS_VALID) valid_activity.save() ended_activity.save() wrong_activity.save() valid_ticket.save() used_ticket.save() canceled_ticket.save() ended_ticket.save()
def setUp(self): User.objects.create_superuser(adminForTest['username'], adminForTest['email'], adminForTest['password']) User.objects.create_user(userForTest['username'], userForTest['email'], userForTest['password']) deleted_activity.save() saved_activity.save() published_activity.save() n = 10 for i in range(n): ticket = Ticket(student_id='Valid_' + str(i), unique_id='Valid_' + str(i), activity_id=published_activity.id, status=Ticket.STATUS_VALID) ticket.save() for i in range(n): ticket = Ticket(student_id='Used_' + str(i), unique_id='Used_' + str(i), activity_id=published_activity.id, status=Ticket.STATUS_USED) ticket.save() for i in range(n): ticket = Ticket(student_id='Canceled_' + str(i), unique_id='Canceled_' + str(i), activity_id=published_activity.id, status=Ticket.STATUS_CANCELLED) ticket.save() published_activity.remain_tickets -= 3 * n published_activity.save() current_time = timezone.now() delta_1 = timezone.timedelta(hours=1) delta_2 = timezone.timedelta(hours=2) delta_3 = timezone.timedelta(days=1) book_started_act = Activity(id=4, name='book_start', key='key', place='place', description='description', start_time=current_time + delta_3, pic_url="pic_url", end_time=current_time + delta_1 + delta_3, book_start=current_time - delta_1, book_end=current_time + delta_1, total_tickets=100, status=Activity.STATUS_PUBLISHED, remain_tickets=100) book_started_act.save() started_act = Activity(id=5, name='started', key='key', place='place', description='description', start_time=current_time - delta_1, pic_url="pic_url", end_time=current_time + delta_1, book_start=current_time - delta_3 - delta_1, book_end=current_time - delta_3, total_tickets=100, status=Activity.STATUS_PUBLISHED, remain_tickets=100) started_act.save() ended_act = Activity(id=6, name='ended', key='key', place='place', description='description', start_time=current_time - delta_2, pic_url="pic_url", end_time=current_time - delta_1, book_start=current_time - delta_3 - delta_1, book_end=current_time - delta_3, total_tickets=100, status=Activity.STATUS_PUBLISHED, remain_tickets=100) ended_act.save()
def handle(self): if not self.user.student_id: return self.reply_text('需要绑定学号') acts = Activity.objects.all() for act in acts: if self.is_text('抢票 ' + act.key) or self.is_event_click( self.view.event_keys['book_header'] + str(act.id)): break if not Ticket.objects.filter(activity_id=act.id, student_id=self.user.student_id): if act.remain_tickets <= 0: return self.reply_text('没有剩余的票') if act.book_start.timestamp() > datetime.datetime.now().timestamp( ): return self.reply_text('还没到抢票开始时间') tic = Ticket() tic.student_id = self.user.student_id tic.unique_id = uuid.uuid1() tic.activity_id = act.id tic.status = Ticket.STATUS_VALID tic.save() act.remain_tickets -= 1 act.save() return self.reply_single_news({ 'Title': '抢票成功!!', 'PicUrl': act.pic_url, 'Description': '活动名称 : ' + str(act.name) + '\nstudent_id = ' + str(tic.student_id) + '\nunique_id = ' + str(tic.unique_id) + '\nactivity_name = ' + str(Activity.objects.get(id=act.id).name) + '\nstatus = ' + str(tic.status) + '\nremain_tickets = ' + str(Activity.objects.get(id=act.id).remain_tickets), 'Url': get_url('u/ticket', { 'openid': self.user.open_id, 'ticket': tic.unique_id }), }) elif Ticket.objects.get(activity_id=act.id, student_id=self.user.student_id ).status == Ticket.STATUS_CANCELLED: tic = Ticket.objects.get(activity_id=act.id, student_id=self.user.student_id) tic.status = Ticket.STATUS_VALID tic.save() act.remain_tickets -= 1 act.save() return self.reply_single_news({ 'Title': '抢票成功!!', 'PicUrl': act.pic_url, 'Description': '活动名称 : ' + str(act.name) + '\nstudent_id = ' + str(tic.student_id) + '\nunique_id = ' + str(tic.unique_id) + '\nactivity_name = ' + str(Activity.objects.get(id=act.id).name) + '\nstatus = ' + str(tic.status) + '\nremain_tickets = ' + str(Activity.objects.get(id=act.id).remain_tickets), 'Url': get_url('u/ticket', { 'openid': self.user.open_id, 'ticket': tic.unique_id }), }) else: tic = Ticket.objects.get(activity_id=act.id, student_id=self.user.student_id) return self.reply_single_news({ 'Title': '已经抢过!', 'PicUrl': act.pic_url, 'Description': '点击(详细)就能看到电子票信息', 'Url': get_url('u/ticket', { 'openid': self.user.open_id, 'ticket': tic.unique_id }), })