def UpdateSchema(cursor=None,num_updated=0):
    query = MessagingJob.query()

    results, cursor, more = query.fetch_page(BATCH_SIZE, start_cursor=cursor)

    to_put = []
    for p in results:
        # migration #1 - AppVersion 2 - adding lunar_month & lunar_day index
        if p.lunar_month is None and p.lunar_day is None:
            lunarDate=p.getLunarDate()
            p.lunar_month=lunarDate.month
            p.lunar_day=lunarDate.day
            logging.info(str(p.getLunarDate()) + p.note + " migrated")
        else:
            logging.info(str(p.getLunarDate()) + p.note + " does not have an empty lunar_month/lunar_date")
            continue

        to_put.append(p)

    if to_put:
        ndb.put_multi(to_put)
        num_updated += len(to_put)
        logging.debug('Put %d entities to Datastore for a total of %d',
                len(to_put),num_updated)
        if more:
            deferred.defer(
                    UpdateSchema, cursor, num_updated)
        else:
            logging.info("Updated schema <MessagingJob> with %d updates" % (
                num_updated))

    return
 def get(self):
     today_ld = LunarDate.today()
     q1 = MessagingJob.query(MessagingJob.lunar_month == today_ld.month, MessagingJob.lunar_day == today_ld.day)
     for job in q1.iter():
         mail.send_mail(
             sender=SENDER,
             to=job.owner.email(),
             subject="Lunar Calendar Reminder - " + job.note,
             body=EMAIL_BODY % (job.owner.nickname(), job.note, job.getNextRun()),
         )
    def post(self):
        user = users.get_current_user()
        if user:
            pass
        else:
            self.redirect(users.create_login_url(self.request.uri))


        msg_job_queue_name= DEFAULT_MESSAGING_JOB_NAME
        msg_job = MessagingJob(parent=messagingJob_key(msg_job_queue_name))

        msg_job.owner = users.get_current_user()

        msg_job.note = self.request.get('content')

        if self.request.get('date_type') == 'lunar':
            try:
                msg_job.date = LunarDate(int(self.request.get('year')),
                        int(self.request.get('month')), int(self.request.get('day'))).toSolarDate()
            except ValueError:
                self.redirect('/?msg=invalid_date')
                return
        else:
            try:
                msg_job.date = date(int(self.request.get('year')),
                        int(self.request.get('month')), int(self.request.get('day')))
                LunarDate.fromSolarDate(msg_job.date.year,
                        msg_job.date.month,
                        msg_job.date.day).toSolarDate()
            except ValueError:
                self.redirect('/?msg=invalid_date')
                return

        lunarDate=LunarDate.fromSolarDate(msg_job.date.year,msg_job.date.month,msg_job.date.day)
        msg_job.lunar_month = lunarDate.month
        msg_job.lunar_day = lunarDate.day

        base_messaging_jobs_query = MessagingJob.query(
            ancestor=messagingJob_key(DEFAULT_MESSAGING_JOB_NAME))
        messaging_jobs_query_by_user = base_messaging_jobs_query.filter(
            MessagingJob.owner == user)
        if messaging_jobs_query_by_user.count() >= MAX_ENTRIES_PER_USER:
            self.redirect('/?msg=exceed_user_quota')
            return

        messaging_jobs_query_by_date = base_messaging_jobs_query.filter(
                MessagingJob.lunar_month == msg_job.lunar_month).filter(
                MessagingJob.lunar_day == msg_job.lunar_day)
        if messaging_jobs_query_by_date.count() >= MAX_ENTRIES_PER_DAY:
            self.redirect('/?msg=exceed_daily_quota')
            return

        msg_job.put()

        self.redirect('/')
    def get(self):
        user = users.get_current_user()
        if user:
            pass
        else:
            url = users.create_login_url(self.request.uri)
            url_linktext = 'Login'
            
            template_values = {
                    'jobs': '',
                    'logout_url': url,
                    'logout_url_linktext': url_linktext,
                    'error': self.request.get('msg',''),
                    }

            template = JINJA_ENVIRONMENT.get_template('index.html')
            self.response.write(template.render(template_values))
            #self.redirect(users.create_login_url(self.request.uri))
            return

        messaging_jobs_query = MessagingJob.query(
            ancestor=messagingJob_key(DEFAULT_MESSAGING_JOB_NAME))
        messaging_jobs_query = messaging_jobs_query.filter(
            MessagingJob.owner == user).order(-MessagingJob.created_date)
        messaging_jobs = messaging_jobs_query.fetch(MAX_ENTRIES_PER_USER)

        logout_url = users.create_logout_url(self.request.uri)
        logout_url_linktext = 'Logout'

        template_values = {
                'jobs': messaging_jobs,
                'logout_url': logout_url,
                'logout_url_linktext': logout_url_linktext,
                'error': self.request.get('msg',''),
                }

        template = JINJA_ENVIRONMENT.get_template('index.html')
        self.response.write(template.render(template_values))