예제 #1
0
  def get(self, *args):
    (forum, siteroot, tmpldir) = forum_siteroot_tmpldir_from_url(self.request.path_info)
    if not forum or forum.is_disabled:
      return self.redirect(FORUMS_ROOT + "/")
    is_moderator = users.is_current_user_admin()
    if not is_moderator or forum.is_disabled:
      return self.redirect(siteroot)
    post_id = self.request.query_string
    #logging.info("PostDelUndel: post_id='%s'" % post_id)
    post = db.get(db.Key.from_path('Post', int(post_id)))
    if not post:
      logging.info("No post with post_id='%s'" % post_id)
      return self.redirect(siteroot)
    if post.forum.key() != forum.key():
      loggin.info("post.forum.key().id() ('%s') != fourm.key().id() ('%s')" % (str(post.forum.key().id()), str(forum.key().id())))
      return self.redirect(siteroot)
    path = self.request.path
    if path.endswith("/postdel"):
      if not post.is_deleted:
        post.is_deleted = True
        post.put()
        memcache.delete(rss_memcache_key(forum))
      else:
        logging.info("Post '%s' is already deleted" % post_id)
    elif path.endswith("/postundel"):
      if post.is_deleted:
        post.is_deleted = False
        post.put()
        memcache.delete(rss_memcache_key(forum))
      else:
        logging.info("Trying to undelete post '%s' that is not deleted" % post_id)
    else:
      logging.info("'%s' is not a valid path" % path)

    topic = post.topic
    # deleting/undeleting first post also means deleting/undeleting the whole topic
    first_post = Post.gql("WHERE forum=:1 AND topic = :2 ORDER BY created_on", forum, topic).get()
    if first_post.key() == post.key():
      if path.endswith("/postdel"):
        topic.is_deleted = True
      else:
        topic.is_deleted = False
      topic.put()
      clear_topics_memcache(forum)

    # redirect to topic owning this post
    topic_url = siteroot + "topic?id=" + str(topic.key().id())
    self.redirect(topic_url)
예제 #2
0
 def delete(self):
     """Do the normal delete() and invalidate memcache."""
     super(AnnouncementEntity, self).delete()
     MemcacheManager.delete(self.memcache_key)
예제 #3
0
 def put(self):
     """Do the normal put() and also invalidate memcache."""
     result = super(AnnouncementEntity, self).put()
     MemcacheManager.delete(self.memcache_key)
     return result
예제 #4
0
 def delete(self):
     """Do the normal delete() and invalidate memcache."""
     super(AnnouncementEntity, self).delete()
     MemcacheManager.delete(self.memcache_key)
예제 #5
0
 def put(self):
     """Do the normal put() and also invalidate memcache."""
     result = super(AnnouncementEntity, self).put()
     MemcacheManager.delete(self.memcache_key)
     return result
예제 #6
0
 def delete(self):
     """Do the normal delete() and invalidate memcache."""
     super(StudentAnswersEntity, self).delete()
     MemcacheManager.delete(self.memcache_key)
예제 #7
0
 def delete(self):
     """Do the normal delete() and invalidate memcache."""
     super(StudentAnswersEntity, self).delete()
     MemcacheManager.delete(self.memcache_key)
