Beispiel #1
0
 def get(self, slug):
   # user must be logged in
   msg = {}
   if not self.current_user:
     msg = {'error': 'You must be logged in to bump.', 'redirect': True}
   else:
     post = postsdb.get_post_by_slug(slug)
     if post:
       can_vote = True
       for u in post['voted_users']:
         if u['username'] == self.current_user:
           can_vote = False
       if not can_vote:
         msg = {'error': 'You have already upvoted this post.'}
       else:
         user = userdb.get_user_by_screen_name(self.current_user)
         
         # Increment the vote count
         post['votes'] += 1
         post['voted_users'].append(user['user'])
         postsdb.save_post(post)
         msg = {'votes': post['votes']}
         
         # send email notification to post author
         author = userdb.get_user_by_screen_name(post['user']['username'])
         if 'email_address' in author.keys():
           subject = "[#usvconversation] @%s just bumped up your post: %s" % (self.current_user, post['title'])
           text = "Woo!\n\n%s" % template_helpers.post_permalink(post)
           logging.info('sent email to %s' % author['email_address'])
           self.send_email('*****@*****.**', author['email_address'], subject, text)
         
   self.api_response(msg)
Beispiel #2
0
    def get(self, slug):
        # user must be logged in
        msg = {}
        if not self.current_user:
            msg = {"error": "You must be logged in to bump.", "redirect": True}
        else:
            post = postsdb.get_post_by_slug(slug)
            if post:
                can_vote = True
                for u in post["voted_users"]:
                    if u["username"] == self.current_user:
                        can_vote = False
                if not can_vote:
                    msg = {"error": "You have already upvoted this post."}
                else:
                    user = userdb.get_user_by_screen_name(self.current_user)

                    # Increment the vote count
                    post["votes"] += 1
                    post["voted_users"].append(user["user"])
                    postsdb.save_post(post)
                    msg = {"votes": post["votes"]}

                    # send email notification to post author
                    author = userdb.get_user_by_screen_name(post["user"]["username"])
                    if "email_address" in author.keys():
                        subject = "[#usvconversation] @%s just bumped up your post: %s" % (
                            self.current_user,
                            post["title"],
                        )
                        text = "Woo!\n\nhttp://%s" % template_helpers.post_permalink(post)
                        logging.info("sent email to %s" % author["email_address"])
                        self.send_email("*****@*****.**", author["email_address"], subject, text)

        self.api_response(msg)
Beispiel #3
0
  def get(self):
    comment = self.get_argument('comment', '')
    post_slug = self.get_argument('post', '')
    post = postsdb.get_post_by_slug(post_slug)

    if post:
      # increment the comment count for this post
      post['comment_count'] += 1
      postsdb.save_post(post)
      # determine if anyone is subscribed to this post (for email alerts)
      if len(post['subscribed']) > 0:
        # attempt to get the current user's email (we don't need to alert them)
        author_email = ''
        if self.current_user:
          author = userdb.get_user_by_screen_name(self.current_user)
          if author and 'email_address' in author.keys() and author['email_address'].strip() != '':
            author_email = author['email_address']
        # get the message details from Disqus
        message = disqus.get_post_details(comment)
        if message['message'].strip() != '':
          # send the emails with details
          logging.info(message)
          subject = 'New message on: %s' % post['title']
          text = 'The following comment was just added to your share on usv.com.\n\n%s\n\nYou can engaged in the conversation, and manage your alert settings for this share, at http://www.usv.com/posts/%s' % (message['message'], post['slug'])
          for email in post['subscribed']:
            # attempt to send to each of these subscribed people (don't send to author)
            if email.lower() != author_email.lower() and email.strip() != '':
              self.send_email('*****@*****.**', email, subject, text)
    self.api_response('OK')
Beispiel #4
0
    def get(self):
        comment = self.get_argument("comment", "")
        post_slug = self.get_argument("post", "")
        post = postsdb.get_post_by_slug(post_slug)

        if post:
            # increment the comment count for this post
            post["comment_count"] += 1
            postsdb.save_post(post)
            # determine if anyone is subscribed to this post (for email alerts)
            if len(post["subscribed"]) > 0:
                # attempt to get the current user's email (we don't need to alert them)
                author_email = ""
                if self.current_user:
                    author = userdb.get_user_by_screen_name(self.current_user)
                    if author and "email_address" in author.keys() and author["email_address"].strip() != "":
                        author_email = author["email_address"]
                # get the message details from Disqus
                message = disqus.get_post_details(comment)
                if message["message"].strip() != "":
                    # send the emails with details
                    logging.info(message)
                    subject = "New message on: %s" % post["title"]
                    text = (
                        "The following comment was just added to your share on usv.com.\n\n%s\n\nYou can engaged in the conversation, and manage your alert settings for this share, at http://www.usv.com/posts/%s"
                        % (message["message"], post["slug"])
                    )
                    for email in post["subscribed"]:
                        # attempt to send to each of these subscribed people (don't send to author)
                        if email.lower() != author_email.lower() and email.strip() != "":
                            self.send_email("*****@*****.**", email, subject, text)
        self.api_response("OK")
