def test_acti_create_fail_repeat(self): a = Activity(name=str(1), key='11', description='aaa', start_time=timezone.now(), end_time=timezone.now(), place='ss', book_end=timezone.now(), book_start=timezone.now(), total_tickets='123', status=Activity.STATUS_PUBLISHED, pic_url='sss', remain_tickets='1') a.save() models.User.objects.create_user(username='******', email="*****@*****.**", password='******') c.login(username='******', password='******') resp = c.post( '/api/a/activity/create', { 'name': a.name, 'key': '11', 'place': 'ss', 'description': 'ss', 'picUrl': 'ss', 'startTime': a.start_time, 'endTime': str(timezone.now()), 'bookStart': str(timezone.now()), 'bookEnd': str(timezone.now()), 'totalTickets': '123', 'status': Activity.STATUS_PUBLISHED }) mess = json.loads(str(resp.content, encoding="utf-8")) self.assertEqual(mess['code'], 2) self.assertEqual(mess['msg'], 'already have this activity')
def post(self): """ input: self.input['name'] -------- 活动名称 self.input['key'] -------- 活动代称 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('name', 'key', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart',\ 'bookEnd', 'totalTickets', 'status') if not self.request.user.is_authenticated(): raise ValidateError("admin-user not login!") else: new_activity = Activity(name=self.input['name'], key=self.input['key'],place=self.input['place'],\ description=self.input['description'], pic_url=self.input['picUrl'].replace(settings.MEDIA_SAVE_ROOT, settings.MEDIA_ROOT),\ start_time=self.input['startTime'], end_time=self.input['endTime'],\ book_start=self.input['bookStart'], book_end=self.input['bookEnd'],\ total_tickets=self.input['totalTickets'], status=self.input['status'], remain_tickets=self.input['totalTickets']) new_activity.save() return new_activity.id
def test_acti_del_succ(self): s = Activity(name='11111', key='11', description='aaa', start_time=timezone.now(), end_time=timezone.now(), place='ss', book_end=timezone.now(), book_start=timezone.now(), total_tickets='123', status=Activity.STATUS_PUBLISHED, pic_url='sss', remain_tickets='1') s.save() name_test = s.name models.User.objects.create_user(username='******', email="*****@*****.**", password='******') c.login(username='******', password='******') resp = c.post('/api/a/activity/delete', {'id': s.id}) mess = json.loads(str(resp.content, encoding="utf-8")) self.assertEqual(mess['code'], 0) self.assertEqual(mess['msg'], '') t = Activity.objects.filter(name=name_test) self.assertEqual(t[0].status, Activity.STATUS_DELETED)
def post(self): self.check_input('name', 'key', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status') if not self.request.user.is_authenticated(): raise ValidateError('User not logged in!') new_activity = Activity( name=self.input['name'], key=self.input['key'], place=self.input['place'], description=self.input['description'], pic_url=self.input['picUrl'], start_time=datetime.strptime(self.input['startTime'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8), end_time=datetime.strptime(self.input['endTime'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8), book_start=datetime.strptime(self.input['bookStart'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8), book_end=datetime.strptime(self.input['bookEnd'], "%Y-%m-%dT%H:%M:%S.%fZ") + timedelta(hours=8), remain_tickets=self.input['totalTickets'], total_tickets=self.input['totalTickets'], status=self.input['status']) new_activity.save() return new_activity.id
def post(self): if self.request.user.is_authenticated(): self.check_input('name', 'key', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status') try: new_activity = Activity( name=self.input['name'], key=self.input['key'], place=self.input['place'], description=self.input['description'], pic_url=self.input['picUrl'], start_time=self.input['startTime'], end_time=self.input['endTime'], book_start=self.input['bookStart'], book_end=self.input['bookEnd'], total_tickets=self.input['totalTickets'], status=self.input['status'], remain_tickets=self.input['totalTickets']) new_activity.save() except: raise ValidateError('创建失败') else: return new_activity.id else: raise ValidateError('没有登录')
def post(self): if self.request.user.is_authenticated(): self.check_input('name', 'key', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status') check = Activity.objects.filter( name=self.input['name'], start_time=self.input['startTime']).first() if check is not None: raise LogicError('already have this activity') if len(self.input['picUrl']) > 256: raise LogicError( 'picUrl is too long, please upload local picture') act = Activity(name=self.input['name'], key=self.input['key'], place=self.input['place'], description=self.input['description'], pic_url=self.input['picUrl'], start_time=self.input['startTime'], end_time=self.input['endTime'], book_start=self.input['bookStart'], book_end=self.input['bookEnd'], total_tickets=self.input['totalTickets'], status=self.input['status'], remain_tickets=self.input['totalTickets']) act.save() return act.id else: raise LoginError('')
def post(self): # if self.request.user.is_authenticated(): self.check_input('name', 'key', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status') name = self.input['name'] key = self.input['key'] place = self.input['place'] description = self.input['description'] pic_url = self.input['picUrl'] start_time = self.input['startTime'] end_time = self.input['endTime'] book_start = self.input['bookStart'] book_end = self.input['bookEnd'] total_tickets = self.input['totalTickets'] remain_tickets = self.input['totalTickets'] status = self.input['status'] try: new = Activity(name=name, key=key, place=place, description=description, pic_url=pic_url, start_time=start_time, end_time=end_time, book_start=book_start, book_end=book_end, total_tickets=total_tickets, remain_tickets=remain_tickets, status=status) new.save() return new.id except: raise ValidateError('Create activity error!')
def post(self): data = json.loads(self.request.body.decode('utf-8')) idList = data['ids'] nameList = data['names'] activities = [] for idx, id in enumerate(idList): activity = Activity() activity.id = id activity.name = nameList[idx] activities.append(activity) CustomWeChatView.update_menu(activities)
def setUp(self): s = Activity(name='11111', key='11', description='aaa', start_time=timezone.now(), end_time=timezone.now(), place='ss', book_end=timezone.now(), book_start=timezone.now(), total_tickets='123', status=Activity.STATUS_PUBLISHED, pic_url='sss', remain_tickets='1') s.save()
def setUp(self): 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() self.id_success = new_activity.id new_activity = Activity( name='玩一玩', key='玩', description='玩桌游', start_time=datetime.datetime.fromtimestamp(1539844245), 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=0, ) new_activity.save() self.id_fail = new_activity.id
def createActivityAfterBooking(): act = Activity(name='act_after_booking', key='after_booking', description='desc1', place='place1', start_time=datetime.now(timezone.utc), end_time=datetime.now(timezone.utc) + timedelta(days=1), book_start=datetime.now(timezone.utc) - timedelta(days=2), book_end=datetime.now(timezone.utc) - timedelta(days=1), total_tickets=100, status=Activity.STATUS_PUBLISHED, pic_url='', remain_tickets=100) act.save() return act
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 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 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): 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 test_acti_menu_get_succ(self): s = [] for i in range(6): s.append( Activity(name=str(i), key='11', description='aaa', start_time=timezone.now(), end_time=timezone.now(), place='ss', book_end=timezone.now(), book_start=timezone.now(), total_tickets='123', status=Activity.STATUS_PUBLISHED, pic_url='sss', remain_tickets='1')) s[i].save() models.User.objects.create_user(username='******', email="*****@*****.**", password='******') c.login(username='******', password='******') resp = c.get('/api/a/activity/menu/', {'arg': 'useless'}) mess = json.loads(str(resp.content, encoding="utf-8")) self.assertEqual((mess['code']), 0) self.assertEqual(mess['msg'], '') m = mess['data'] for i in range(len(m)): self.assertEqual(m[i]['name'], str(i))
def get_activity(self): """ note: command can be followed by ONE space and activity key :return: current activity id, int """ if self.is_text_command('抢票'): text = self.extract_activity_name() return Activity.get_by_activity_key(text) else: key = self.input['EventKey'] key = key[len(self.view.event_keys['book_header']):] if key.isdigit(): activity_id = int(key) return Activity.get_by_activity_id(activity_id) else: raise LogicError('EventKey does not contain id')
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 setUp(self): for i in range(6): u = User(open_id=str(i), student_id=str(i)) u.save() a = Activity(name=str(1), key='11', description='aaa', start_time=timezone.now(), end_time=timezone.now(), place='ss', book_end=timezone.now(), book_start=timezone.now(), total_tickets='123', status=Activity.STATUS_PUBLISHED, pic_url='sss', remain_tickets='1') a.save()
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 test_acti_det_mod_succ(self): s = Activity(name='11111', key='11', description='aaa', start_time=timezone.now(), end_time=timezone.now(), place='ss', book_end=timezone.now(), book_start=timezone.now(), total_tickets='123', status=Activity.STATUS_SAVED, pic_url='sss', remain_tickets='1') s.save() models.User.objects.create_user(username='******', email="*****@*****.**", password='******') c.login(username='******', password='******') resp = c.post( '/api/a/activity/detail', { 'id': s.id, 'name': 'test', 'place': 'test', 'description': 'ss', 'picUrl': 'to test', 'startTime': s.start_time, 'endTime': s.end_time, 'bookStart': "test", 'bookEnd': s.book_end, 'totalTickets': '123', 'status': str(Activity.STATUS_SAVED) }) mess = json.loads(str(resp.content, encoding="utf-8")) self.assertEqual(mess['code'], 0) self.assertEqual(mess['msg'], '') # change t = Activity.objects.filter(id=s.id).first() self.assertEqual(t.pic_url, 'to test') self.assertEqual(t.place, 'test') self.assertEqual(t.name, 'test') self.assertEqual(t.book_start, 'test')
def test_acti_del_fail(self): s = Activity(name='11111', key='11', description='aaa', start_time=timezone.now(), end_time=timezone.now(), place='ss', book_end=timezone.now(), book_start=timezone.now(), total_tickets='123', status=Activity.STATUS_PUBLISHED, pic_url='sss', remain_tickets='1') s.save() name_test = s.name resp = c.post('/api/a/activity/delete', {'id': s.id}) mess = json.loads(str(resp.content, encoding="utf-8")) self.assertEqual(mess['code'], 4) self.assertEqual(mess['msg'], '') t = Activity.objects.filter(name=name_test) self.assertEqual(t[0].status, Activity.STATUS_PUBLISHED)
def post(self): self.check_input('name', 'key', 'place', 'description', 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status', 'picUrl') act_info = self.input new_act = Activity(name=act_info["name"], key=act_info["key"], place=act_info["place"], description=act_info["description"], start_time=act_info["startTime"], end_time=act_info["endTime"], book_start=act_info["bookStart"], book_end=act_info["bookEnd"], total_tickets=act_info["totalTickets"], status=act_info["status"], pic_url=act_info["picUrl"], remain_tickets=act_info["totalTickets"], used_tickets=0) new_act.save() id = new_act.id return id
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): self.check_input('name', 'key', 'place', 'description', 'picUrl', 'startTime', 'endTime', 'bookStart', 'bookEnd', 'totalTickets', 'status') if len(list(Activity.objects.filter(key=self.input['key']))) > 0: raise InputError( "activity key %s already exists! use another key instead." % (self.input['key'])) q = Activity(name=self.input['name'], key=self.input['key'], place=self.input['place'], description=self.input['description'], pic_url=self.input['picUrl'], start_time=self.input['startTime'], end_time=self.input['endTime'], book_start=self.input['bookStart'], book_end=self.input['bookEnd'], total_tickets=self.input['totalTickets'], status=self.input['status']) q.remain_tickets = q.total_tickets q.save() return q.id
def handle(self): text = self.extract_activity_name() activity = Activity.objects.filter(key=text).first() if activity is None or activity.status != Activity.STATUS_PUBLISHED: return self.reply_text( self.get_message('cancel_activity_not_found')) if self.user.student_id == '': # not bind yet return self.reply_text(self.get_message('id_not_bind')) ticket = Ticket.objects.filter(student_id=self.user.student_id, activity=activity, status=Ticket.STATUS_VALID).first() if ticket is None: return self.reply_text(self.get_message('no_ticket_in_hand')) Activity.increase_ticket_exclusive(activity.id) ticket.status = Ticket.STATUS_CANCELLED ticket.save() return self.reply_text( self.get_message('cancel_complete', activity=activity))
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, })