def get(self): if not self.request.user.is_authenticated(): raise ValidateError('You need to login first.') self.check_input('id') try: activity = Activity.get_by_id(self.input['id']) if activity.status == Activity.STATUS_DELETED: raise ValidateError('The activity has been deleted.') item = {} item['name'] = activity.name item['key'] = activity.key item['description'] = activity.description item['startTime'] = int(activity.start_time.timestamp()) item['endTime'] = int(activity.end_time.timestamp()) item['place'] = activity.place item['bookStart'] = int(activity.book_start.timestamp()) item['bookEnd'] = int(activity.book_end.timestamp()) item['totalTickets'] = activity.total_tickets if activity.status == Activity.STATUS_PUBLISHED: item['status'] = 1 else: item['status'] = 0 item['picUrl'] = activity.pic_url item['currentTime'] = int(datetime.datetime.now().timestamp()) item[ 'bookedTickets'] = activity.total_tickets - activity.remain_tickets item['usedTickets'] = Ticket.objects.filter( activity_id=activity.id, status=Ticket.STATUS_USED).count() return item except Exception as e: raise MySQLError('Query activity detail failed!')
def post(self): if not self.request.user.is_authenticated(): raise ValidateError('You need to login first.') # self.check_input('id', 'name', 'place', 'description', 'picUrl', # 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status') try: activity = Activity.get_by_id(self.input['id']) if activity.status == Activity.STATUS_SAVED: activity.name = self.input['name'] activity.place = self.input['place'] activity.description = self.input['description'] activity.pic_url = self.input['picUrl'] current_time = datetime.datetime.now().timestamp() # 这一段的顺序比较重要,牵涉到数据库date对象和str对象的转换 if current_time < activity.start_time.timestamp(): activity.book_end = self.input['bookEnd'] if current_time < activity.end_time.timestamp(): activity.start_time = self.input['startTime'] activity.end_time = self.input['endTime'] if current_time < activity.book_start.timestamp(): activity.total_tickets = self.input['totalTickets'] if activity.status is not Activity.STATUS_SAVED: activity.book_start = self.input['bookStart'] if activity.status is not Activity.STATUS_PUBLISHED: activity.status = self.input['status'] activity.save() except Exception as e: raise MySQLError('Change activity detail failed!')
def get(self): self.check_input('id') if not self.request.user.is_authenticated(): raise ValidateError('User has not logged in.') activity = Activity.get_by_id(self.input['id']) usedTickets = 0 for ticket in activity.ticket_set.all(): if ticket.status == Ticket.STATUS_USED: usedTickets += 1 data = { 'name': activity.name, 'key': activity.key, 'description': activity.description, 'startTime': int(time.mktime(activity.start_time.timetuple())), 'endTime': int(time.mktime(activity.end_time.timetuple())), 'place': activity.place, 'bookStart': int(time.mktime(activity.book_start.timetuple())), 'bookEnd': int(time.mktime(activity.book_end.timetuple())), 'totalTickets': activity.total_tickets, 'picUrl': activity.pic_url, 'bookedTickets': activity.total_tickets - activity.remain_tickets, 'usedTickets': usedTickets, 'currentTime': int(time.time()), 'status': activity.status } return data
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): self.check_input('id') got_activity = Activity.get_by_id(self.input['id']) return prepare_data_reply( ['name', 'key', 'description', 'startTime', 'endTime', 'place', 'bookStart', 'bookEnd', 'totalTickets', 'picUrl', 'remainTickets'], got_activity )
def post(self): if not self.request.user.is_authenticated(): raise ValidateError('User has not logged in.') activityList = [] for activity_id in self.input: activity = Activity.get_by_id(activity_id) activity.status = Activity.STATUS_PUBLISHED activity.save() activityList.append(activity) CustomWeChatView.update_menu(activityList)
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['id'] -------- 活动id 删除此id对应的活动 需要登录(没写,但我觉得应该要吧...不然直接打这个url进来不就渗透了吗...) """ 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']) activity.delete() return
def post(self): """ input: 活动id数组 需要登录 """ if not self.request.user.is_authenticated(): raise ValidateError("admin-user not login!") else: result = [] activity_id_list = self.input for act_id in activity_id_list: act = Activity.get_by_id(act_id) result.append(act) CustomWeChatView.update_menu(result) return
def get(self): self.check_input('openid', 'ticket') try: opn_id = self.input['openid'] unq_id = self.input['ticket'] ticket_detail = {} if not isinstance(unq_id, str): raise InputError('wrong input type') try: ticket = Ticket.objects.get(unique_id=unq_id) activity = Activity.get_by_id(ticket.activity_id) std_id = User.objects.get(open_id=opn_id).student_id # if self.input['openid']=='': # print('why this works ', User.objects.get(open_id=opn_id)) # if ticket.student_id == std_id: # ticket_detail['activityName'] = ticket.activity.name # ticket_detail['place'] = ticket.activity.place # ticket_detail['activityKey'] = ticket.activity.key # ticket_detail['uniqueId'] =ticket.unique_id # ticket_detail['startTime'] = int(ticket.activity.start_time.timestamp()) # ticket_detail['endTime'] = int(ticket.activity.end_time.timestamp()) # ticket_detail['currentTime'] = int(timezone.now().timestamp()) # ticket_detail['status'] = ticket.status # return ticket_detail # else: # raise BaseError(code=4, msg='not match') if ticket.student_id == std_id: ticket_detail['activityName'] = activity.name ticket_detail['place'] = activity.place ticket_detail['activityKey'] = activity.key ticket_detail['uniqueId'] = ticket.unique_id ticket_detail['startTime'] = int( activity.start_time.timestamp()) ticket_detail['endTime'] = int( activity.end_time.timestamp()) ticket_detail['currentTime'] = int( timezone.now().timestamp()) ticket_detail['status'] = ticket.status return ticket_detail else: raise BaseError(code=4, msg='not match') except: raise ValidateError('not valid ticket') except: raise InputError('input message error')
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 get(self): self.check_input('id') activity = Activity.get_by_id(self.input['id']) if activity.status != Activity.STATUS_PUBLISHED: raise LogicError("Activity hasn't been published") activity_detail = { 'name': activity.name, 'key': activity.key, 'description': activity.description, 'startTime': int(time.mktime(activity.start_time.timetuple())), 'endTime': int(time.mktime(activity.end_time.timetuple())), 'place': activity.place, 'bookStart': int(time.mktime(activity.book_start.timetuple())), 'bookEnd': int(time.mktime(activity.book_end.timetuple())), 'totalTickets': activity.total_tickets, 'picUrl': activity.pic_url, 'remainTickets': activity.remain_tickets, 'currentTime': int(time.time()) } return activity_detail
def get(self): self.check_input('id') item = Activity.get_by_id(self.input['id']) if item.status is not Activity.STATUS_PUBLISHED: raise ValidateError('This activity is not published yet.') else: # del item.status res_item = {} res_item['name'] = item.name res_item['key'] = item.key res_item['description'] = item.description res_item['startTime'] = int(item.start_time.timestamp()) res_item['endTime'] = int(item.end_time.timestamp()) res_item['place'] = item.place res_item['bookStart'] = int(item.book_start.timestamp()) res_item['bookEnd'] = int(item.book_end.timestamp()) res_item['totalTickets'] = item.total_tickets res_item['picUrl'] = item.pic_url res_item['remainTickets'] = item.remain_tickets res_item['currentTime'] = int(datetime.datetime.now().timestamp()) return res_item
def get(self): """ input: self.input['id'] -------- 活动id """ self.check_input('id') activity = Activity.get_by_id(self.input['id']) if activity.status != 1: raise LogicError("The activity isn't normally published!") else: 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, 'remainTickets': activity.remain_tickets, 'currentTime': (int(time.time())), # 当前时间的秒级时间戳 }
def testSuccess(self): c = Client() curTime = int(timezone.now().timestamp()) response = c.get(self.url, { 'openid': 'ycdfwzy', 'ticket': '123' }) js = response.json()['data'] objT = Ticket.objects.get(unique_id = '123') # objA = objT.activity print("objT: ", objT.activity_id, type(objT.activity_id)) objA = Activity.get_by_id(objT.activity_id) #print(type(js)) print('right json', response.json()['msg']) self.assertEqual(js['activityName'], objA.name) self.assertEqual(js['place'], objA.place) self.assertEqual(js['activityKey'], objA.key) self.assertEqual(js['uniqueId'], objT.unique_id) self.assertEqual(js['startTime'], int(objA.start_time.timestamp())) self.assertEqual(js['endTime'], int(objA.end_time.timestamp())) self.assertEqual(js['status'], objT.status) self.assertAlmostEqual(js['currentTime'], curTime, delta = 5)
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 post(self): self.check_input('id') activity = Activity.get_by_id(self.input['id']) activity.delete()
def post(self): self.check_input('id', 'name', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status') if not self.request.user.is_authenticated(): raise ValidateError('User has not logged in.') activity = Activity.get_by_id(self.input['id']) if activity.status == Activity.STATUS_PUBLISHED: if activity.name != self.input['name']: raise LogicError( 'Cannot modify the name of a published activity ') if activity.place != self.input['place']: raise LogicError( 'Cannot modify the place of a published activity') if activity.book_start != (datetime.strptime( self.input['bookStart'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)): raise LogicError( 'Cannot modify the bookStart time of a published activity') if self.input['status'] != 1: raise LogicError('you cannot stage published activity') if int(time.mktime(activity.end_time.timetuple())) < int(time.time()): if activity.start_time != (datetime.strptime( self.input['startTime'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)): raise LogicError('Cannot modify startTime of a activity ended') if activity.end_time != (datetime.strptime( self.input['endTime'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)): raise LogicError('Cannot modify endTime of a activity ended') if int(time.mktime(activity.start_time.timetuple())) < int( time.time()): if activity.book_end != (datetime.strptime( self.input['bookEnd'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)): raise LogicError( 'Cannot modify bookEnd time of a activity started') if int(time.mktime(activity.book_start.timetuple())) < int( time.time()): if activity.total_tickets != self.input['totalTickets']: raise LogicError('Cannot modify totalTickets after book_start') activity.name = self.input['name'] activity.place = self.input['place'] activity.description = self.input['description'] activity.pic_url = self.input['picUrl'] activity.start_time = (datetime.strptime(self.input['startTime'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)) activity.end_time = ( datetime.strptime(self.input['endTime'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)) activity.book_start = (datetime.strptime(self.input['bookStart'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)) activity.book_end = ( datetime.strptime(self.input['bookEnd'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8)) activity.total_tickets = self.input['totalTickets'] activity.status = self.input['status'] activity.save()
def post(self): """ input: self.input['id'] -------- 活动id self.input['name'] -------- 活动名称 self.input['place'] -------- 活动地点 self.input['description'] -------- 活动描述 self.input['picUrl'] -------- 活动配图url self.input['startTime'] -------- 活动开始时间 self.input['endTime'] -------- 活动结束时间 self.input['bookStart'] -------- 抢票开始时间 self.input['bookEnd'] -------- 抢票结束时间 self.input['totalTickets'] -------- 总票数 self.input['status'] -------- 暂存或发布 修改活动详情 需要登录 """ self.check_input('id', 'name', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart',\ 'bookEnd', 'totalTickets', 'status') if not self.request.user.is_authenticated(): raise ValidateError("admin-user not login!") else: temp = self.input['startTime'] activity = Activity.get_by_id(self.input['id']) if activity.name != self.input['name']: # 活动名称需要修改 if activity.status == activity.STATUS_PUBLISHED: # 活动已经发布 raise ValidateError( "Can't change activity's name while the activity is published!" ) else: # 活动尚未发布 activity.name = self.input['name'] if activity.place != self.input['place']: # 活动地点需要修改 if activity.status == activity.STATUS_PUBLISHED: # 活动已经发布 raise ValidateError( "Can't change activity's place while the activity is published!" ) else: # 活动尚未发布 activity.place = self.input['place'] activity.description = self.input['description'] # 活动描述 activity.pic_url = self.input['picUrl'].replace( settings.MEDIA_SAVE_ROOT, settings.MEDIA_ROOT) # 活动配图url if datetime_to_timestamp( activity.start_time) != UTCtime_to_timestamp( self.input['startTime']): # 活动开始时间需要修改 if int(time.time()) >= datetime_to_timestamp( activity.end_time): # 活动已经结束 raise ValidateError( "Can't change activity's start time while the activity is end!" ) else: # 活动尚未结束 activity.start_time = UTCtime_to_timestamp( self.input['startTime']) if datetime_to_timestamp( activity.end_time) != UTCtime_to_timestamp( self.input['endTime']): # 活动结束时间需要修改 if int(time.time()) >= datetime_to_timestamp( activity.end_time): # 活动已经结束 raise ValidateError( "Can't change activity's end time while the activity is end!" ) else: # 活动尚未结束 activity.end_time = UTCtime_to_timestamp( self.input['endTime']) if datetime_to_timestamp( activity.book_start) != UTCtime_to_timestamp( self.input['bookStart']): # 抢票开始时间需要修改 if activity.status == activity.STATUS_PUBLISHED: # 活动已经发布 raise ValidateError( "Can't change activity's book start time while the activity is published!" ) else: # 活动尚未发布 activity.book_start = UTCtime_to_timestamp( self.input['bookStart']) if datetime_to_timestamp( activity.book_end) != UTCtime_to_timestamp( self.input['bookEnd']): # 抢票结束时间需要修改 if int(time.time()) >= datetime_to_timestamp( activity.start_time): # 活动已经开始 raise ValidateError( "Can't change activity's book end time while the activity is end!" ) else: # 活动尚未开始 activity.book_end = UTCtime_to_timestamp( self.input['bookEnd']) if activity.total_tickets != int( self.input['totalTickets']): # 总票数需要修改 if int(time.time()) >= datetime_to_timestamp( activity.book_start): # 抢票已经开始 raise ValidateError( "Can't change activity's total tickets count while booking is started!" ) else: # 抢票尚未开始 activity.total_tickets = int(self.input['totalTickets']) if activity.status != int(self.input['status']): # 活动状态需要修改 if activity.status == activity.STATUS_SAVED: # 活动是暂存状态 activity.status = int(self.input['status']) # 允许更改状态 else: raise ValidateError( "Can't change published activity to saved or change deleted activity's status!" ) activity.save() return