Beispiel #5
0
    def post(self, slug):
        # user must be logged in
        msg = {}
        if not self.current_user:
            msg = {'error': 'You must be logged in to bump.', 'redirect': True}
        else:
            post = postsdb.get_post_by_slug(slug)
            if post:
                can_vote = True
                for u in post['voted_users']:
                    if u['username'] == self.current_user:
                        can_vote = False
                if not can_vote:
                    msg = {'error': 'You have already upvoted this post.'}
                else:
                    user = userdb.get_user_by_screen_name(self.current_user)

                    # Increment the vote count
                    post['votes'] += 1
                    post['voted_users'].append(user['user'])
                    postsdb.save_post(post)
                    msg = {'votes': post['votes']}

                    # send email notification to post author
                    author = userdb.get_user_by_screen_name(post['user']['username'])
                    if 'email_address' in author.keys():
                        subject = "[#usvconversation] @%s just bumped up your post: %s" % (self.current_user, post['title'])
                        text = "Woo!\n\n%s" % template_helpers.post_permalink(post)
                        logging.info('sent email to %s' % author['email_address'])
                        self.send_email('*****@*****.**', author['email_address'], subject, text)

        self.api_response(msg)
Beispiel #6
0
    def get(self):
        comment = self.get_argument('comment', '')
        post_slug = self.get_argument('post', '')
        post = postsdb.get_post_by_slug(post_slug)

        if post:
            # increment the comment count for this post
            post['comment_count'] += 1
            postsdb.save_post(post)
            # determine if anyone is subscribed to this post (for email alerts)
            if len(post['subscribed']) > 0:
                # attempt to get the current user's email (we don't need to alert them)
                author_email = ''
                if self.current_user:
                    author = userdb.get_user_by_screen_name(self.current_user)
                    if author and 'email_address' in author.keys() and author['email_address'].strip() != '':
                        author_email = author['email_address']
                # get the message details from Disqus
                message = disqus.get_post_details(comment)
                if message['message'].strip() != '':
                    # send the emails with details
                    logging.info(message)
                    subject = 'New message on: %s' % post['title']
                    text = 'The following comment was just added to your share on usv.com.\n\n%s\n\nYou can engaged in the conversation, and manage your alert settings for this share, at http://www.usv.com/posts/%s' % (message['message'], post['slug'])
                    for email in post['subscribed']:
                        # attempt to send to each of these subscribed people (don't send to author)
                        if email.lower() != author_email.lower() and email.strip() != '':
                            self.send_email('*****@*****.**', email, subject, text)
        self.api_response('OK')
Beispiel #7
0
  def get(self, slug):
    post = postsdb.get_post_by_slug(slug)

    if self.current_user_can('downvote_posts'):
      post['sort_score'] -= 0.25
      postsdb.save_post(post)

    self.redirect('/?sort_by=hot')
Beispiel #8
0
  def get(self, slug):
    post = postsdb.get_post_by_slug(slug)

    if post and self.current_user_can('mute_posts'):
      post['muted'] = True
      postsdb.save_post(post)

    self.redirect('/?sort_by=hot')
Beispiel #9
0
  def get(self, slug):
    # user must be logged in
    msg = {}
    if not self.current_user:
      msg = {'error': 'You must be logged in to super downvote.', 'redirect': True}
    elif not self.current_user_can('super_downvote'):
      msg = {'error': 'You are not authorized to super downvote', 'redirect': True}
    else:
      post = postsdb.get_post_by_slug(slug)
      if post:
          # Increment the vote count
          super_downvotes = post.get('super_downvotes') or 0
          super_downvotes += 1
          post['super_downvotes'] = super_downvotes
          postsdb.save_post(post)
          msg = {'supervotes': post['super_downvotes']}

    self.api_response(msg)
Beispiel #10
0
    def post(self, slug):
        # user must be logged in
        msg = {}
        if not self.current_user:
            msg = {'error': 'You must be logged in to super downvote.', 'redirect': True}
        elif not self.current_user_can('super_downvote'):
            msg = {'error': 'You are not authorized to super downvote', 'redirect': True}
        else:
            post = postsdb.get_post_by_slug(slug)
            if post:
                # Increment the vote count
                super_downvotes = post.get('super_downvotes') or 0
                super_downvotes += 1
                post['super_downvotes'] = super_downvotes
                postsdb.save_post(post)
                msg = {'supervotes': post['super_downvotes']}

        self.api_response(msg)
def subscribe_to_all_your_threads(username):
    account = userdb.get_user_by_screen_name(username)
    # todo: get disqus_user_id
    # temp: nick's ID
    if 'disqus' not in account:
        print 'ERROR: no disqus user ID'
        return
    print 'subscribing to disqus threads for user %s' % username

    #make sure all your threads are registered w disqus
    posts = postsdb.get_posts_by_screen_name(username, per_page=25, page=1)
    for post in posts:
        print template_helpers.post_permalink(post)
        if 'disqus_thread_id_str' not in post.keys() or post.get(
                'disqus_thread_id_str') == "":
            thread_details = create_thread(post,
                                           account['disqus']['access_token'])
            try:
                thread_id = thread_details['response']['id']
            except:
                thread = get_thread_details(post)
                thread_id = thread['response']['id']

            post['disqus_thread_id_str'] = thread_id
            postsdb.save_post(post)
        subscribe_to_thread(
            post.get('disqus_thread_id_str'),
            account['disqus']['access_token'])
    '''
    threads = get_all_threads(account['disqus']['user_id'])['response']
    my_threads = []
    for thread in threads:
      if 'link' not in thread or thread['link'] is None:
        continue
      if thread['link'].find('http://localhost') >= 0:
        continue
      my_threads.append(thread)
    if 'disqus' in account:
      for thread in my_threads:
        subscribe_to_thread(thread['id'], account['disqus']['access_token'])
        print 'subscribed to thread: %s' % thread['title']
    return
    '''
    return
