Exemple #1
0
    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))
Exemple #2
0
 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)))
Exemple #3
0
    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}
Exemple #4
0
 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)))
Exemple #5
0
 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)))
Exemple #6
0
    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)
Exemple #7
0
 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))
Exemple #8
0
 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))
Exemple #10
0
    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)
Exemple #11
0
 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)
Exemple #12
0
 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)
Exemple #13
0
 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))
Exemple #14
0
 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"))
Exemple #15
0
 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)))
Exemple #16
0
 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)
Exemple #17
0
 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
Exemple #18
0
 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)))
Exemple #19
0
 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)
Exemple #20
0
    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)))
Exemple #21
0
 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)))
Exemple #22
0
 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)
Exemple #23
0
 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
Exemple #24
0
    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)))
Exemple #25
0
    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)
Exemple #26
0
 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}
Exemple #27
0
    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))
Exemple #28
0
 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}
Exemple #29
0
    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)
Exemple #30
0
    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')
        ]