def post_create(self, forum, post_parent=None, **post): if post.get('content', '') == '<p><br></p>': return request.render( 'http_routing.http_error', { 'status_code': _('Bad Request'), 'status_message': post_parent and _('Reply should not be empty.') or _('Question should not be empty.') }) post_tag_ids = forum._tag_to_write_vals(post.get('post_tags', '')) if request.env.user.forum_waiting_posts_count: return werkzeug.utils.redirect("/forum/%s/ask" % slug(forum)) new_question = request.env['forum.post'].create({ 'forum_id': forum.id, 'name': post.get('post_name') or (post_parent and 'Re: %s' % (post_parent.name or '')) or '', 'content': post.get('content', False), 'parent_id': post_parent and post_parent.id or False, 'tag_ids': post_tag_ids }) return werkzeug.utils.redirect( "/forum/%s/%s" % (slug(forum), post_parent and slug(post_parent) or new_question.id))
def convert_comment_to_answer(self, forum, post, comment, **kwarg): post = request.env['forum.post'].convert_comment_to_answer(comment.id) if not post: return werkzeug.utils.redirect("/forum/%s" % slug(forum)) question = post.parent_id if post.parent_id else post return werkzeug.utils.redirect("/forum/%s/question/%s" % (slug(forum), slug(question)))
def sitemap_partners(env, rule, qs): if not qs or qs.lower() in '/partners': yield {'loc': '/partners'} Grade = env['res.partner.grade'] dom = [('website_published', '=', True), ('website_ids', 'in', request.website.id)] dom += sitemap_qs2dom(qs=qs, route='/partners/grade/', field=Grade._rec_name) for grade in env['res.partner.grade'].search(dom): loc = '/partners/grade/%s' % slug(grade) if not qs or qs.lower() in loc: yield {'loc': loc} partners_dom = [('is_company', '=', True), ('grade_id', '!=', False), ('website_published', '=', True), ('website_ids', 'in', request.website.id), ('grade_id.website_published', '=', True)] dom += sitemap_qs2dom(qs=qs, route='/partners/country/') countries = env['res.partner'].sudo().read_group( partners_dom, fields=['id', 'country_id'], groupby='country_id') for country in countries: loc = '/partners/country/%s' % slug(country['country_id']) if not qs or qs.lower() in loc: yield {'loc': loc}
def question_edit_answer(self, forum, question, **kwargs): for record in question.child_ids: if record.create_uid.id == request.uid: answer = record break return werkzeug.utils.redirect("/forum/%s/post/%s/edit" % (slug(forum), slug(answer)))
def convert_answer_to_comment(self, forum, post, **kwarg): question = post.parent_id new_msg = post.convert_answer_to_comment() if not new_msg: return werkzeug.utils.redirect("/forum/%s" % slug(forum)) return werkzeug.utils.redirect("/forum/%s/question/%s" % (slug(forum), slug(question)))
def question(self, forum, question, **post): # Hide posts from abusers (negative karma), except for moderators if not question.can_view: raise werkzeug.exceptions.NotFound() # Hide pending posts from non-moderators and non-creator user = request.env.user if question.state == 'pending' and user.karma < forum.karma_post and question.create_uid != user: raise werkzeug.exceptions.NotFound() # increment view counter question.sudo().set_viewed() if question.parent_id: redirect_url = "/forum/%s/question/%s" % (slug(forum), slug(question.parent_id)) return werkzeug.utils.redirect(redirect_url, 301) filters = 'question' values = self._prepare_forum_values(forum=forum, searches=post) values.update({ 'main_object': question, 'question': question, 'can_bump': (question.forum_id.allow_bump and not question.child_ids and (datetime.today() - datetime.strptime(question.write_date, tools.DEFAULT_SERVER_DATETIME_FORMAT)).days > 9), 'header': {'question_data': True}, 'filters': filters, 'reversed': reversed, }) return request.render("website_forum.post_description_full", values)
def post_delete(self, forum, post, **kwargs): question = post.parent_id post.unlink() if question: werkzeug.utils.redirect("/forum/%s/question/%s" % (slug(forum), slug(question))) return werkzeug.utils.redirect("/forum/%s" % slug(forum))
def forum_create(self, forum_name="New Forum", forum_mode="questions", forum_privacy="public", forum_privacy_group=False, add_menu=False): forum = { 'name': forum_name, 'mode': forum_mode, 'privacy': forum_privacy, 'website_id': request.website.id, } if forum_privacy == 'private' and forum_privacy_group: forum['authorized_group_id'] = forum_privacy_group forum_id = request.env['forum.forum'].create(forum) if add_menu: group = [int(forum_privacy_group) ] if forum_privacy == 'private' else [ request.env.ref('base.group_portal').id, request.env.ref('base.group_user').id ] menu_id = request.env['website.menu'].create({ 'name': forum_name, 'url': "/forum/%s" % slug(forum_id), 'parent_id': request.website.menu_id.id, 'website_id': request.website.id, 'group_ids': [(6, 0, group)] }) forum_id.menu_id = menu_id return "/forum/%s" % slug(forum_id)
def _compute_website_url(self): super(EventMeetingRoom, self)._compute_website_url() for meeting_room in self: if meeting_room.id: base_url = meeting_room.event_id.get_base_url() meeting_room.website_url = '%s/event/%s/meeting_room/%s' % ( base_url, slug(meeting_room.event_id), slug(meeting_room))
def questions(self, forum, tag=None, page=1, filters='all', sorting=None, search='', post_type=None, **post): Post = request.env['forum.post'] domain = [('forum_id', '=', forum.id), ('parent_id', '=', False), ('state', '=', 'active')] if search: domain += ['|', ('name', 'ilike', search), ('content', 'ilike', search)] if tag: domain += [('tag_ids', 'in', tag.id)] if filters == 'unanswered': domain += [('child_ids', '=', False)] elif filters == 'followed': domain += [('message_partner_ids', '=', request.env.user.partner_id.id)] if post_type: domain += [('post_type', '=', post_type)] if sorting: # check that sorting is valid # retro-compatibily for V8 and google links try: Post._generate_order_by(sorting, None) except ValueError: sorting = False if not sorting: sorting = forum.default_order question_count = Post.search_count(domain) if tag: url = "/forum/%s/tag/%s/questions" % (slug(forum), slug(tag)) else: url = "/forum/%s" % slug(forum) url_args = { 'sorting': sorting } if search: url_args['search'] = search if filters: url_args['filters'] = filters pager = request.website.pager(url=url, total=question_count, page=page, step=self._post_per_page, scope=self._post_per_page, url_args=url_args) question_ids = Post.search(domain, limit=self._post_per_page, offset=pager['offset'], order=sorting) values = self._prepare_forum_values(forum=forum, searches=post, header={'ask_hide': not forum.active}) values.update({ 'main_object': tag or forum, 'question_ids': question_ids, 'question_count': question_count, 'pager': pager, 'tag': tag, 'filters': filters, 'sorting': sorting, 'search': search, 'post_type': post_type, }) return request.render("website_forum.forum_index", values)
def post_mark_as_offensive(self, forum, post, **kwargs): post.mark_as_offensive(reason_id=int(kwargs.get('reason_id', False))) url = '' if post.parent_id: url = "/forum/%s/question/%s/#answer-%s" % (slug(forum), post.parent_id.id, post.id) else: url = "/forum/%s/question/%s" % (slug(forum), slug(post)) return werkzeug.utils.redirect(url)
def post_accept(self, forum, post): url = "/forum/%s/validation_queue" % (slug(forum)) if post.state == 'flagged': url = "/forum/%s/flagged_queue" % (slug(forum)) elif post.state == 'offensive': url = "/forum/%s/offensive_posts" % (slug(forum)) post.validate() return werkzeug.utils.redirect(url)
def open_partner(self, forum, partner_id=0, **post): if partner_id: partner = request.env['res.partner'].sudo().search([('id', '=', partner_id)]) if partner and partner.user_ids: return werkzeug.utils.redirect( "/forum/%s/user/%d" % (slug(forum), partner.user_ids[0].id)) return werkzeug.utils.redirect("/forum/%s" % slug(forum))
def _compute_survey_url(self): """ Computes a public URL for the survey """ base_url = '/' if self.env.context.get('relative_url') else \ self.env['ir.config_parameter'].sudo().get_param('web.base.url') for survey in self: survey.public_url = urls.url_join(base_url, "survey/start/%s" % (slug(survey))) survey.print_url = urls.url_join(base_url, "survey/print/%s" % (slug(survey))) survey.result_url = urls.url_join(base_url, "survey/results/%s" % (slug(survey))) survey.public_url_html = '<a href="%s">%s</a>' % (survey.public_url, _("Click here to start survey"))
def post_comment(self, forum, post, **kwargs): question = post.parent_id if post.parent_id else post if kwargs.get('comment') and post.forum_id.id == forum.id: # TDE FIXME: check that post_id is the question or one of its answers body = tools.mail.plaintext2html(kwargs['comment']) post.with_context(mail_create_nosubscribe=True).message_post( body=body, message_type='comment', subtype='mt_comment') return werkzeug.utils.redirect("/forum/%s/question/%s" % (slug(forum), slug(question)))
def forum_create(self, forum_name="New Forum", add_menu=False): forum_id = request.env['forum.forum'].create({'name': forum_name}) if add_menu: request.env['website.menu'].create({ 'name': forum_name, 'url': "/forum/%s" % slug(forum_id), 'parent_id': request.website.menu_id.id, 'website_id': request.website.id, }) return "/forum/%s" % slug(forum_id)
def _get_menu_entries(self): self.ensure_one() res = super(Event, self)._get_menu_entries() if self.website_track: res += [(_('Talks'), '/event/%s/track' % slug(self), False), (_('Agenda'), '/event/%s/agenda' % slug(self), False)] if self.website_track_proposal: res += [(_('Talk Proposals'), '/event/%s/track_proposal' % slug(self), False)] return res
def blog_post_create(self, blog_id, **post): new_blog_post = request.env['blog.post'].create({ 'blog_id': blog_id, 'website_published': False, }) return werkzeug.utils.redirect( "/blog/%s/post/%s?enable_editor=1" % (slug(new_blog_post.blog_id), slug(new_blog_post)))
def old_blog_post(self, blog, blog_post, tag_id=None, page=1, enable_editor=None, **post): # Compatibility pre-v14 return request.redirect(_build_url_w_params( "/blog/%s/%s" % (slug(blog), slug(blog_post)), request.params), code=301)
def blog_post_copy(self, blog_post_id, **post): """ Duplicate a blog. :param blog_post_id: id of the blog post currently browsed. :return redirect to the new blog created """ new_blog_post = request.env['blog.post'].with_context( mail_create_nosubscribe=True).browse(int(blog_post_id)).copy() return werkzeug.utils.redirect( "/blog/%s/post/%s?enable_editor=1" % (slug(new_blog_post.blog_id), slug(new_blog_post)))
def post_save(self, forum, post, **kwargs): if 'post_name' in kwargs and not kwargs.get('post_name').strip(): return request.render('website.http_error', {'status_code': _('Bad Request'), 'status_message': _('Title should not be empty.')}) post_tags = forum._tag_to_write_vals(kwargs.get('post_tags', '')) vals = { 'tag_ids': post_tags, 'name': kwargs.get('post_name'), 'content': kwargs.get('content'), 'content_link': kwargs.get('content_link'), } post.write(vals) question = post.parent_id if post.parent_id else post return werkzeug.utils.redirect("/forum/%s/question/%s" % (slug(forum), slug(question)))
def forum_post(self, forum, post_type=None, **post): user = request.env.user if post_type not in ['question', 'link', 'discussion']: # fixme: make dynamic return werkzeug.utils.redirect('/forum/%s' % slug(forum)) if not user.email or not tools.single_email_re.match(user.email): return werkzeug.utils.redirect( "/forum/%s/user/%s/edit?email_required=1" % (slug(forum), request.session.uid)) values = self._prepare_forum_values(forum=forum, searches={}, header={'ask_hide': True}) return request.render("website_forum.new_%s" % post_type, values)
def _compute_website_url(self): super(Slide, self)._compute_website_url() base_url = self.env['ir.config_parameter'].sudo().get_param('web.base.url') for slide in self: if slide.id: # avoid to perform a slug on a not yet saved record in case of an onchange. # link_tracker is not in dependencies, so use it to shorten url only if installed. if self.env.registry.get('link.tracker'): url = self.env['link.tracker'].sudo().create({ 'url': '%s/slides/slide/%s' % (base_url, slug(slide)), 'title': slide.name, }).short_url else: url = '%s/slides/slide/%s' % (base_url, slug(slide)) slide.website_url = url
def blog_post_create(self, blog_id, **post): # Use sudo so this line prevents both editor and admin to access blog from another website # as browse() will return the record even if forbidden by security rules but editor won't # be able to access it if not request.env['blog.blog'].browse( blog_id).sudo().can_access_from_current_website(): raise werkzeug.exceptions.NotFound() new_blog_post = request.env['blog.post'].create({ 'blog_id': blog_id, 'is_published': False, }) return werkzeug.utils.redirect( "/blog/%s/%s?enable_editor=1" % (slug(new_blog_post.blog_id), slug(new_blog_post)))
def users(self, forum, page=1, **searches): User = request.env['res.users'] step = 30 tag_count = User.sudo().search_count([('karma', '>', 1), ('website_published', '=', True), ('website_ids', 'in', request.website.id)]) pager = request.website.pager(url="/forum/%s/users" % slug(forum), total=tag_count, page=page, step=step, scope=30) user_obj = User.sudo().search( [('karma', '>', 1), ('website_published', '=', True), ('website_ids', 'in', request.website.id)], limit=step, offset=pager['offset'], order='karma DESC') # put the users in block of 3 to display them as a table users = [[] for i in range(len(user_obj) // 3 + 1)] for index, user in enumerate(user_obj): users[index // 3].append(user) searches['users'] = 'True' values = self._prepare_forum_values(forum=forum, searches=searches) values.update({ 'users': users, 'main_object': forum, 'notifications': self._get_notifications(), 'pager': pager, }) return request.render("website_forum.users", values)
def sitemap_forum(env, rule, qs): Forum = env['forum.forum'] dom = sitemap_qs2dom(qs, '/forum', Forum._rec_name) for f in Forum.search(dom): loc = '/forum/%s' % slug(f) if not qs or qs.lower() in loc: yield {'loc': loc}
def save_edited_profile(self, forum, user, **kwargs): values = { 'name': kwargs.get('name'), 'website': kwargs.get('website'), 'email': kwargs.get('email'), 'city': kwargs.get('city'), 'country_id': int(kwargs.get('country')) if kwargs.get('country') else False, 'website_description': kwargs.get('description'), } if 'clear_image' in kwargs: values['image'] = False elif kwargs.get('ufile'): image = kwargs.get('ufile').read() values['image'] = base64.b64encode(image) if request.uid == user.id: # the controller allows to edit only its own privacy settings; use partner management for other cases if kwargs.get('website_published') == 'True': values['website_ids'] = [(4, request.website.id)] else: values['website_ids'] = [(3, request.website.id)] user.write(values) return werkzeug.utils.redirect("/forum/%s/user/%d" % (slug(forum), user.id))
def sitemap_slide(env, rule, qs): Channel = env['slide.channel'] dom = sitemap_qs2dom(qs=qs, route='/slides/', field=Channel._rec_name) for channel in Channel.search(dom): loc = '/slides/%s' % slug(channel) if not qs or qs.lower() in loc: yield {'loc': loc}
def thread_headers(self, group, page=1, mode='thread', date_begin=None, date_end=None, **post): if group.channel_type != 'channel': raise werkzeug.exceptions.NotFound() Message = request.env['mail.message'] domain = [('model', '=', 'mail.channel'), ('res_id', '=', group.id), ('message_type', '!=', 'notification')] if mode == 'thread': domain += [('parent_id', '=', False)] if date_begin and date_end: domain += [('date', '>=', date_begin), ('date', '<=', date_end)] pager = request.website.pager( url='/groups/%s' % slug(group), total=Message.search_count(domain), page=page, step=self._thread_per_page, url_args={'mode': mode, 'date_begin': date_begin or '', 'date_end': date_end or ''}, ) messages = Message.search(domain, limit=self._thread_per_page, offset=pager['offset']) values = { 'messages': messages, 'group': group, 'pager': pager, 'mode': mode, 'archives': self._get_archives(group.id), 'date_begin': date_begin, 'date_end': date_end, 'replies_per_page': self._replies_per_page, } return request.render('website_mail_channel.group_messages', values)
def _get_track_menu_entries(self): """ Method returning menu entries to display on the website view of the event, possibly depending on some options in inheriting modules. Each menu entry is a tuple containing : * name: menu item name * url: if set, url to a route (do not use xml_id in that case); * xml_id: template linked to the page (do not use url in that case); * menu_type: key linked to the menu, used to categorize the created website.event.menu; """ self.ensure_one() return [ (_('Talks'), '/event/%s/track' % slug(self), False, 10, 'track'), (_('Agenda'), '/event/%s/agenda' % slug(self), False, 70, 'track') ]