def subscribe_to_all_your_threads(username):
    account = userdb.get_user_by_screen_name(username)
    # todo: get disqus_user_id
    # temp: nick's ID
    if 'disqus' not in account:
        print 'ERROR: no disqus user ID'
        return
    print 'subscribing to disqus threads for user %s' % username

    #make sure all your threads are registered w disqus
    posts = postsdb.get_posts_by_screen_name(username, per_page=25, page=1)
    for post in posts:
        print template_helpers.post_permalink(post)
        if 'disqus_thread_id_str' not in post.keys() or post.get('disqus_thread_id_str') == "":
            thread_details = create_thread(post, account['disqus']['access_token'])
            try:
                thread_id = thread_details['response']['id']
            except:
                thread = get_thread_details(post)
                thread_id = thread['response']['id']

            post['disqus_thread_id_str'] = thread_id
            postsdb.save_post(post)
        subscribe_to_thread(post.get('disqus_thread_id_str'), account['disqus']['access_token'])

    '''
    threads = get_all_threads(account['disqus']['user_id'])['response']
    my_threads = []
    for thread in threads:
      if 'link' not in thread or thread['link'] is None:
        continue
      if thread['link'].find('http://localhost') >= 0:
        continue
      my_threads.append(thread)
    if 'disqus' in account:
      for thread in my_threads:
        subscribe_to_thread(thread['id'], account['disqus']['access_token'])
        print 'subscribed to thread: %s' % thread['title']
    return
    '''
    return
Beispiel #13
0
    def get(self, slug):
        # user must be logged in
        msg = {}
        if not self.current_user:
            msg = {'error': 'You must be logged in to bump.', 'redirect': True}
        else:
            post = postsdb.get_post_by_slug(slug)
            if post:
                can_vote = True
                for u in post['voted_users']:
                    if u['username'] == self.current_user:
                        can_unbump = True
                if not can_unbump:
                    msg = {'error': "You can't unbump this post!"}
                else:
                    user = userdb.get_user_by_screen_name(self.current_user)
                    post['votes'] -= 1
                    post['voted_users'].remove(user['user'])
                    postsdb.save_post(post)
                    msg = {'votes': post['votes']}

        self.api_response(msg)
Beispiel #14
0
  def get(self, slug):
    # user must be logged in
    msg = {}
    if not self.current_user:
      msg = {'error': 'You must be logged in to bump.', 'redirect': True}
    else:
      post = postsdb.get_post_by_slug(slug)
      if post:
        can_vote = True
        for u in post['voted_users']:
          if u['username'] == self.current_user:
            can_unbump = True
        if not can_unbump:
          msg = {'error': "You can't unbump this post!"}
        else:
          user = userdb.get_user_by_screen_name(self.current_user)
          post['votes'] -= 1
          post['voted_users'].remove(user['user'])
          postsdb.save_post(post)
          msg = {'votes': post['votes']}

    self.api_response(msg)
Beispiel #15
0
    def get(self, slug):
        # user must be logged in
        msg = {}
        if not self.current_user:
            msg = {"error": "You must be logged in to bump.", "redirect": True}
        else:
            post = postsdb.get_post_by_slug(slug)
            if post:
                can_vote = True
                for u in post["voted_users"]:
                    if u["username"] == self.current_user:
                        can_unbump = True
                if not can_unbump:
                    msg = {"error": "You can't unbump this post!"}
                else:
                    user = userdb.get_user_by_screen_name(self.current_user)
                    post["votes"] -= 1
                    post["voted_users"].remove(user["user"])
                    postsdb.save_post(post)
                    msg = {"votes": post["votes"]}

        self.api_response(msg)
