示例#1
0
    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!')
示例#2
0
    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!')
示例#3
0
 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
示例#4
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'
     )
示例#5
0
 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
     )
示例#6
0
 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)
示例#7
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,
            }
示例#8
0
 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
示例#9
0
 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
示例#10
0
    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')
示例#11
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,
     }
示例#12
0
 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
示例#13
0
 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
示例#14
0
 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())),   # 当前时间的秒级时间戳
         }
示例#15
0
 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)
示例#16
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),
            })
示例#17
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
示例#18
0
 def post(self):
     self.check_input('id')
     activity = Activity.get_by_id(self.input['id'])
     activity.delete()
示例#19
0
    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()
示例#20
0
    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