def validate_blog_post(self, req, postname, version, fields): if 'blog-preview' in req.args: return [] blog_res = Resource('blog', postname, version) if req.perm(blog_res).has_permission('BLOG_ADMIN'): return [] if version > 1: bp = BlogPost(self.env, postname, version) last_post_fields = bp._fetch_fields(version=version - 1) else: last_post_fields = {} field_names = set(fields).union(last_post_fields) changes = [] for field in field_names: old = to_unicode(last_post_fields.get(field, '')) new = to_unicode(fields.get(field, '')) if new and old != new: changes.append((old, new)) author = fields.get('author', '') if arity(FilterSystem.test) == 4: # 0.11 compatible method signature FilterSystem(self.env).test(req, author, changes) else: # 0.12+ compatible that adds an 'ip' argument FilterSystem(self.env).test(req, author, changes, req.remote_addr) return []
def blog_comment_added(self, postname, number): action = 'post_comment_added' blog_post = BlogPost(self.env, postname, 0) bc = BlogComment(self.env, postname, number) notifier = FullBlogNotificationEmail(self.env) notifier.notify(blog_post, action, blog_post.version, bc.time, bc.comment, bc.author)
def test_single_post(self): PermissionSystem(self.env).grant_permission('user', 'BLOG_VIEW') bp = BlogPost(self.env, 'first_post') bp.update_fields(fields={ 'title': 'First Post', 'author': 'user', 'body': 'First body' }) self.assertEquals([], bp.save('user')) req = Mock(method='GET', base_path='', cgi_location='', path_info='/blog', href=Href('/trac'), args={}, chrome={}, perm=PermissionCache(self.env, 'user'), authname='user') module = FullBlogModule(self.env) assert module.match_request(req) template, data, _ = module.process_request(req) self.assertEqual(1, data['blog_total']) self.assertEqual(1, len(data['blog_post_list'])) self.assertEqual('First Post', data['blog_post_list'][0].title)
def blog_post_changed(self, postname, version): if version > 1: action = 'post_updated' else: action = 'post_created' blog_post = BlogPost(self.env, postname, version) notifier = FullBlogNotificationEmail(self.env) notifier.notify(blog_post, action, version, blog_post.version_time, blog_post.version_comment, blog_post.version_author)
def blog_comment_added(self, postname, number): """Called when Blog comment number N on post 'postname' is added.""" blog_post = BlogPost(self.env, postname, 0) blog_comment = BlogComment(self.env, postname, number) announcer = AnnouncementSystem(self.env) announcer.send( BlogChangeEvent(blog_post, 'comment created', self.env.abs_href.blog(blog_post.name), blog_comment))
def test_create_post_missing_default_fields(self): PermissionSystem(self.env).grant_permission('user', 'BLOG_VIEW') core = FullBlogCore(self.env) req = Mock(method='GET', base_path='', cgi_location='', path_info='/blog', href=Href('/trac'), args={}, chrome={}, perm=PermissionCache(self.env, 'user'), authname='user') bp = BlogPost(self.env, 'about') warnings = core.create_post(req, bp, req.authname) self.assertEquals(warnings, [('title', 'Title is empty.'), ('body', 'Body is empty.'), ('author', 'Author is empty.')])
def test_create_post_missing_default_fields(self): PermissionSystem(self.env).grant_permission('user', 'BLOG_VIEW') core = FullBlogCore(self.env) req = MockRequest(self.env, method='GET', path_info='/blog', authname='user') bp = BlogPost(self.env, 'about') warnings = core.create_post(req, bp, req.authname) self.assertEquals(warnings, [('title', 'Title is empty.'), ('body', 'Body is empty.'), ('author', 'Author is empty.')])
def check_permission(self, action, username, resource, perm): """ Will block access if the resource points to a draft blog post, and the user is different from the author. Any other variation is just passed on to be handled by regular permission checks. """ if not resource: return if resource.realm == 'blog' and resource.id: the_post = BlogPost(self.env, resource.id, resource.version) for category in the_post.category_list: if category in self.draft and the_post.author != username: # Block all access regardless return False
def blog_comment_deleted(self, postname, number, fields): """Called when blog post comment 'number' is deleted. number==0 denotes all comments is deleted and fields will be empty. (usually follows a delete of the blog post). number>0 denotes a specific comment is deleted, and fields will contain the values of the fields as they existed pre-delete. """ blog_post = BlogPost(self.env, postname, 0) announcer = AnnouncementSystem(self.env) announcer.send( BlogChangeEvent(blog_post, 'comment deleted', self.env.abs_href.blog(blog_post.name), fields))
def blog_post_deleted(self, postname, version, fields): """Called when a blog post is deleted: version==0 means all versions (or last remaining) version is deleted. Any version>0 denotes a specific version only. Fields is a dict with the pre-existing values of the blog post. If all (or last) the dict will contain the 'current' version contents. """ blog_post = BlogPost(self.env, postname, version) announcer = AnnouncementSystem(self.env) announcer.send( BlogChangeEvent(blog_post, 'post deleted', self.env.abs_href.blog(blog_post.name)))
def blog_post_changed(self, postname, version): """Called when a new blog post 'postname' with 'version' is added. version==1 denotes a new post, version>1 is a new version on existing post. """ blog_post = BlogPost(self.env, postname, version) action = 'post created' if version > 1: action = 'post changed' announcer = AnnouncementSystem(self.env) announcer.send( BlogChangeEvent(blog_post, action, self.env.abs_href.blog(blog_post.name)))
def blog_post_deleted(self, postname, version, fields): if version > 0: action = 'post_deleted_version' else: action = 'post_deleted' blog_post = BlogPost(self.env, postname, version) # the post has already been deleted, so populate from fields # this is just so we can say which page was deleted blog_post.title = fields['title'] blog_post.author = fields['author'] author = fields['version_author'] time = datetime.datetime.now(utc) notifier = FullBlogNotificationEmail(self.env) notifier.notify(blog_post, action, version, time, '', author)
def test_create_post(self): PermissionSystem(self.env).grant_permission('user', 'BLOG_VIEW') core = FullBlogCore(self.env) req = Mock(method='GET', base_path='', cgi_location='', path_info='/blog', href=Href('/trac'), args={}, chrome={}, perm=PermissionCache(self.env, 'user'), authname='user') bp = BlogPost(self.env, 'about') bp.update_fields(fields={'title': 'test_create_post', 'author': 'user', 'body': 'First body'}) warnings = core.create_post(req, bp, req.authname) self.assertEquals(warnings, []) posts = get_blog_posts(self.env) self.assertEquals(1, len(posts)) self.assertEquals('test_create_post', posts[0][4])
def test_create_post(self): PermissionSystem(self.env).grant_permission('user', 'BLOG_VIEW') core = FullBlogCore(self.env) req = MockRequest(self.env, method='GET', path_info='/blog', authname='user') bp = BlogPost(self.env, 'about') bp.update_fields(fields={ 'title': 'test_create_post', 'author': 'user', 'body': 'First body' }) warnings = core.create_post(req, bp, req.authname) self.assertEquals(warnings, []) posts = get_blog_posts(self.env) self.assertEquals(1, len(posts)) self.assertEquals('test_create_post', posts[0][4])
def test_single_post(self): PermissionSystem(self.env).grant_permission('user', 'BLOG_VIEW') bp = BlogPost(self.env, 'first_post') bp.update_fields(fields={ 'title': 'First Post', 'author': 'user', 'body': 'First body' }) self.assertEquals([], bp.save('user')) req = MockRequest(self.env, method='GET', path_info='/blog', authname='user') module = FullBlogModule(self.env) self.assertTrue(module.match_request(req)) template, data, _ = module.process_request(req) self.assertEqual(1, data['blog_total']) self.assertEqual(1, len(data['blog_post_list'])) self.assertEqual('First Post', data['blog_post_list'][0].title)