Beispiel #16
0
    def post(self):
        sort_by = self.get_argument('sort_by', 'hot')
        page = abs(int(self.get_argument('page', '1')))
        per_page = abs(int(self.get_argument('per_page', '9')))
        is_blacklisted = False
        msg = 'success'
        if self.current_user:
            is_blacklisted = self.is_blacklisted(self.current_user)

        post = {}
        post['slug'] = self.get_argument('slug', None)
        post['title'] = self.get_argument('title', '')
        post['url'] = self.get_argument('url', '')
        post['body_raw'] = self.get_argument('body_raw', '')
        post['tags'] = self.get_argument('tags', '').split(',')
        post['featured'] = self.get_argument('featured', '')
        post['has_hackpad'] = self.get_argument('has_hackpad', '')
        post['slug'] = self.get_argument('slug', '')
        post['sort_score'] = 0
        post['daily_sort_score'] = 0
        if post['has_hackpad'] != '':
            post['has_hackpad'] = True
        else:
            post['has_hackpad'] = False

        deleted = self.get_argument('deleted', '')
        if deleted != '':
            post['deleted'] = True
            post['date_deleted'] = datetime.datetime.now()

        bypass_dup_check = self.get_argument('bypass_dup_check', '')
        is_edit = False
        if post['slug']:
            bypass_dup_check = "true"
            is_edit = True

        dups = []

        # make sure user isn't blacklisted
        if not self.is_blacklisted(self.current_user):
            # check if there is an existing URL
            if post['url'] != '':
                url = urlparse(post['url'])
                netloc = url.netloc.split('.')
                if netloc[0] == 'www':
                    del netloc[0]
                path = url.path
                if path and path[-1] == '/':
                    path = path[:-1]
                url = '%s%s' % ('.'.join(netloc), path)
                post['normalized_url'] = url

                long_url = post['url']
                if long_url.find('goo.gl') > -1:
                    long_url = google.expand_url(post['url'])
                if long_url.find('bit.ly') > -1 or long_url.find(
                        'bitly.com') > -1:
                    long_url = bitly.expand_url(post['url'].replace(
                        'http://bitly.com', '').replace('http://bit.ly', ''))
                post['domain'] = urlparse(long_url).netloc

            ok_to_post = True
            dups = postsdb.get_posts_by_normalized_url(
                post.get('normalized_url', ""), 1)
            if post['url'] != '' and len(
                    dups) > 0 and bypass_dup_check != "true":
                ##
                ## If there are dupes, kick them back to the post add form
                ##
                return (self.render('post/new_post.html', post=post,
                                    dups=dups))

            # Handle tags
            post['tags'] = [t.strip().lower() for t in post['tags']]
            post['tags'] = [t for t in post['tags'] if t]
            userdb.add_tags_to_user(self.current_user, post['tags'])
            for tag in post['tags']:
                tagsdb.save_tag(tag)

            # format the content as needed
            post['body_html'] = sanitize.html_sanitize(
                post['body_raw'],
                media=self.current_user_can('post_rich_media'))
            post['body_text'] = sanitize.html_to_text(post['body_html'])
            post['body_truncated'] = sanitize.truncate(post['body_text'], 500)

            # determine if this should be a featured post or not
            if self.current_user_can(
                    'feature_posts') and post['featured'] != '':
                post['featured'] = True
                post['date_featured'] = datetime.datetime.now()
            else:
                post['featured'] = False
                post['date_featured'] = None

            user = userdb.get_user_by_screen_name(self.current_user)

            if not post['slug']:
                # No slug -- this is a new post.
                # initiate fields that are new
                post['disqus_shortname'] = settings.get('disqus_short_code')
                post['muted'] = False
                post['comment_count'] = 0
                post['disqus_thread_id_str'] = ''
                post['sort_score'] = 0.0
                post['downvotes'] = 0
                post['hackpad_url'] = ''
                post['date_created'] = datetime.datetime.now()
                post['user_id_str'] = user['user']['id_str']
                post['username'] = self.current_user
                post['user'] = user['user']
                post['votes'] = 1
                post['voted_users'] = [user['user']]
                #save it
                post['slug'] = postsdb.insert_post(post)
                msg = 'success'
            else:
                # this is an existing post.
                # attempt to edit the post (make sure they are the author)
                saved_post = postsdb.get_post_by_slug(post['slug'])
                if saved_post and self.current_user == saved_post['user'][
                        'screen_name']:
                    # looks good - let's update the saved_post values to new values
                    for key in post.keys():
                        saved_post[key] = post[key]
                    # finally let's save the updates
                    postsdb.save_post(saved_post)
                    msg = 'success'

            # log any @ mentions in the post
            mentions = re.findall(r'@([^\s]+)', post['body_raw'])
            for mention in mentions:
                mentionsdb.add_mention(mention.lower(), post['slug'])

        # Send email to USVers if OP is staff
        if self.current_user in settings.get('staff'):
            subject = 'USV.com: %s posted "%s"' % (self.current_user,
                                                   post['title'])
            if 'url' in post and post[
                    'url']:  # post.url is the link to external content (if any)
                post_link = 'External Link: %s \n\n' % post['url']
            else:
                post_link = ''
            post_url = "http://%s/posts/%s" % (settings.get('base_url'),
                                               post['slug'])
            text = '"%s" ( %s ) posted by %s. \n\n %s %s' % (
                post['title'].encode('ascii', errors='ignore'), post_url,
                self.current_user, post_link, post.get('body_text', ""))
            # now attempt to actually send the emails
            for u in settings.get('staff'):
                if u != self.current_user:
                    acc = userdb.get_user_by_screen_name(u)
                    if acc:
                        self.send_email('*****@*****.**', acc['email_address'],
                                        subject, text)

        # Subscribe to Disqus
        # Attempt to create the post's thread
        acc = userdb.get_user_by_screen_name(self.current_user)
        thread_id = 0
        try:
            # Attempt to create the thread.
            thread_details = disqus.create_thread(
                post, acc['disqus']['access_token'])
            thread_id = thread_details['response']['id']
        except:
            try:
                # trouble creating the thread, try to just get the thread via the slug
                thread_details = disqus.get_thread_details(post)
                thread_id = thread_details['response']['id']
            except:
                thread_id = 0
        if thread_id != 0:
            # Subscribe a user to the thread specified in response
            disqus.subscribe_to_thread(thread_id,
                                       acc['disqus']['access_token'])
            # update the thread with the disqus_thread_id_str
            saved_post = postsdb.get_post_by_slug(post['slug'])
            saved_post['disqus_thread_id_str'] = thread_id
            postsdb.save_post(saved_post)

        if is_edit:
            self.redirect('/posts/%s?msg=updated' % post['slug'])
        else:
            self.redirect('/?msg=success&slug=%s' % post['slug'])
