def posts_housekeeping(): ''' goes through all posts, move 'old' posts to archive status, delete reeeeealy old posts. ''' time_now = now() archive_time = time_now - \ timedelta(days=config_var('posts.archive_after_days', 7)) delete_time = time_now - \ timedelta(days=config_var('posts.delete_after_days', 30)) # first delete really old posts: delete_count = 0 archive_count = 0 if config_var('posts.delete_when_old', True): for post in Post.select().where(Post.active_end < delete_time): delete_post_and_run_callback(post, post_types.load(post.type)) delete_count += 1 # next set old-ish posts to archived: if config_var('posts.archive_when_old', True): archive_count = Post.update(status=2) \ .where((Post.active_end < archive_time) & (Post.status != 2)) \ .execute() # And done. return jsonify({"deleted": delete_count, "archived": archive_count, "delete_before": delete_time, "archive_before": archive_time, "now": time_now})
def posts(): ''' (HTML) list of ALL posts. (also deletes broken posts, if error) ''' try: user = user_session.get_user() except user_session.NotLoggedIn: user = User() try: if user.is_admin: return render_template('posts.html', posts=Post.select(), user=user) else: return render_template('posts.html', posts=Post.select() \ .where(Post.status == 0), user=user) except Feed.DoesNotExist: # Ah. Database inconsistancy! Not good, lah. ps = Post.raw('select post.id from post' ' left join feed on feed.id = post.feed_id' ' where feed.id is null;') for p in ps: p.delete_instance() flash('Cleaned up old posts...') if user.is_admin: return render_template('posts.html', posts=Post.select(), user=user) else: return render_template('posts.html', posts=Post.select()\ .where(Post.status == 0), user=user)
def post_new_post_now(self): ''' check that things are cool now, whatever now is ''' self.login(USERNAME, USERPASS) with self.ctx(): resp = self.client.get(url_for('feedpage', feedid=self.feed.id)) self.assertEqual(resp.status_code, 200) self.assertIn(self.feed.name, resp.data) resp = self.client.post(url_for('post_new', feed_id=self.feed.id), data={"post_type":"html", "content": "{'content':'test'}", "active_start": models.now(), "active_end": models.now() + \ timedelta(minutes=1), }, follow_redirects=True) post = Post.get() post.publish(self.user) post.save() return post
def external_source_run(source_id): ''' use the importer specified to see if there is any new data, and if there is, then import it. ''' try: source = ExternalSource.get(id=source_id) except ExternalSource.DoesNotExist: return 'Invalid Source', 404 time_now = now() if user_session.is_admin() and request.form.get('force', 'no') == 'yes': flash("Update forced.") else: if source.last_checked: next_check = source.last_checked + timedelta( minutes=source.frequency) if next_check > time_now: return "Nothing to do. Last: {0}, Next: {1}, Now: {2} ".format( source.last_checked, next_check, time_now) module = external_source_types.load(source.type) settings_data = json.loads(source.settings) new_posts = module.get_new(settings_data) if new_posts: for fresh_data in new_posts: post = Post(type=fresh_data.get('type', 'html'), \ author=source.post_as_user) post_type_module = post_types.load(fresh_data.get('type', 'html')) post.feed = source.feed fresh_data['active_start'] = source.current_lifetime_start() fresh_data['active_end'] = source.current_lifetime_end() post_form_intake(post, fresh_data, post_type_module) post.display_time = source.display_time if source.publish: post.publisher = source.post_as_user post.publish_date = now() post.published = True post.save() # else, no new posts! oh well! source.settings = json.dumps(settings_data) source.last_checked = now() source.save() return 'Done!'
def feedsrss(ids_raw): ''' get a bunch of feeds posts as an RSS stream ''' ids = [] feed_names = [] for i in ids_raw.split(','): try: feedid = int(i) if feedid in ids: continue feed = Feed.get(id=feedid) ids.append(feedid) feed_names.append(feed.name) except ValueError: continue except Feed.DoesNotExist: continue time_now = now() feed_posts = [p for p in \ Post.select().join(Feed).where( (Feed.id << ids) &(Post.status == 0) &(Post.active_start < time_now) &(Post.active_end > time_now) &(Post.published) )] feed = RSSFeed() feed.feed["title"] = ",".join(feed_names) feed.feed["link"] = url_for('feeds') feed.feed["description"] = "Posts from " + (','.join(feed_names)) for post in feed_posts: contents = json.loads(post.content) cleantext = bleach.clean(contents["content"], tags=[], strip=True) if len(cleantext) > 20: cleantext = cleantext[0:20] + "..." item = { "title": cleantext, "description": contents["content"], "guid": str(post.id), } feed.items.append(item) resp = make_response(feed.format_rss2_string()) resp.headers["Content-Type"] = "application/xml" return resp
def external_source_run(source_id): ''' use the importer specified to see if there is any new data, and if there is, then import it. ''' try: source = ExternalSource.get(id=source_id) except ExternalSource.DoesNotExist: return 'Invalid Source', 404 time_now = now() if user_session.is_admin() and request.form.get('force', 'no') == 'yes': flash("Update forced.") else: if source.last_checked: next_check = source.last_checked + timedelta(minutes=source.frequency) if next_check > time_now: return "Nothing to do. Last: {0}, Next: {1}, Now: {2} ".format( source.last_checked, next_check, time_now) module = external_source_types.load(source.type) settings_data = json.loads(source.settings) new_posts = module.get_new(settings_data) if new_posts: for fresh_data in new_posts: post = Post(type=fresh_data.get('type', 'html'), \ author=source.post_as_user) post_type_module = post_types.load(fresh_data.get('type', 'html')) post.feed = source.feed fresh_data['active_start'] = source.current_lifetime_start() fresh_data['active_end'] = source.current_lifetime_end() post_form_intake(post, fresh_data, post_type_module) post.display_time = source.display_time if source.publish: post.publisher = source.post_as_user post.publish_date = now() post.published = True post.save() # else, no new posts! oh well! source.settings = json.dumps(settings_data) source.last_checked = now() source.save() return 'Done!'
def index(): ''' main front page / dashboard / index. ''' try: user = user_session.get_user() except user_session.NotLoggedIn as e: user = User() if not user: user = User() publishable_feeds = user.publishable_feeds() posts_to_publish = Post.select()\ .where((Post.published==False) & (Post.feed << publishable_feeds)) screens = Screen.select() aliases = config_var('screens.aliases', []) for alias in aliases: for screen in screens: if screen.urlname == alias['screen_name']: alias['screen'] = screen break else: alias['screen'] = None return render_template('dashboard.html', aliases=aliases, feeds=Feed.select(), publishable_feeds=publishable_feeds, posts=Post.select().where(Post.author == user)\ .order_by(Post.write_date.desc())\ .limit(15), posts_to_publish=posts_to_publish, screens=screens, user=user)
def index(): ''' main front page / dashboard / index. ''' try: user = user_session.get_user() except user_session.NotLoggedIn: user = User() if not user: user = User() publishable_feeds = user.publishable_feeds() posts_to_publish = Post.select()\ .where((Post.published == False) & (Post.feed << publishable_feeds)) screens = Screen.select() aliases = config_var('screens.aliases', []) for alias in aliases: for screen in screens: if screen.urlname == alias['screen_name']: alias['screen'] = screen break else: alias['screen'] = None return render_template('dashboard.html', aliases=aliases, feeds=Feed.select(), publishable_feeds=publishable_feeds, posts=Post.select().where(Post.author == user)\ .order_by(Post.write_date.desc())\ .limit(15), posts_to_publish=posts_to_publish, screens=screens, user=user)
def screens_posts_from_feeds(json_feeds_list): ''' send JSON list of the posts in whichever feeds you request (as a JS array [id,id,id] type list) ''' feeds_list = json.loads(json_feeds_list) time_now = now() posts = [{"id": p.id, "changed": p.write_date, "uri": url_for('json_post', postid=p.id)} for p in \ Post.select().join(Feed) .where((Feed.id << feeds_list) &(Post.status == 0) &(Post.active_start < time_now) &(Post.active_end > time_now) &(Post.published) )] return jsonify(posts=posts)
def get_new(data): ''' ok, actually go get us some new posts, alright? (return new posts, and update data with any hidden fields updated that we need to (current_posts, for instance))''' feed = feedparser.parse(data['url']) new_posts = [] templater = make_templater(data) for post in Post.select().where((Post.type == 'news')): delete_post_and_run_callback(post, post_types.load(post.type)) for entry in feed.entries: new_posts.append({ 'type': 'news', 'color': None, 'content': templater(entry) }) data['current_posts'] = [e.id for e in feed.entries] return new_posts
def user_edit(userid=-1): ''' edit one user. Admins can edit any user, but other users can only edit themselves. if userid is -1, create a new user. ''' try: current_user = user_session.get_user() except user_session.NotLoggedIn as e: flash("Sorry, you're not logged in!") return permission_denied("You're not logged in!") userid = int(userid) if userid != -1: try: user = User.get(id=userid) except User.DoesNotExist: return not_found(title="User doesn't exist", message="Sorry, that user does not exist!") else: if not current_user.is_admin: flash('Sorry! Only admins can create new users!') return permission_denied("Admins only!") try: user = User.get(loginname=request.form.get('loginname', '')) return permission_denied("Username already exists!") except peewee.DoesNotExist: pass user = User() #pylint: disable=no-value-for-parameter if request.method == 'POST': if current_user != user and not current_user.is_admin: return permission_denied("Sorry, you may not edit this user.") update_user(user, request.form, current_user) # save: try: user.save() if userid == -1: flash('New user created.') return redirect(url_for('user_edit', userid=user.id)) else: flash('Saved') except peewee.IntegrityError as err: flash('Cannot Save:' + str(err)) elif request.method == 'DELETE': if not current_user.is_admin: return 'Sorry, only admins can delete users', 403 if user.id == current_user.id: return 'Sorry! You cannot delete yourself!', 403 user.delete_instance(recursive=True) return 'User: %s deleted. (And all their posts)' % user.displayname users_posts = Post.select().where(Post.author == user) \ .order_by(Post.write_date.desc()) \ .limit(10) return render_template('user.html', allgroups=Group.select(), posts=users_posts, user=user)
def user_edit(userid=-1): ''' edit one user. Admins can edit any user, but other users can only edit themselves. if userid is -1, create a new user. ''' try: current_user = user_session.get_user() except user_session.NotLoggedIn as e: flash("Sorry, you're not logged in!") return permission_denied("You're not logged in!") userid = int(userid) if userid != -1: try: user = User.get(id=userid) except User.DoesNotExist: return not_found(title="User doesn't exist", message="Sorry, that user does not exist!") else: if not current_user.is_admin: flash('Sorry! Only admins can create new users!') return permission_denied("Admins only!") try: user = User.get(loginname=request.form['loginname']) return permission_denied("Username already exists!") except peewee.DoesNotExist: pass user = User() #pylint: disable=no-value-for-parameter if request.method == 'POST': if current_user != user and not current_user.is_admin: return permission_denied("Sorry, you may not edit this user.") update_user(user, request.form, current_user) # save: try: user.save() if userid == -1: flash('New user created.') return redirect(url_for('user_edit', userid=user.id)) else: flash('Saved') except peewee.IntegrityError as err: flash('Cannot Save:' + str(err)) elif request.method == 'DELETE': if not current_user.is_admin: return 'Sorry, only admins can delete users', 403 if user.id == current_user.id: return 'Sorry! You cannot delete yourself!', 403 user.delete_instance(recursive=True) return 'User: %s deleted. (And all their posts)' % user.displayname users_posts = Post.select().where(Post.author == user) \ .order_by(Post.write_date.desc()) \ .limit(10) return render_template('user.html', allgroups=Group.select(), posts=users_posts, user=user)
def post_new(feed_id): ''' create a new post! ''' #if not user_session.logged_in(): # flash("You're not logged in!") # return redirect(url_for('index')) user = user_session.get_user() try: feed = Feed.get(id=feed_id) except Feed.DoesNotExist: flash('Sorry, Feed does not exist!') return redirect(url_for('feeds')) if not feed.user_can_write(user): flash("Sorry! You don't have permission to write here!") return redirect(request.referrer if request.referrer else '/') if request.method == 'GET': # send a blank form for the user: post = Post() post.feed = feed # give list of available post types: all_posttypes = dict([(x['id'], x) for x in post_types.types()]) if post.feed.post_types: allowed_post_types = [] for post_type in post.feed.post_types_as_list(): if post_type in all_posttypes: allowed_post_types.append(all_posttypes[post_type]) else: allowed_post_types = list(all_posttypes.values()) # return the page: return render_template('postnew.html', current_feed=feed, post=post, user=user, post_types=allowed_post_types) else: # POST. new post! post_type = request.form.get('post_type') try: post_type_module = post_types.load(post_type) except: flash('Sorry! invalid post type.') return redirect(request.referrer if request.referrer else '/') if feed.post_types and post_type not in feed.post_types_as_list(): flash('sorry! this post type is not allowed in this feed!') return redirect(request.referrer if request.referrer else '/') post = Post(type=post_type, author=user) try: post.feed = feed if_i_cant_write_then_i_quit(post, user) post_form_intake(post, request.form, post_type_module) except PleaseRedirect as e: flash(str(e.msg)) return redirect(e.url if e.url else request.url) post.save() post.publish(user) # publish all posts by default flash('Saved!') return redirect(url_for('feedpage', feedid=post.feed.id))
def postpage(postid): ''' Edit a post. ''' if not user_session.logged_in(): flash("You're not logged in!") return redirect(url_for('posts')) try: post = Post.get(Post.id == postid) post_type_module = post_types.load(post.type) user = user_session.get_user() except Post.DoesNotExist: flash('Sorry! Post id:{0} not found!'.format(postid)) return redirect(url_for('posts')) if request.method == 'POST': try: # check for write permission, and if the post is # already published, publish permission. if_i_cant_write_then_i_quit(post, user) # if the user is allowed to set the feed to what they've # requested, then do it. post.feed = try_to_set_feed(post, request.form.get('post_feed', False), user) except PleaseRedirect as e: flash(str(e.msg)) redirect(e.url) # if it's a publish or delete request, handle that instead: action = request.form.get('action', 'edit') if action == 'delete': # don't need extra guards, as if_i_cant... deals with it above delete_post_and_run_callback(post, post_type_module) flash('Deleted') elif action == 'publish': try: post.publish(user) flash("Published") except PermissionDenied: flash("Sorry, you don't have permission to publish" " posts in this feed.") elif action == 'unpublish': try: post.publish(user, False) flash("Published!") except PermissionDenied: flash('Sorry, you do NOT have permission' \ ' to unpublish on this feed.') elif action == 'move': if not user_session.is_admin(): flash('Sorry! You are not an admin!') return jsonify({'error': 'permission denied'}) post.feed = Feed.get(Feed.id == getint('feed', post.feed)) post.save() return jsonify({'message': 'Moved to ' + post.feed.name}) if action not in ('edit', 'update'): return redirect(request.referrer if request.referrer else '/') # finally get around to editing the content of the post... try: post_form_intake(post, request.form, post_type_module) post.save() flash('Updated.') except Exception as e: flash('invalid content for this data type!') flash(str(e)) # Should we bother displaying 'Post' button, and editable controls # if the user can't write to this post anyway? #can_write, can_publish = can_user_write_and_publish(user, post) return render_template('post_editor.html', post=post, current_feed=post.feed.id, feedlist=user.writeable_feeds(), user=user, form_content=post_type_module.form( json.loads(post.content)))
def json_post(postid): try: return jsonify(Post.get(Post.id == postid).dict_repr()) except: return jsonify({"error": "Invalid Post ID"})
def post_new(feed_id): ''' create a new post! ''' if not user_session.logged_in(): flash("You're not logged in!") return redirect(url_for('index')) user = user_session.get_user() try: feed = Feed.get(id=feed_id) except Feed.DoesNotExist: flash('Sorry, Feed does not exist!') return redirect(url_for('feeds')) if not feed.user_can_write(user): flash("Sorry! You don't have permission to write here!") return redirect(request.referrer if request.referrer else '/') if request.method == 'GET': # send a blank form for the user: post = Post() post.feed = feed # give list of available post types: all_posttypes = dict([(x['id'], x) for x in post_types.types()]) if post.feed.post_types: allowed_post_types = [] for post_type in post.feed.post_types_as_list(): if post_type in all_posttypes: allowed_post_types.append(all_posttypes[post_type]) else: allowed_post_types = all_posttypes.values() # return the page: return render_template('postnew.html', current_feed=feed, post=post, user=user, post_types=allowed_post_types) else: # POST. new post! post_type = request.form.get('post_type') try: post_type_module = post_types.load(post_type) except: flash('Sorry! invalid post type.') return redirect(request.referrer if request.referrer else '/') if feed.post_types and post_type not in feed.post_types_as_list(): flash('sorry! this post type is not allowed in this feed!') return redirect(request.referrer if request.referrer else '/') post = Post(type=post_type, author=user) try: post.feed = feed if_i_cant_write_then_i_quit(post, user) post_form_intake(post, request.form, post_type_module) except PleaseRedirect as e: flash(str(e.msg)) return redirect(e.url if e.url else request.url) post.save() flash('Saved!') return redirect(url_for('feedpage', feedid=post.feed.id))
def postpage(postid): ''' Edit a post. ''' if not user_session.logged_in(): flash("You're not logged in!") return redirect(url_for('posts')) try: post = Post.get(Post.id == postid) post_type_module = post_types.load(post.type) user = user_session.get_user() except Post.DoesNotExist: flash('Sorry! Post id:{0} not found!'.format(postid)) return redirect(url_for('posts')) if request.method == 'POST': try: # check for write permission, and if the post is # already published, publish permission. if_i_cant_write_then_i_quit(post, user) # if the user is allowed to set the feed to what they've # requested, then do it. post.feed = try_to_set_feed(post, request.form.get('post_feed', False), user) except PleaseRedirect as e: flash(str(e.msg)) redirect(e.url) # if it's a publish or delete request, handle that instead: action = request.form.get('action', 'edit') if action == 'delete': # don't need extra guards, as if_i_cant... deals with it above delete_post_and_run_callback(post, post_type_module) flash('Deleted') elif action == 'publish': try: post.publish(user) flash("Published") except PermissionDenied: flash("Sorry, you don't have permission to publish" " posts in this feed.") elif action == 'unpublish': try: post.publish(user, False) flash("Published!") except PermissionDenied: flash('Sorry, you do NOT have permission' \ ' to unpublish on this feed.') elif action == 'move': if not user_session.is_admin(): flash('Sorry! You are not an admin!') return jsonify({'error': 'permission denied'}) post.feed = Feed.get(Feed.id == getint('feed', post.feed)) post.save() return jsonify({'message': 'Moved to ' + post.feed.name}) if action not in ('edit', 'update'): return redirect(request.referrer if request.referrer else '/') # finally get around to editing the content of the post... try: post_form_intake(post, request.form, post_type_module) post.save() flash('Updated.') except Exception as e: flash('invalid content for this data type!') flash(str(e)) # Should we bother displaying 'Post' button, and editable controls # if the user can't write to this post anyway? #can_write, can_publish = can_user_write_and_publish(user, post) return render_template('post_editor.html', post=post, current_feed=post.feed.id, feedlist=user.writeable_feeds(), user=user, form_content=post_type_module.form(json.loads(post.content)))