def post(self): if not self.request.user.is_authenticated(): raise ValidateError('You need to login first.') try: if 'ticket' in self.input: ticket = Ticket.get_by_id(self.input['ticket']) res = { 'ticket': ticket.unique_id, 'studentId': ticket.student_id } return res elif 'studentId' in self.input: tickets = Ticket.get_by_studentId(self.input['studentId']) input_id = self.input['actId'] for ticket in tickets: if str(ticket.activity.id) == input_id: res = { 'ticket': ticket.unique_id, 'studentId': ticket.student_id } return res raise MySQLError('Find ticket failed!') else: raise ValidateError( 'You need to input your ticketId or studentId.') except Exception as e: raise LogicError('Check ticket failed!')
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 test_user_has_deleted_activity_ticket(self): user_open_id = '921E1460FD86481C9087C7E2A9B7C6322967F79BDFC34ED2873EFC8106EDC38A' user_student_id = '2016012345' Ticket.create_ticket(student_id=user_student_id, activity=self.activity_map['7e']) Ticket.create_ticket( # others' ticket student_id='2018000000', activity=self.activity_map['7e']) Ticket.create_ticket(student_id=user_student_id, activity=self.activity_map['8d']) Ticket.create_ticket(student_id=user_student_id, activity=self.activity_map['21']) resp = self.wechat_server.send_click( CustomWeChatView.event_keys['get_ticket'], user_open_id) news = self.wechat_server.get_news(resp) self.assertEqual( len(news), 1, 'deleted or saved activities\' tickets would not be included') self.assertEqual( news[0]['Title'], get_template('messages/ticket_title.html').render( {'activity': self.activity_map['7e']})) # restore Ticket.objects.all().delete()
def get(self): self.check_input('openid', 'ticket') user = User.get_by_openid(self.input['openid']) student_id = user.student_id detail = Ticket.get_a_ticket(student_id, self.input['ticket']) detail['currentTime'] = int(datetime.datetime.now().timestamp()) return detail
def get(self): self.check_input('openid', 'ticket') got_ticket = Ticket.get_student_ticket(self.input['openid'], self.input['ticket']) got_activity = Activity.get_by_id(got_ticket.activity_id) return prepare_data_reply( ['name', 'place', 'key', 'uniqueId', 'startTime', 'endTime', 'status'], got_ticket, got_activity, name='activityName', key='activityKey' )
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 get(self): """ input: self.input['id'] -------- 活动id 返回活动的详情数据 需要登录 """ self.check_input('id') if not self.request.user.is_authenticated(): raise ValidateError("admin-user not login!") else: activity = Activity.get_by_id(self.input['id']) return { 'name': activity.name, 'key': activity.key, 'description': activity.description, 'startTime': time.mktime( time.strptime( activity.start_time.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S')), 'endTime': time.mktime( time.strptime( activity.end_time.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S')), 'place': activity.place, 'bookStart': time.mktime( time.strptime( activity.book_start.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S')), 'bookEnd': time.mktime( time.strptime( activity.book_end.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S')), 'totalTickets': activity.total_tickets, 'picUrl': activity.pic_url, 'bookedTickets': activity.total_tickets - activity.remain_tickets, 'usedTickets': Ticket.count_used_tickets(activity.id), 'currentTime': int(time.time()), # 当前时间的秒级时间戳 'status': activity.status, }
def post(self): """ input: self.input['actId'] -------- 活动ID self.input['ticket'] -------- 电子票ID self.input['studentId'] -------- 学号 检票 需要登录 """ if not self.request.user.is_authenticated(): raise ValidateError("admin-user not login!") else: self.check_input('actId') result = None valid_ticket = None if 'ticket' not in self.input: self.check_input('studentId') result = Ticket.get_by_activity_and_student_number( self.input['actId'], self.input['studentId']) if len(result) > 0: for tic in result: if tic.status == Ticket.STATUS_VALID: valid_ticket = tic if not valid_ticket: raise LogicError("The user don't have valid ticket!") elif 'studentId' not in self.input: self.check_input('ticket') result = Ticket.get_by_unique_id(self.input['ticket']) if result.status == Ticket.STATUS_VALID: valid_ticket = result else: raise LogicError("The ticket is not valid!") if valid_ticket: valid_ticket.status = Ticket.STATUS_USED valid_ticket.save() return { 'ticket': valid_ticket.unique_id, 'studentId': valid_ticket.student_id, } else: return LogicError('Ticket not found')
def get(self): self.check_input('openid', 'ticket') ticket = Ticket.get_by_uniqueid(self.input['ticket']) ticket_detail = { 'activityName': ticket.activity.name, 'place': ticket.activity.place, 'activityKey': ticket.activity.key, 'uniqueId': ticket.unique_id, 'startTime': int(time.mktime(ticket.activity.start_time.timetuple())), 'endTime': int(time.mktime(ticket.activity.end_time.timetuple())), 'currentTime': int(time.time()), 'status': ticket.status } return ticket_detail
def handle(self): try: activity = self.get_activity() if activity.status != Activity.STATUS_PUBLISHED: raise LogicError('activity not published') except LogicError: return self.reply_text(self.get_message('activity_not_found')) if self.user.student_id == '': # not bind yet return self.reply_text(self.get_message('id_not_bind')) old_ticket = Ticket.objects.filter(student_id=self.user.student_id, activity=activity, status=Ticket.STATUS_VALID).first() if old_ticket is not None: # in fact, it is not snap up ticket, it is withdraw ticket return self.reply_single_news({ 'Title': self.get_message('withdraw_ticket_title'), 'Description': self.get_message('withdraw_ticket_detail', activity=activity), 'Url': self.url_ticket_detail(old_ticket), 'PicUrl': activity.pic_url, }) if self.get_current_time() < activity.book_start.timestamp( ): # not start yet return self.reply_text(self.get_message('book_not_start')) if self.get_current_time() > activity.book_end.timestamp( ): # end already return self.reply_text(self.get_message('book_end_already')) result = Activity.decrease_ticket_exclusive(activity.id) if not result: return self.reply_text(self.get_message('sold_out')) ticket = Ticket.create_ticket(student_id=self.user.student_id, activity=activity) return self.reply_single_news({ 'Title': self.get_message('book_ticket_success_title'), 'Description': self.get_message('book_ticket_success_detail', activity=activity), 'Url': self.url_ticket_detail(ticket), 'PicUrl': activity.pic_url, })
def test_checkin_fail(self): a = Activity.objects.filter(name='1').first() t = [] for i in range(6): t.append( Ticket(id=i + 1, student_id=str(i), unique_id=str(i + 1), status=Ticket.STATUS_VALID, activity_id=a.id)) t[i].save() resp = c.post('/api/a/activity/checkin/', {'actId': 0, 'studentId': 1}) mess = json.loads(str(resp.content, encoding="utf-8")) self.assertEqual((mess['code']), 4) self.assertEqual(mess['msg'], '')
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): content = self.input['Content'].split() if len(content) == 1: return self.reply_text('退票失败,找不到需要退票的活动_(:з」∠)_') else: content = content[1] if content is not None: # 在name字段匹配 activity_1 = Activity.get_all_activities() if activity_1: activity_1 = activity_1.filter(name=content) if activity_1 and len(activity_1) > 0: activity_1 = activity_1[0] else: activity_1 = None # 在key字段匹配 activity_2 = Activity.get_all_activities() if activity_2: activity_2 = activity_2.filter(name=content) 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.reply_text('退票失败,找不到需要退票的活动_(:з」∠)_') my_ticket = Ticket.get_by_activity_and_student_number( activity.id, self.user.student_id) valid_ticket = None for tic in my_ticket: if tic.status == Ticket.STATUS_VALID: valid_ticket = tic if not my_ticket: return self.reply_text('退票失败,您没有此次活动的电子票!|・ω・`)') if not valid_ticket: return self.reply_text('退票失败,您没有此次活动的合法电子票!|・ω・`)') else: valid_ticket.status = Ticket.STATUS_CANCELLED valid_ticket.save() activity.remain_tickets = activity.remain_tickets + 1 activity.save() return self.reply_text('活动 [' + activity.name + '] 退票成功!')
def status(self): content = self.input['Content'].split() if len(content) == 1: return self.STATUS_NOT_FIND else: content = content[1] if content is not None: # 在name字段匹配 activity_1 = Activity.get_all_activities() if activity_1: activity_1 = activity_1.filter(name=content) if activity_1 and len(activity_1) > 0: activity_1 = activity_1[0] else: activity_1 = None # 在key字段匹配 activity_2 = Activity.get_all_activities() if activity_2: activity_2 = activity_2.filter(name=content) 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 my_ticket = Ticket.get_by_activity_and_student_number( activity.id, self.user.student_id) valid_ticket = None for tic in my_ticket: if tic.status == Ticket.STATUS_VALID: valid_ticket = tic if not my_ticket: return self.STATUS_NO_TICKET if not valid_ticket: return self.STATUS_NOT_LEGAL else: valid_ticket.status = Ticket.STATUS_CANCELLED valid_ticket.save() activity.remain_tickets = activity.remain_tickets + 1 activity.save() return self.STATUS_VALID
def get(self): """ input: self.input['openid'] -------- 微信用户OpenID self.input['ticket'] -------- 电子票unique_id """ self.check_input('openid', 'ticket') ticket = Ticket.get_by_unique_id(self.input['ticket']) activity = Activity.get_by_id(ticket.activity_id) return { 'activityName': activity.name, 'place': activity.place, 'activityKey': activity.key, 'uniqueId': ticket.unique_id, 'startTime': time.mktime(time.strptime(activity.start_time.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S')), 'endTime': time.mktime(time.strptime(activity.end_time.strftime('%Y-%m-%d %H:%M:%S'), '%Y-%m-%d %H:%M:%S')), 'currentTime': int(time.time()), # 当前时间的秒级时间戳 'status': ticket.status, }
def test_checkin_fail_ticketUsed(self): a = Activity.objects.filter(name='1').first() t = [] for i in range(6): t.append( Ticket(id=i + 1, student_id=str(i), unique_id=str(i + 1), status=Ticket.STATUS_USED, activity_id=a.id)) t[i].save() models.User.objects.create_user(username='******', email="*****@*****.**", password='******') c.login(username='******', password='******') resp = c.post('/api/a/activity/checkin/', {'actId': 0, 'studentId': 1}) mess = json.loads(str(resp.content, encoding="utf-8")) self.assertEqual((mess['code']), 2) self.assertEqual(mess['msg'], '检票失败')
def handle(self): if not self.user.student_id: return self.reply_text(self.get_message('bind_account')) tickets = [] this_user = self.user ticket_list = Ticket.get_by_studentId(student_id=this_user.student_id) if len(ticket_list) == 0: return self.reply_text('您还没有订票!') for ticket in ticket_list: tickets.append({ 'Url': settings.get_url('/u/ticket', { 'openid': this_user.open_id, 'ticket': ticket.unique_id }), 'Title': '%s' % ticket.activity.name, 'Description': ticket.activity.description, 'PicUrl': ticket.activity.pic_url }) return self.reply_news(articles=tickets)
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']) 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 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 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: return self.reply_text('找不到此活动Orz') # 此时activity必定存在 my_ticket = Ticket.get_by_activity_and_student_number( activity.id, self.user.student_id) if len(my_ticket) == 0: return self.reply_text('您还没有此活动的票!Ծ‸Ծ') valid_ticket = None for tic in my_ticket: if tic.status == Ticket.STATUS_VALID: valid_ticket = tic if not valid_ticket: return self.reply_text('您还没有此活动的合法票!Ծ‸Ծ') return self.reply_single_news({ 'Title': '[' + activity.name + '] 电子票', 'Description': '活动名称:' + activity.name + '\n活动代称:' + activity.key, 'Url': self.url_ticket_detail(valid_ticket.unique_id), }) elif self.is_msg_type('event'): # 通过取票按钮进入 ticket_list = Ticket.get_user_tickets(self.user.student_id) ticket_list = ticket_list.order_by('-activity__start_time') if len(ticket_list) == 0: return self.reply_text('您尚未持有任何票0.0') if len(ticket_list) > 8: ticket_list = ticket_list[:7] result = [] for tic in ticket_list: act = tic.activity result.append({ 'Title': '[' + act.name + '] 电子票', 'Url': self.url_ticket_detail(tic.unique_id) }) return self.reply_news(result) return
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): 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 }), })