Beispiel #17
0
    def post(self):
        sort_by = self.get_argument("sort_by", "hot")
        page = abs(int(self.get_argument("page", "1")))
        per_page = abs(int(self.get_argument("per_page", "9")))
        is_blacklisted = False
        msg = "success"
        if self.current_user:
            is_blacklisted = self.is_blacklisted(self.current_user)

        post = {}
        post["slug"] = self.get_argument("slug", None)
        post["title"] = self.get_argument("title", "")
        post["url"] = self.get_argument("url", "")
        post["body_raw"] = self.get_argument("body_raw", "")
        post["tags"] = self.get_argument("tags", "").split(",")
        post["featured"] = self.get_argument("featured", "")
        post["has_hackpad"] = self.get_argument("has_hackpad", "")
        post["slug"] = self.get_argument("slug", "")
        if post["has_hackpad"] != "":
            post["has_hackpad"] = True
        else:
            post["has_hackpad"] = False

        deleted = self.get_argument("deleted", "")
        if deleted != "":
            post["deleted"] = True
            post["date_deleted"] = datetime.now()

        bypass_dup_check = self.get_argument("bypass_dup_check", "")
        is_edit = False
        if post["slug"]:
            bypass_dup_check = "true"
            is_edit = True

        dups = []

        # make sure user isn't blacklisted
        if not self.is_blacklisted(self.current_user):
            # check if there is an existing URL
            if post["url"] != "":
                url = urlparse(post["url"])
                netloc = url.netloc.split(".")
                if netloc[0] == "www":
                    del netloc[0]
                path = url.path
                if path and path[-1] == "/":
                    path = path[:-1]
                url = "%s%s" % (".".join(netloc), path)
                post["normalized_url"] = url

                long_url = post["url"]
                if long_url.find("goo.gl") > -1:
                    long_url = google.expand_url(post["url"])
                if long_url.find("bit.ly") > -1 or long_url.find("bitly.com") > -1:
                    long_url = bitly.expand_url(
                        post["url"].replace("http://bitly.com", "").replace("http://bit.ly", "")
                    )
                post["domain"] = urlparse(long_url).netloc

            ok_to_post = True
            dups = postsdb.get_posts_by_normalized_url(post.get("normalized_url", ""), 1)
            if post["url"] != "" and len(dups) > 0 and bypass_dup_check != "true":
                ##
                ## If there are dupes, kick them back to the post add form
                ##
                return self.render("post/new_post.html", post=post, dups=dups)

            # Handle tags
            post["tags"] = [t.strip().lower() for t in post["tags"]]
            post["tags"] = [t for t in post["tags"] if t]
            userdb.add_tags_to_user(self.current_user, post["tags"])
            for tag in post["tags"]:
                tagsdb.save_tag(tag)

            # format the content as needed
            post["body_html"] = sanitize.html_sanitize(post["body_raw"], media=self.current_user_can("post_rich_media"))
            post["body_text"] = sanitize.html_to_text(post["body_html"])
            post["body_truncated"] = sanitize.truncate(post["body_text"], 500)

            # determine if this should be a featured post or not
            if self.current_user_can("feature_posts") and post["featured"] != "":
                post["featured"] = True
                post["date_featured"] = datetime.now()
            else:
                post["featured"] = False
                post["date_featured"] = None

            user = userdb.get_user_by_screen_name(self.current_user)

            if not post["slug"]:
                # No slug -- this is a new post.
                # initiate fields that are new
                post["disqus_shortname"] = settings.get("disqus_short_code")
                post["muted"] = False
                post["comment_count"] = 0
                post["disqus_thread_id_str"] = ""
                post["sort_score"] = 0.0
                post["downvotes"] = 0
                post["hackpad_url"] = ""
                post["date_created"] = datetime.now()
                post["user_id_str"] = user["user"]["id_str"]
                post["username"] = self.current_user
                post["user"] = user["user"]
                post["votes"] = 1
                post["voted_users"] = [user["user"]]
                # save it
                post["slug"] = postsdb.insert_post(post)
                msg = "success"
            else:
                # this is an existing post.
                # attempt to edit the post (make sure they are the author)
                saved_post = postsdb.get_post_by_slug(post["slug"])
                if saved_post and self.current_user == saved_post["user"]["screen_name"]:
                    # looks good - let's update the saved_post values to new values
                    for key in post.keys():
                        saved_post[key] = post[key]
                    # finally let's save the updates
                    postsdb.save_post(saved_post)
                    msg = "success"

            # log any @ mentions in the post
            mentions = re.findall(r"@([^\s]+)", post["body_raw"])
            for mention in mentions:
                mentionsdb.add_mention(mention.lower(), post["slug"])

        # Send email to USVers if OP is staff
        if self.current_user in settings.get("staff"):
            subject = 'USV.com: %s posted "%s"' % (self.current_user, post["title"])
            if "url" in post and post["url"]:  # post.url is the link to external content (if any)
                post_link = "External Link: %s \n\n" % post["url"]
            else:
                post_link = ""
            post_url = "http://%s/posts/%s" % (settings.get("base_url"), post["slug"])
            text = '"%s" ( %s ) posted by %s. \n\n %s %s' % (
                post["title"].encode("ascii", errors="ignore"),
                post_url,
                self.current_user,
                post_link,
                post.get("body_text", ""),
            )
            # now attempt to actually send the emails
            for u in settings.get("staff"):
                if u != self.current_user:
                    acc = userdb.get_user_by_screen_name(u)
                    if acc:
                        self.send_email("*****@*****.**", acc["email_address"], subject, text)

        # Subscribe to Disqus
        # Attempt to create the post's thread
        acc = userdb.get_user_by_screen_name(self.current_user)
        thread_id = 0
        try:
            # Attempt to create the thread.
            thread_details = disqus.create_thread(post, acc["disqus_access_token"])
            thread_id = thread_details["response"]["id"]
        except:
            try:
                # trouble creating the thread, try to just get the thread via the slug
                thread_details = disqus.get_thread_details(post.slug)
                thread_id = thread_details["response"]["id"]
            except:
                thread_id = 0
        if thread_id != 0:
            # Subscribe a user to the thread specified in response
            disqus.subscribe_to_thread(thread_id, acc["disqus_access_token"])
            # update the thread with the disqus_thread_id_str
            saved_post = postsdb.get_post_by_slug(post["slug"])
            saved_post["disqus_thread_id_str"] = thread_id
            postsdb.save_post(saved_post)

        featured_posts = postsdb.get_featured_posts(6, 1)
        sort_by = "newest"
        posts = postsdb.get_new_posts(per_page, page)

        if is_edit:
            self.redirect("/posts/%s?msg=updated" % post["slug"])
        else:
            self.render(
                "post/lists_posts.html",
                sort_by=sort_by,
                msg=msg,
                page=page,
                posts=posts,
                featured_posts=featured_posts,
                is_blacklisted=is_blacklisted,
                new_post=post,
                dups=dups,
            )