예제 #8
0
  def post(self, *args):
    if not self.personalize_page_and_get_enrolled():
      return
    (forum, siteroot, tmpldir) = forum_siteroot_tmpldir_from_url(self.request.path_info)
    if not forum or forum.is_disabled:
      return self.redirect(FORUMS_ROOT + "/")
    if self.request.get('Cancel'):
      return self.redirect(siteroot)

    ip = get_remote_ip()
    if ip in BANNED_IPS:
      return self.redirect(siteroot)

    self.send_cookie()

    vals = ['TopicId', 'Subject', 'Message', ]
    (topic_id, subject, message) = req_get_vals(self.request, vals)
    message = to_unicode(message)

    tvals = {
      'siteroot' : siteroot,
      'forums' : db.GqlQuery("SELECT * FROM Forum where is_disabled = False").fetch(MAX_FORUMS),
      'forum' : forum,
      "prevSubject" : subject,
      "prevMessage" : message,
      "log_in_out" : get_log_in_out(siteroot + "post")
    }

    # validate captcha and other values
    errclass = None
    if not message: errclass = "message_class"
    # first post must have subject
    if not topic_id and not subject: errclass = "subject_class"

    # sha.new() doesn't accept Unicode strings, so convert to utf8 first
    message_utf8 = message.encode('UTF-8')
    s = sha.new(message_utf8)
    sha1_digest = s.hexdigest()

    duppost = Post.gql("WHERE sha1_digest = :1", sha1_digest).get()
    if duppost: errclass = "message_class"

    if errclass:
      tvals[errclass] = "error"
      tmpl = os.path.join(tmpldir, "post.html")
      return self.template_out(tmpl, tvals)

    # get user either by google user id or cookie. Create user objects if don't
    # already exist
    existing_user = False
    user_id = users.get_current_user()
    if not user_id:
      self.redirect("/")
      return

    user = Student.get_enrolled_student_by_email(user_id.email())
    if not user:
      self.redirect("/")
      return

    if not topic_id:
      topic = Topic(forum=forum, subject=subject, created_by=user.name)
      topic.put()
    else:
      topic = db.get(db.Key.from_path('Topic', int(topic_id)))
      #assert forum.key() == topic.forum.key()
      topic.ncomments += 1
      topic.put()

    notify_addr = '*****@*****.**'
    if notify_addr:
        mail.send_mail(sender=notify_addr,
                to=notify_addr,
                subject="[booc-iu] New forum post",
                body=Markup("Topic: %s\n%s\n%s") % (
                    topic.subject,
                    self.request.host_url + siteroot + "topic?id=" + str(topic.key().id()),
                    message))
    user_ip_str = get_remote_ip()
    if user.wiki_id:
        user_profile_link = '/wikiprofile?student=%d' % user.wiki_id
    else:
        user_profile_link = ''
    p = Post(topic=topic, forum=forum, user=user, user_ip=0, user_ip_str=user_ip_str, message=message, sha1_digest=sha1_digest, user_name = user.name, user_email = user_id.email(), user_homepage = user_profile_link)
    p.put()
    memcache.delete(rss_memcache_key(forum))
    clear_topics_memcache(forum)
    if topic_id:
      self.redirect(siteroot + "topic?id=" + str(topic_id))
    else:
      self.redirect(siteroot)
예제 #9
0
def clear_topics_memcache(forum):
  memcache.delete(topics_memcache_key(forum))
예제 #10
0
 def delete(self, *args, **kwargs):
     return MemcacheManager.delete(*args, **kwargs)
예제 #11
0
def clear_forums_memcache():
  memcache.delete(FORUMS_MEMCACHE_KEY)
 def delete(self):
     """Do the normal delete() and also remove the object from memcache."""
     super(Teacher, self).delete()
     MemcacheManager.delete(self._memcache_key(self.key().name()))
예제 #13
0
 def delete(self, *args, **kwargs):
     return MemcacheManager.delete(*args, **kwargs)
예제 #14
0
 def delete(self):
     """Do the normal delete() and also remove the object from memcache."""
     super(ProgrammingAnswersEntity, self).delete()
     MemcacheManager.delete(self._memcache_key(self.key().name()))
예제 #15
0
 def delete(self):
     """Do the normal delete() and invalidate memcache."""
     super(CourseSectionEntity, self).delete()
     MemcacheManager.delete(self.memcache_key)
예제 #16
0
 def delete(self):
     """Do the normal delete() and invalidate memcache."""
     super(CourseSectionEntity, self).delete()
     MemcacheManager.delete(self.memcache_key)