Exemplo n.º 1
0
    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!')
Exemplo n.º 2
0
    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('恭喜^_^抢票成功')
Exemplo n.º 3
0
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
Exemplo n.º 4
0
 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()
Exemplo n.º 5
0
    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("您要找的活动并不存在哦")
Exemplo n.º 6
0
    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()
Exemplo n.º 7
0
 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
Exemplo n.º 8
0
 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'
     )
Exemplo n.º 9
0
    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
Exemplo n.º 10
0
    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("抢票成功!")
Exemplo n.º 11
0
    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,
            }
Exemplo n.º 12
0
    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')
Exemplo n.º 13
0
 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
Exemplo n.º 14
0
    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,
        })
Exemplo n.º 15
0
 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'], '')
Exemplo n.º 16
0
 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()
Exemplo n.º 17
0
    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 + '] 退票成功!')
Exemplo n.º 18
0
    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
Exemplo n.º 19
0
 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,
     }
Exemplo n.º 20
0
 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'], '检票失败')
Exemplo n.º 21
0
 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)
Exemplo n.º 22
0
 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))
Exemplo n.º 23
0
    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()
Exemplo n.º 24
0
    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()
Exemplo n.º 25
0
    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
Exemplo n.º 26
0
    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),
            })
Exemplo n.º 27
0
    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
Exemplo n.º 28
0
    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
                }),
            })