Beispiel #18
0
  def post(self):
    sort_by = self.get_argument('sort_by', 'hot')
    page = abs(int(self.get_argument('page', '1')))
    per_page = abs(int(self.get_argument('per_page', '9')))
    is_blacklisted = False
    msg = 'success'
    if self.current_user:
      is_blacklisted = self.is_blacklisted(self.current_user)
    
    post = {}
    post['slug'] = self.get_argument('slug', None)
    post['title'] = self.get_argument('title', '')
    post['url'] = self.get_argument('url', '')
    post['body_raw'] = self.get_argument('body_raw', '')
    post['tags'] = self.get_argument('tags', '').split(',')
    post['featured'] = self.get_argument('featured', '')
    post['has_hackpad'] = self.get_argument('has_hackpad', '')
    post['slug'] = self.get_argument('slug', '')
    post['sort_score'] = 0
    post['daily_sort_score'] = 0
    if post['has_hackpad'] != '':
      post['has_hackpad'] = True
    else:
      post['has_hackpad'] = False

    deleted = self.get_argument('deleted', '')
    if deleted != '':
      post['deleted'] = True
      post['date_deleted'] = datetime.datetime.now()

    bypass_dup_check = self.get_argument('bypass_dup_check', '')
    is_edit = False
    if post['slug']:
      bypass_dup_check = "true"
      is_edit = True

    dups = []

    # make sure user isn't blacklisted
    if not self.is_blacklisted(self.current_user):
      # check if there is an existing URL
      if post['url'] != '':
        url = urlparse(post['url'])
        netloc = url.netloc.split('.')
        if netloc[0] == 'www':
          del netloc[0]
        path = url.path
        if path and path[-1] == '/':
          path = path[:-1]
        url = '%s%s' % ('.'.join(netloc), path)
        post['normalized_url'] = url

        long_url = post['url']
        if long_url.find('goo.gl') > -1:
          long_url = google.expand_url(post['url'])
        if long_url.find('bit.ly') > -1 or long_url.find('bitly.com') > -1:
          long_url = bitly.expand_url(post['url'].replace('http://bitly.com','').replace('http://bit.ly',''))
        post['domain'] = urlparse(long_url).netloc

      ok_to_post = True
      dups = postsdb.get_posts_by_normalized_url(post.get('normalized_url', ""), 1)
      if post['url'] != '' and len(dups) > 0 and bypass_dup_check != "true":
        ## 
        ## If there are dupes, kick them back to the post add form
        ##
        return (self.render('post/new_post.html', post=post, dups=dups))
        
      # Handle tags
      post['tags'] = [t.strip().lower() for t in post['tags']]
      post['tags'] = [t for t in post['tags'] if t]
      userdb.add_tags_to_user(self.current_user, post['tags'])
      for tag in post['tags']:
        tagsdb.save_tag(tag)

      # format the content as needed
      post['body_html'] = sanitize.html_sanitize(post['body_raw'], media=self.current_user_can('post_rich_media'))
      post['body_text'] = sanitize.html_to_text(post['body_html'])
      post['body_truncated'] = sanitize.truncate(post['body_text'], 500)

      # determine if this should be a featured post or not
      if self.current_user_can('feature_posts') and post['featured'] != '':
        post['featured'] = True
        post['date_featured'] = datetime.datetime.now()
      else:
        post['featured'] = False
        post['date_featured'] = None

      user = userdb.get_user_by_screen_name(self.current_user)

      if not post['slug']:
        # No slug -- this is a new post.
        # initiate fields that are new
        post['disqus_shortname'] = settings.get('disqus_short_code')
        post['muted'] = False
        post['comment_count'] = 0
        post['disqus_thread_id_str'] = ''
        post['sort_score'] = 0.0
        post['downvotes'] = 0
        post['hackpad_url'] = ''
        post['date_created'] = datetime.datetime.now()
        post['user_id_str'] = user['user']['id_str']
        post['username'] = self.current_user
        post['user'] = user['user']
        post['votes'] = 1
        post['voted_users'] = [user['user']]
        #save it
        post['slug'] = postsdb.insert_post(post)
        msg = 'success'
      else:
        # this is an existing post.
        # attempt to edit the post (make sure they are the author)
        saved_post = postsdb.get_post_by_slug(post['slug'])
        if saved_post and self.current_user == saved_post['user']['screen_name']:
          # looks good - let's update the saved_post values to new values
          for key in post.keys():
            saved_post[key] = post[key]
          # finally let's save the updates
          postsdb.save_post(saved_post)
          msg = 'success'

      # log any @ mentions in the post
      mentions = re.findall(r'@([^\s]+)', post['body_raw'])
      for mention in mentions:
        mentionsdb.add_mention(mention.lower(), post['slug'])

    # Send email to USVers if OP is staff
    if self.current_user in settings.get('staff'):
      subject = 'USV.com: %s posted "%s"' % (self.current_user, post['title'])
      if 'url' in post and post['url']: # post.url is the link to external content (if any)
        post_link = 'External Link: %s \n\n' % post['url']
      else:
        post_link = ''
      post_url = "http://%s/posts/%s" % (settings.get('base_url'), post['slug'])
      text = '"%s" ( %s ) posted by %s. \n\n %s %s' % (post['title'].encode('ascii', errors='ignore'), post_url, self.current_user, post_link, post.get('body_text', ""))
      # now attempt to actually send the emails
      for u in settings.get('staff'):
        if u != self.current_user:
          acc = userdb.get_user_by_screen_name(u)
          if acc:
            self.send_email('*****@*****.**', acc['email_address'], subject, text)
  
    # Subscribe to Disqus
    # Attempt to create the post's thread
    acc = userdb.get_user_by_screen_name(self.current_user)
    thread_id = 0
    try:
      # Attempt to create the thread.
      thread_details = disqus.create_thread(post, acc['disqus']['access_token'])
      thread_id = thread_details['response']['id']
    except:
      try:
        # trouble creating the thread, try to just get the thread via the slug
        thread_details = disqus.get_thread_details(post)
        thread_id = thread_details['response']['id']
      except:
        thread_id = 0
    if thread_id != 0:
      # Subscribe a user to the thread specified in response
      disqus.subscribe_to_thread(thread_id, acc['disqus']['access_token'])
      # update the thread with the disqus_thread_id_str
      saved_post = postsdb.get_post_by_slug(post['slug'])
      saved_post['disqus_thread_id_str'] = thread_id
      postsdb.save_post(saved_post)

    if is_edit:
      self.redirect('/posts/%s?msg=updated' % post['slug'])
    else:
      self.redirect('/?msg=success&slug=%s' % post['slug'])
