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)
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)
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')
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")
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)
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')
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')
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)
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
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)
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)
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'])
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, )
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'])
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())