def save(self, user, forum): topic = Topic(title=self.title.data) post = Post(content=self.content.data) if self.track_topic.data: user.track_topic(topic) return topic.save(user=user, forum=forum, post=post)
def save(self, user, forum): topic = Topic(title=self.title.data, content=self.content.data) if self.track_topic.data: user.track_topic(topic) else: user.untrack_topic(topic) current_app.pluggy.hook.flaskbb_form_topic_save(form=self, topic=topic) return topic.save(user=user, forum=forum)
def test_topic_merge_other_forum(topic): """You cannot merge a topic with a topic from another forum.""" forum_other = Forum(title="Test Forum 2", category_id=1) forum_other.save() topic_other = Topic(title="Test Topic 2") post_other = Post(content="Test Content 2") topic_other.save(user=topic.user, forum=forum_other, post=post_other) assert not topic.merge(topic_other)
def create_test_data(): """ Creates 5 users, 2 categories and 2 forums in each category. It also opens a new topic topic in each forum with a post. """ create_default_groups() create_default_settings() # create 5 users for u in range(1, 6): username = "******" % u email = "*****@*****.**" % u user = User(username=username, password="******", email=email) user.primary_group_id = u user.save() user1 = User.query.filter_by(id=1).first() user2 = User.query.filter_by(id=2).first() # create 2 categories for i in range(1, 3): category_title = "Test Category %s" % i category = Category(title=category_title, description="Test Description") category.save() # create 2 forums in each category for j in range(1, 3): if i == 2: j += 2 forum_title = "Test Forum %s %s" % (j, i) forum = Forum(title=forum_title, description="Test Description", category_id=i) forum.save() # create a topic topic = Topic() post = Post() topic.title = "Test Title %s" % j post.content = "Test Content" topic.save(post=post, user=user1, forum=forum) # create a second post in the forum post = Post() post.content = "Test Post" post.save(user=user2, topic=topic)
def get(self, topic_id, slug=None): page = request.args.get("page", 1, type=int) # Fetch some information about the topic topic = Topic.get_topic(topic_id=topic_id, user=real(current_user)) # Count the topic views topic.views += 1 topic.save() # Update the topicsread status if the user hasn't read it forumsread = None if current_user.is_authenticated: forumsread = ForumsRead.query.filter_by( user_id=current_user.id, forum_id=topic.forum_id).first() topic.update_read(real(current_user), topic.forum, forumsread) # fetch the posts in the topic posts = Post.query.outerjoin(User, Post.user_id == User.id).filter( Post.topic_id == topic.id).add_entity(User).order_by( Post.id.asc()).paginate(page, flaskbb_config["POSTS_PER_PAGE"], False) # Abort if there are no posts on this page if len(posts.items) == 0: abort(404) return render_template("forum/topic.html", topic=topic, posts=posts, last_seen=time_diff(), form=self.form())
def create_test_data(): create_default_groups() create_default_settings() # create 5 users for u in range(1, 6): username = "******" % u email = "*****@*****.**" % u user = User(username=username, password="******", email=email) user.primary_group_id = u user.save() user1 = User.query.filter_by(id=1).first() user2 = User.query.filter_by(id=2).first() # create 2 categories for i in range(1, 3): category_title = "Test Category %s" % i category = Category(title=category_title, description="Test Description") category.save() # create 2 forums in each category for j in range(1, 3): if i == 2: j += 2 forum_title = "Test Forum %s %s" % (j, i) forum = Forum(title=forum_title, description="Test Description", category_id=i) forum.save() # create a topic topic = Topic() post = Post() topic.title = "Test Title %s" % j post.content = "Test Content" topic.save(post=post, user=user1, forum=forum) # create a second post in the forum post = Post() post.content = "Test Post" post.save(user=user2, topic=topic)
def test_topic_save(forum, user): """Test the save topic method with creating and editing a topic.""" post = Post(content="Test Content") topic = Topic(title="Test Title") assert forum.last_post_id is None assert forum.post_count == 0 assert forum.topic_count == 0 topic.save(forum=forum, post=post, user=user) assert topic.title == "Test Title" topic.title = "Test Edit Title" topic.save() assert topic.title == "Test Edit Title" # The first post in the topic is also the last post assert topic.first_post_id == post.id assert topic.last_post_id == post.id assert forum.last_post_id == post.id assert forum.post_count == 1 assert forum.topic_count == 1
def test_topic_merge(topic): """Tests the topic merge method.""" topic_other = Topic(title="Test Topic Merge") post = Post(content="Test Content Merge") topic_other.save(post=post, user=topic.user, forum=topic.forum) # Save the last_post_id in another variable because topic_other will be # overwritten later last_post_other = topic_other.last_post_id assert topic_other.merge(topic) # I just want to be sure that the topic is deleted topic_other = Topic.query.filter_by(id=topic_other.id).first() assert topic_other is None assert topic.post_count == 2 assert topic.last_post_id == last_post_other
def test_topic_save(forum, normal_user): post = Post(content="Test Content") topic = Topic(title="Test Title") assert forum.last_post_id is None assert forum.post_count == 0 assert forum.topic_count == 0 topic.save(forum=forum, post=post, user=normal_user) assert topic.title == "Test Title" # The first post in the topic is also the last post assert topic.first_post_id == post.id assert topic.last_post_id == post.id assert forum.last_post_id == post.id assert forum.post_count == 1 assert forum.topic_count == 1
def create_test_data(): create_default_groups() # create 5 users for u in range(1, 6): username = "******" % u email = "*****@*****.**" % u user = User(username=username, password="******", email=email) user.primary_group_id = u user.save() # create a category category = Forum(is_category=True, title="Test Category", description="Test Description") category.save() # create 2 forums in the category for i in range(1, 3): forum_title = "Test Forum %s " % i forum = Forum(title=forum_title, description="Test Description", parent_id=category.id) forum.save() # Create a subforum subforum_title = "Test Subforum %s " % i subforum = Forum(title=subforum_title, description="Test Description", parent_id=forum.id) subforum.save() user = User.query.filter_by(id=1).first() # create 1 topic in each forum for i in range(2, 6): # Forum ids are not sequential because categories. forum = Forum.query.filter_by(id=i).first() topic = Topic() post = Post() topic.title = "Test Title %s" % (i-1) post.content = "Test Content" topic.save(user=user, forum=forum, post=post)
def create_welcome_forum(): """This will create the `welcome forum` with a welcome topic.""" if User.query.count() < 1: raise "You need to create the admin user first!" user = User.query.filter_by(id=1).first() category = Category(title="My Category", position=1) category.save() forum = Forum(title="Welcome", description="Your first forum", category_id=category.id) forum.save() topic = Topic(title="Welcome!") post = Post(content="Have fun with your new FlaskBB Forum!") topic.save(user=user, forum=forum, post=post)
def save(self, user, forum): image_name = secure_filename(self.img_name.data.filename) image_name = "{}_{}".format(get_md5(self.content.data), image_name) topic = Topic(title=self.title.data, content=self.content.data, img_name=image_name) # topic = Topic(title=self.title.data, content=self.content.data) self.img_name.data.save( os.path.join(current_app.config["UPLOAD_COVERAGE_SAVE_DIR"], image_name)) if self.track_topic.data: user.track_topic(topic) else: user.untrack_topic(topic) current_app.pluggy.hook.flaskbb_form_topic_save(form=self, topic=topic) return topic.save(user=user, forum=forum)
def create_welcome_forum(): """This will create the `welcome forum` with a welcome topic. Returns True if it's created successfully. """ if User.query.count() < 1: return False user = User.query.filter_by(id=1).first() category = Category(title="My Category", position=1) category.save() forum = Forum(title="Welcome", description="Your first forum", category_id=category.id) forum.save() topic = Topic(title="Welcome!") post = Post(content="Have fun with your new FlaskBB Forum!") topic.save(user=user, forum=forum, post=post) return True
def create_welcome_forum(): """ This will create the `welcome forum` that nearly every forum software has after the installation process is finished """ if User.query.count() < 1: raise "You need to create the admin user first!" user = User.query.filter_by(id=1).first() category = Category(title="My Category", position=1) category.save() forum = Forum(title="Welcome", description="Your first forum", category_id=category.id) forum.save() topic = Topic(title="Welcome!") post = Post(content="Have fun with your new FlaskBB Forum!") topic.save(user=user, forum=forum, post=post)
def insert_mass_data(topics=100, posts=100): """Creates a few topics in the first forum and each topic has a few posts. WARNING: This might take very long! Returns the count of created topics and posts. :param topics: The amount of topics in the forum. :param posts: The number of posts in each topic. """ user1 = User.query.filter_by(id=1).first() user2 = User.query.filter_by(id=2).first() forum = Forum.query.filter_by(id=1).first() created_posts = 0 created_topics = 0 if not (user1 or user2 or forum): return False # create 1000 topics for i in range(1, topics + 1): # create a topic topic = Topic() post = Post() topic.title = "Test Title %s" % i post.content = "Test Content" topic.save(post=post, user=user1, forum=forum) created_topics += 1 # create 100 posts in each topic for j in range(1, posts + 1): post = Post() post.content = "Test Post" post.save(user=user2, topic=topic) created_posts += 1 return created_topics, created_posts
def insert_mass_data(): """ Creates 100 topics in the first forum and each topic has 100 posts. """ user1 = User.query.filter_by(id=1).first() user2 = User.query.filter_by(id=2).first() forum = Forum.query.filter_by(id=1).first() # create 1000 topics for i in range(1, 101): # create a topic topic = Topic() post = Post() topic.title = "Test Title %s" % i post.content = "Test Content" topic.save(post=post, user=user1, forum=forum) # create 100 posts in each topic for j in range(1, 100): post = Post() post.content = "Test Post" post.save(user=user2, topic=topic)
def seed_topics(): f = open("{}/{}/meme_threads.txt".format(PROJECT_DIR, DATA_DIR), 'r') memes = f.read().split('\n') forum = Forum.query.filter(Forum.id == MEME_FORUM_ID).all()[0] text_model = utils.load_model(model_fname()) users = User.query.all() for meme in memes[48:]: user = random.choice(users) if len(meme) > 1: title = meme url = google_scraper.run(100, title + " meme") post_content = "![]({})".format(url) post_content += "\n" post_content += "\n" post_content += text_model.make_sentence() rand_val = random.random() if rand_val > 0.6: title += " meme" post = Post(content=post_content) topic = Topic(title=title) topic.save(user=user, forum=forum, post=post)
def post(self, topic_id, slug=None): topic = Topic.get_topic(topic_id=topic_id, user=real(current_user)) form = self.form() if not form: flash(_("Cannot post reply"), "warning") return redirect(topic.url) elif form.validate_on_submit(): post = form.save(real(current_user), topic) return redirect(post.url) else: for e in form.errors.get("content", []): flash(e, "danger") return redirect(topic.url)
def post(self, topic_id, slug=None): topic = Topic.get_topic(topic_id=topic_id, user=real(current_user)) form = self.form() if not form: flash(_('Cannot post reply'), 'warning') return redirect('forum.view_topic', topic_id=topic_id, slug=slug) elif form.validate_on_submit(): post = form.save(real(current_user), topic) return redirect(url_for('forum.view_post', post_id=post.id)) else: for e in form.errors.get('content', []): flash(e, 'danger') return redirect(url_for('forum.view_topic', topic_id=topic_id, slug=slug))
def post(self, topic_id, slug=None): topic = Topic.get_topic(topic_id=topic_id, user=real(current_user)) form = self.form() if not form: flash(_("Cannot post reply"), "warning") return redirect("forum.view_topic", topic_id=topic_id, slug=slug) elif form.validate_on_submit(): post = form.save(real(current_user), topic) return redirect(url_for("forum.view_post", post_id=post.id)) else: for e in form.errors.get("content", []): flash(e, "danger") return redirect( url_for("forum.view_topic", topic_id=topic_id, slug=slug) )
def view_topic(topic_id, slug=None): page = request.args.get('page', 1, type=int) # Fetch some information about the topic topic = Topic.get_topic(topic_id=topic_id, user=current_user) # Count the topic views topic.views += 1 topic.save() # fetch the posts in the topic posts = Post.query.\ join(User, Post.user_id == User.id).\ filter(Post.topic_id == topic.id).\ add_entity(User).\ order_by(Post.id.asc()).\ paginate(page, flaskbb_config['POSTS_PER_PAGE'], False) # Abort if there are no posts on this page if len(posts.items) == 0: abort(404) # Update the topicsread status if the user hasn't read it forumsread = None if current_user.is_authenticated: forumsread = ForumsRead.query.\ filter_by(user_id=current_user.id, forum_id=topic.forum.id).first() topic.update_read(current_user, topic.forum, forumsread) form = None if Permission(CanPostReply): form = QuickreplyForm() if form.validate_on_submit(): post = form.save(current_user, topic) return view_post(post.id) return render_template("forum/topic.html", topic=topic, posts=posts, last_seen=time_diff(), form=form)
def get(self, topic_id, slug=None): page = request.args.get("page", 1, type=int) # Fetch some information about the topic topic = Topic.get_topic(topic_id=topic_id, user=real(current_user)) # Count the topic views topic.views += 1 topic.save() # Update the topicsread status if the user hasn't read it forumsread = None if current_user.is_authenticated: forumsread = ForumsRead.query.filter_by( user_id=current_user.id, forum_id=topic.forum_id).first() topic.update_read(real(current_user), topic.forum, forumsread) # fetch the posts in the topic posts = Post.query.outerjoin( User, Post.user_id == User.id ).filter( Post.topic_id == topic.id ).add_entity( User ).order_by( Post.id.asc() ).paginate(page, flaskbb_config["POSTS_PER_PAGE"], False) # Abort if there are no posts on this page if len(posts.items) == 0: abort(404) return render_template( "forum/topic.html", topic=topic, posts=posts, last_seen=time_diff(), form=self.form() )
def view_topic(topic_id, slug=None): page = request.args.get('page', 1, type=int) # Fetch some information about the topic topic = Topic.get_topic(topic_id=topic_id, user=current_user) # Count the topic views topic.views += 1 topic.save() # fetch the posts in the topic posts = Post.query.\ outerjoin(User, Post.user_id == User.id).\ filter(Post.topic_id == topic.id).\ add_entity(User).\ order_by(Post.id.asc()).\ paginate(page, flaskbb_config['POSTS_PER_PAGE'], False) # Abort if there are no posts on this page if len(posts.items) == 0: abort(404) # Update the topicsread status if the user hasn't read it forumsread = None if current_user.is_authenticated: forumsread = ForumsRead.query.\ filter_by(user_id=current_user.id, forum_id=topic.forum.id).first() topic.update_read(current_user, topic.forum, forumsread) form = None if Permission(CanPostReply): form = QuickreplyForm() if form.validate_on_submit(): post = form.save(current_user, topic) return view_post(post.id) return render_template("forum/topic.html", topic=topic, posts=posts, last_seen=time_diff(), form=form)
def post(self, topic_id, slug=None): topic = Topic.get_topic(topic_id=topic_id, user=real(current_user)) form = self.form() if not form: flash(_("Cannot post reply"), "warning") return redirect("forum.view_topic", topic_id=topic_id, slug=slug) elif form.validate_on_submit(): try: post = form.save(real(current_user), topic) return redirect(url_for("forum.view_post", post_id=post.id)) except StopNewPost as e: flash(e.reason, "danger") except BaseFlaskBBError as e: flask(e.reason, "warning") except Exception: flash(_("Unrecoverable error while posting reply")) else: for e in form.errors.get("content", []): flash(e, "danger") return self.get(topic_id=topic_id, slug=slug)
def topic(forum, user): """A topic by a normal user without any extra permissions.""" topic = Topic(title="Test Topic Normal") post = Post(content="Test Content Normal") return topic.save(forum=forum, user=user, post=post)
def insert_bulk_data(topic_count=10, post_count=100): """Creates a specified number of topics in the first forum with each topic containing a specified amount of posts. Returns the number of created topics and posts. :param topics: The amount of topics in the forum. :param posts: The number of posts in each topic. """ user1 = User.query.filter_by(id=1).first() user2 = User.query.filter_by(id=2).first() forum = Forum.query.filter_by(id=1).first() last_post = Post.query.order_by(Post.id.desc()).first() last_post_id = 1 if last_post is None else last_post.id created_posts = 0 created_topics = 0 posts = [] if not (user1 or user2 or forum): return False db.session.begin(subtransactions=True) for i in range(1, topic_count + 1): last_post_id += 1 # create a topic topic = Topic(title="Test Title %s" % i) post = Post(content="First Post") topic.save(post=post, user=user1, forum=forum) created_topics += 1 # create some posts in the topic for j in range(1, post_count + 1): last_post_id += 1 post = Post(content="Some other Post", user=user2, topic=topic.id) topic.last_updated = post.date_created topic.post_count += 1 # FIXME: Is there a way to ignore IntegrityErrors? # At the moment, the first_post_id is also the last_post_id. # This does no harm, except that in the forums view, you see # the information for the first post instead of the last one. # I run a little benchmark: # 5.3643078804 seconds to create 100 topics and 10000 posts # Using another method (where data integrity is ok) I benchmarked # these stats: # 49.7832770348 seconds to create 100 topics and 10000 posts # Uncomment the line underneath and the other line to reduce # performance but fixes the above mentioned problem. #topic.last_post_id = last_post_id created_posts += 1 posts.append(post) # uncomment this and delete the one below, also uncomment the # topic.last_post_id line above. This will greatly reduce the # performance. #db.session.bulk_save_objects(posts) db.session.bulk_save_objects(posts) # and finally, lets update some stats forum.recalculate(last_post=True) user1.recalculate() user2.recalculate() return created_topics, created_posts
def create_test_data(users=5, categories=2, forums=2, topics=1, posts=1): """Creates 5 users, 2 categories and 2 forums in each category. It also creates a new topic topic in each forum with a post. Returns the amount of created users, categories, forums, topics and posts as a dict. :param users: The number of users. :param categories: The number of categories. :param forums: The number of forums which are created in each category. :param topics: The number of topics which are created in each forum. :param posts: The number of posts which are created in each topic. """ create_default_groups() create_default_settings() data_created = {'users': 0, 'categories': 0, 'forums': 0, 'topics': 0, 'posts': 0} # create 5 users for u in range(1, users + 1): username = "******" % u email = "*****@*****.**" % u user = User(username=username, password="******", email=email) user.primary_group_id = u user.activated = True user.save() data_created['users'] += 1 user1 = User.query.filter_by(id=1).first() user2 = User.query.filter_by(id=2).first() # lets send them a few private messages for i in range(1, 3): # TODO pass # create 2 categories for i in range(1, categories + 1): category_title = "Test Category %s" % i category = Category(title=category_title, description="Test Description") category.save() data_created['categories'] += 1 # create 2 forums in each category for j in range(1, forums + 1): if i == 2: j += 2 forum_title = "Test Forum %s %s" % (j, i) forum = Forum(title=forum_title, description="Test Description", category_id=i) forum.save() data_created['forums'] += 1 for t in range(1, topics + 1): # create a topic topic = Topic(title="Test Title %s" % j) post = Post(content="Test Content") topic.save(post=post, user=user1, forum=forum) data_created['topics'] += 1 for p in range(1, posts + 1): # create a second post in the forum post = Post(content="Test Post") post.save(user=user2, topic=topic) data_created['posts'] += 1 return data_created
def topic_moderator(forum, moderator_user): """A topic by a user with moderator permissions.""" topic = Topic(title="Test Topic Moderator") post = Post(content="Test Content Moderator") return topic.save(forum=forum, user=moderator_user, post=post)
def save(self, user, forum): topic = Topic(title=self.title.data) post = Post(content=self.content.data) return topic.save(user=user, forum=forum, post=post)
def topic_locked(forum, user): """A locked topic by a user with normal permissions.""" topic = Topic(title="Test Topic Locked") topic.locked = True post = Post(content="Test Content Locked") return topic.save(forum=forum, user=user, post=post)
def topic_normal(forum, normal_user): topic = Topic(title="Test Topic Normal") post = Post(content="Test Content Normal") return topic.save(forum=forum, user=normal_user, post=post)
def topic_in_locked_forum(forum_locked, user): """A locked topic by a user with normal permissions.""" topic = Topic(title="Test Topic Forum Locked") post = Post(content="Test Content Forum Locked") return topic.save(forum=forum_locked, user=user, post=post)
def createall(): """ Creates the database with some example content. """ # Just for testing purposes dbfile = os.path.join(Config._basedir, "flaskbb.sqlite") if os.path.exists(dbfile): os.remove(dbfile) db.create_all() groups = OrderedDict(( ('Administrator', { 'description': 'The Administrator Group', 'admin': True, 'super_mod': False, 'mod': False, 'banned': False, 'guest': False, 'editpost': True, 'deletepost': True, 'deletetopic': True, 'posttopic': True, 'postreply': True, 'viewtopic': True, 'viewprofile': True }), ('Super Moderator', { 'description': 'The Super Moderator Group', 'admin': False, 'super_mod': True, 'mod': False, 'banned': False, 'guest': False, 'editpost': True, 'deletepost': True, 'deletetopic': True, 'posttopic': True, 'postreply': True, 'viewtopic': True, 'viewprofiles': True }), ('Moderator', { 'description': 'The Moderator Group', 'admin': False, 'super_mod': False, 'mod': True, 'banned': False, 'guest': False, 'editpost': True, 'deletepost': True, 'deletetopic': True, 'posttopic': True, 'postreply': True, 'viewtopic': True, 'viewprofile': True }), ('Member', { 'description': 'The Member Group', 'admin': False, 'super_mod': False, 'mod': False, 'banned': False, 'guest': False, 'editpost': True, 'deletepost': False, 'deletetopic': False, 'posttopic': True, 'postreply': True, 'viewtopic': True, 'viewprofile': True }), ('Banned', { 'description': 'The Banned Group', 'admin': False, 'super_mod': False, 'mod': False, 'banned': True, 'guest': False, 'editpost': False, 'deletepost': False, 'deletetopic': False, 'posttopic': False, 'postreply': False, 'viewtopic': False, 'viewprofile': False }), ('Guest', { 'description': 'The Guest Group', 'admin': False, 'super_mod': False, 'mod': False, 'banned': False, 'guest': True, 'editpost': False, 'deletepost': False, 'deletetopic': False, 'posttopic': False, 'postreply': False, 'viewtopic': False, 'viewprofile': False }) )) # create 5 groups for key, value in groups.items(): group = Group(name=key) for k, v in value.items(): setattr(group, k, v) db.session.add(group) db.session.commit() # create 5 users groups = Group.query.all() for u in range(1, 6): username = "******" % u email = "*****@*****.**" % u user = User(username=username, password="******", email=email) user.secondary_groups.append(groups[u-1]) user.primary_group_id = u db.session.add(user) db.session.commit() # create 2 categories for i in range(1, 3): category_title = "Test Category %s" % i category = Forum(is_category=True, title=category_title, description="Test Description") db.session.add(category) # create 2 forums in each category for j in range(1, 3): if i == 2: j += 2 forum_title = "Test Forum %s %s" % (j, i) forum = Forum(title=forum_title, description="Test Description", parent_id=i) db.session.add(forum) db.session.commit() # create 1 topic in each forum for k in [2, 3, 5, 6]: # Forum ids are not sequential because categories. topic = Topic() first_post = Post() topic.title = "Test Title %s" % k topic.user_id = 1 topic.forum_id = k db.session.add(topic) db.session.commit() first_post.content = "Test Content" first_post.user_id = 1 first_post.topic_id = topic.id db.session.add(first_post) db.session.commit() # Invalidate relevant caches topic.invalidate_cache() topic.forum.invalidate_cache() # create 2 additional posts for each topic for m in range(1, 3): post = Post(content="Test Post", user_id=2, topic_id=k) db.session.add(post) db.session.commit() # Update the post count post.user.invalidate_cache() topic.invalidate_cache() topic.forum.invalidate_cache() db.session.commit() db.session.commit()
def topic_moderator(forum, moderator_user): topic = Topic(title="Test Topic Moderator") post = Post(content="Test Content Moderator") return topic.save(forum=forum, user=moderator_user, post=post)