Beispiel #19
0
    def post(self):
        sort_by = self.get_argument('sort_by', 'hot')
        page = abs(int(self.get_argument('page', '1')))
        per_page = abs(int(self.get_argument('per_page', '9')))
        is_blacklisted = False
        msg = 'success'
        if self.current_user:
            is_blacklisted = self.is_blacklisted(self.current_user)

        post = {}
        post['slug'] = self.get_argument('slug', None)
        post['title'] = self.get_argument('title', '')
        post['url'] = self.get_argument('url', '')
        post['body_raw'] = self.get_argument('body_raw', '')
        post['tags'] = self.get_argument('tags', '').split(',')
        post['featured'] = self.get_argument('featured', '')
        post['has_hackpad'] = self.get_argument('has_hackpad', '')
        post['slug'] = self.get_argument('slug', '')
        post['sort_score'] = 0
        post['daily_sort_score'] = 0

        # handle topics
        if self.get_argument('primary_topic', '') == "" or self.get_argument('primary_topic', '') == "+other+":
            post['topic_slug'] = slugify(unicode(self.get_argument('secondary_topic', '')))
        else:
            post['topic_slug'] = self.get_argument('primary_topic', '')

        if post['has_hackpad'] != '':
            post['has_hackpad'] = True
        else:
            post['has_hackpad'] = False

        deleted = self.get_argument('deleted', '')
        if deleted != '':
            post['deleted'] = True
            post['date_deleted'] = datetime.datetime.now()

        bypass_dup_check = self.get_argument('bypass_dup_check', '')
        is_edit = False
        if post['slug']:
            bypass_dup_check = "true"
            is_edit = True

        dups = []

        # make sure user isn't blacklisted
        if not self.is_blacklisted(self.current_user):
            # check if there is an existing URL
            if post['url'] != '':
                url = urlparse(post['url'])
                netloc = url.netloc.split('.')
                if netloc[0] == 'www':
                    del netloc[0]
                path = url.path
                if path and path[-1] == '/':
                    path = path[:-1]
                url = '%s%s' % ('.'.join(netloc), path)
                post['normalized_url'] = url

                long_url = post['url']
                if long_url.find('goo.gl') > -1:
                    long_url = google.expand_url(post['url'])
                if long_url.find('bit.ly') > -1 or long_url.find('bitly.com') > -1:
                    long_url = bitly.expand_url(post['url'].replace('http://bitly.com','').replace('http://bit.ly',''))
                post['domain'] = urlparse(long_url).netloc

            ok_to_post = True

            dups = postsdb.get_posts_by_normalized_url(post.get('normalized_url', ""), 1)
            if post['url'] != '' and len(dups) > 0 and bypass_dup_check != "true":
                ##
                ## If there are dupes, kick them back to the post add form
                ##
                return (self.render('post/new_post.html', post=post, dups=dups))

            # Handle tags
            post['tags'] = [t.strip().lower() for t in post['tags']]
            post['tags'] = [t for t in post['tags'] if t]
            userdb.add_tags_to_user(self.current_user, post['tags'])
            for tag in post['tags']:
                tagsdb.save_tag(tag)

            # format the content as needed
            post['body_html'] = sanitize.html_sanitize(post['body_raw'], media=self.current_user_can('post_rich_media'))
            post['body_text'] = sanitize.html_to_text(post['body_html'])
            post['body_truncated'] = sanitize.truncate(post['body_text'], 500)

            # determine if this should be a featured post or not
            if self.current_user_can('feature_posts') and post['featured'] != '':
                post['featured'] = True
                post['date_featured'] = datetime.datetime.now()
            else:
                post['featured'] = False
                post['date_featured'] = None

            user_info = userdb.get_user_by_screen_name(self.current_user)
            
            if not post['slug'] or post.get('slug') == "" or post.get('slug') == "None":
                # No slug -- this is a new post.
                # initiate fields that are new
                post['disqus_shortname'] = settings.get('disqus_short_code')
                post['muted'] = False
                post['comment_count'] = 0
                post['disqus_thread_id_str'] = ''
                post['sort_score'] = 0.0
                post['downvotes'] = 0
                post['hackpad_url'] = ''
                post['date_created'] = datetime.datetime.now()
                post['user'] = user_info.user
                post['votes'] = 1
                post['voted_users'] = [user_info.user]
                #save it
                saved_post = postsdb.insert_post(post)
                print "new post"

                # send notification to customer.io
                # if post is in a topic
                if saved_post.topic_slug != "":
                    topic = topicsdb.get_topic_by_slug(saved_post.topic_slug)
                    data ={
                        'topic_name': topic.name,
                        'post_author': saved_post.user.username,
                        'post_title': saved_post.title,
                        'post_permalink': saved_post.permalink(),
                        'post_id': str(saved_post.id)
                    }
                    # find topic followers
                    followers = userdb.get_followers(topic.slug)
                    # for each follower, ping customer.io about this post.
                    for follower in followers:
                        cio.track(customer_id=follower.user.username, name='new_post_notification', **data)

            else:
                # this is an existing post.
                print "existing post"
                # attempt to edit the post (make sure they are the author)
                saved_post = postsdb.get_post_by_slug(post['slug'])
                if saved_post:
                    if self.current_user == saved_post['user']['screen_name'] or self.current_user_can('edit_posts'):
                        # looks good - let's update the saved_post values to new values
                        for key in post.keys():
                            saved_post[key] = post[key]
                        # finally let's save the updates
                        postsdb.save_post(saved_post)
                        msg = 'success'
                if saved_post and self.current_user == saved_post['user']['screen_name']:
                    # looks good - let's update the saved_post values to new values
                    saved_post.set_fields(**post)
                    # finally let's save the updates
                    saved_post.save()
                    msg = 'success'
            
            #
            # From here on out, we have a saved_post, which is a mongoengine Post object.
            #
            # log any @ mentions in the post
            mentions = re.findall(r'@([^\s]+)', saved_post.body_raw)
            for mention in mentions:
                mentionsdb.add_mention(mention.lower(), saved_post.slug)

        if is_edit:
            self.set_secure_cookie('flash', 'Edited!')
            self.redirect(saved_post.permalink())
        else:
            self.set_secure_cookie('flash', 'Nice one!')
            self.redirect(saved_post.permalink())