2014-01-18 32 views
0

我想模仿常见CMS平台(如Wordpress或Drupal)的“已发布/未发布”功能。Google App Engine:使用cron过期(或“取消发布”)实体

所以我有这个工作(ndb.Model):

class Job(ndb.Model): 
    title = ndb.StringProperty() 
    published = ndb.StringProperty(default = "on") 
    created = ndb.DateTimeProperty(auto_now_add = True) 
    expire = ndb.DateTimeProperty() 

的NewJob处理程序是这样的:

class NewJob(JobHandler): 

    def get(self): 
     self.render('new-job.html') 

    def post(self): 
     title = self.request.get('title') 
     published = "on" 

     expire = datetime.datetime.now() + datetime.timedelta(days = 30) 

     if title: 
      j = Job(
       title = title, 
       published = published, 
       expire = expire, 
       created = created) 
      j.put() 
      self.redirect('/job/%s' % str(j.key.id())) 
     else: 
      self.redirect('/login') 

而且保存实体看起来是这样的:

Job(key=Key('Job', 5910974510923776), created=datetime.datetime(2014, 1, 17, 19, 0, 52, 12379), expire=datetime.datetime(2014, 2, 17, 19, 1, 52, 12174), published=u'on', title=u'Sous Chef') 

我打算做的是将所有Job实体设置为'publish =='off'',当它们的expire时间是今天(现在)

所以我成立了一个任务在cron.yaml

cron: 
- description: expire job entities after 30 days 
    url: /cron/job-expire 
    schedule: every day 00:00 

...和/cron/job-expire URL被处理:

class CronJobExpire(BaseHandler): 
    def get(self): 
     jobs = Job.query(Job.published == "on").fetch() 
     now = datetime.datetime.now() 
     for job in jobs: 
      if job.expire < now or job.expire == now: 
       job.published = "off" 

的上述CronJobExpire处理程序的目标是:

检查当前为published == "on"的作业实体列表,然后 检查他们的expire日期是'now'还是'< now',如果是,请设置published == "off"

这不起作用。我正在关注文档。任何帮助将不胜感激 - 谢谢。

回答

2

您需要保存您更改的工作:

class CronJobExpire(BaseHandler): 
    def get(self): 
     jobs = Job.query(Job.published == "on").fetch() 
     now = datetime.datetime.now() 
     for job in jobs: 
      if job.expire <= now: 
       job.published = "off"  
       job.put() 

另外,我建议只读取过期的工作:

now = datetime.datetime.now()  
jobs = Job.query(Job.published == "on", Job.expire <= now).fetch() 
for job in jobs: 
    job.published = "off" 
    job.put() 

或者,以减少API的调用,从而提高速度:

now = datetime.datetime.now()  
jobs = Job.query(Job.published == "on", Job.expire <= now).fetch() 
for job in jobs: 
    job.published = "off" 
ndb.put_multi(jobs) 

最后,考虑做Job.published一个布尔值:

published = ndb.BooleanProperty(default=True) 
+0

傻了。感谢您提供更多建议。 – puoyaahhh