[IMP] improved url's and controller in order to represent forum as multi-forum

bzr revid: tpa@tinyerp.com-20140304104930-5tk6upw78pu2egos
This commit is contained in:
Turkesh Patel (Open ERP) 2014-03-04 16:19:30 +05:30
parent ff9833efdc
commit 782b4acaf3
3 changed files with 98 additions and 59 deletions

View File

@ -35,8 +35,23 @@ from openerp.addons.website.controllers.main import Website as controllers
controllers = controllers()
class website_forum(http.Controller):
@http.route(['/forum/', '/forum/page/<int:page>'], type='http', auth="public", website=True, multilang=True)
def questions(self, page=1, **searches):
@http.route(['/forum/'], type='http', auth="public", website=True, multilang=True)
def forum(self, **searches):
cr, uid, context = request.cr, request.uid, request.context
forum_obj = request.registry['website.forum']
obj_ids = forum_obj.search(cr, uid, [], context=context)
forum_ids = forum_obj.browse(cr, uid, obj_ids, context=context)
values = {
'forum_ids': forum_ids,
'searches': {},
}
return request.website.render("website_forum.forum_index", values)
@http.route(['/forum/<model("website.forum"):forum>/', '/forum/<model("website.forum"):forum>/page/<int:page>'], type='http', auth="public", website=True, multilang=True)
def questions(self, forum, page=1, **searches):
cr, uid, context = request.cr, request.uid, request.context
forum_obj = request.registry['website.forum.post']
user_obj = request.registry['res.users']
@ -58,7 +73,7 @@ class website_forum(http.Controller):
step = 10
question_count = forum_obj.search(cr, uid, domain, count=True, context=context)
pager = request.website.pager(url="/forum/", total=question_count, page=page, step=step, scope=10)
pager = request.website.pager(url="/forum/%s/" % forum.id, total=question_count, page=page, step=step, scope=10)
obj_ids = forum_obj.search(cr, uid, domain, limit=step, offset=pager['offset'], context=context)
question_ids = forum_obj.browse(cr, uid, obj_ids, context=context)
@ -67,6 +82,7 @@ class website_forum(http.Controller):
values = {
'total_questions': question_count,
'question_ids': question_ids,
'forum': forum,
'pager': pager,
'searches': searches,
}
@ -78,23 +94,25 @@ class website_forum(http.Controller):
values = { 'searches': {}, 'forum':forum }
return request.website.render("website_forum.faq", values)
@http.route(['/forum/ask'], type='http', auth="public", website=True, multilang=True)
def question_ask(self, **post):
@http.route(['/forum/<model("website.forum"):forum>/ask'], type='http', auth="public", website=True, multilang=True)
def question_ask(self, forum, **post):
values = {
'searches': {}
'searches': {},
'forum': forum
}
return request.website.render("website_forum.ask_question", values)
@http.route(['/forum/question/<model("website.forum.post"):question>/page/<page:page>'], type='http', auth="public", website=True, multilang=True)
def question(self, question, page, **post):
@http.route(['/forum/<model("website.forum"):forum>/question/<model("website.forum.post"):question>/page/<page:page>'], type='http', auth="public", website=True, multilang=True)
def question(self, forum, question, page, **post):
values = {
'question': question,
'main_object': question
'main_object': question,
'forum': forum
}
return request.website.render(page, values)
@http.route(['/forum/question/<model("website.forum.post"):question>'], type='http', auth="public", website=True, multilang=True)
def open_question(self, question, **post):
@http.route(['/forum/<model("website.forum"):forum>/question/<model("website.forum.post"):question>'], type='http', auth="public", website=True, multilang=True)
def open_question(self, forum, question, **post):
answer_done = False
for answer in question.child_ids:
if answer.create_uid.id == request.uid:
@ -103,12 +121,13 @@ class website_forum(http.Controller):
'question': question,
'main_object': question,
'searches': post,
'answer_done': answer_done
'answer_done': answer_done,
'forum': forum,
}
return request.website.render("website_forum.post_description_full", values)
@http.route(['/forum/user/<model("res.users"):user>'], type='http', auth="public", website=True, multilang=True)
def open_user(self, user, **post):
@http.route(['/forum/<model("website.forum"):forum>/user/<model("res.users"):user>'], type='http', auth="public", website=True, multilang=True)
def open_user(self, forum, user, **post):
answers = {}
for answer in user.answer_ids:
answers[answer.parent_id] = True
@ -116,27 +135,28 @@ class website_forum(http.Controller):
'user': user,
'main_object': user,
'searches': post,
'forum': forum,
'answers': answers.keys()
}
return request.website.render("website_forum.user_detail_full", values)
@http.route('/forum/question/ask/', type='http', auth="user", multilang=True, methods=['POST'], website=True)
def register_question(self, forum_id=1, **question):
@http.route('/forum/<model("website.forum"):forum>/question/ask/', type='http', auth="user", multilang=True, methods=['POST'], website=True)
def register_question(self, forum, **question):
cr, uid, context = request.cr, request.uid, request.context
create_context = dict(context)
new_question_id = request.registry['website.forum.post'].create(
request.cr, request.uid, {
#'forum_id': forum_id,
'forum_id': forum.id,
'name': question.get('question_name'),
'content': question.get('question_content'),
#'tags' : question.get('question_tags'),
'state': 'active',
'active': True,
}, context=create_context)
return werkzeug.utils.redirect("/forum/question/%s" % new_question_id)
return werkzeug.utils.redirect("/forum/%s/question/%s" % (forum.id,new_question_id))
@http.route('/forum/question/postanswer/', type='http', auth="user", multilang=True, methods=['POST'], website=True)
def post_answer(self, post_id, forum_id=1, **question):
@http.route('/forum/<model("website.forum"):forum>/question/postanswer/', type='http', auth="user", multilang=True, methods=['POST'], website=True)
def post_answer(self, forum ,post_id, **question):
# TODO: set forum on user to True
cr, uid, context = request.cr, request.uid, request.context
request.registry['res.users'].write(cr, uid, uid, {'forum': True}, context=context)
@ -144,16 +164,16 @@ class website_forum(http.Controller):
create_context = dict(context)
new_question_id = request.registry['website.forum.post'].create(
request.cr, request.uid, {
#'forum_id': forum_id,
'forum_id': forum.id,
'parent_id': post_id,
'content': question.get('answer_content'),
'state': 'active',
'active': True,
}, context=create_context)
return werkzeug.utils.redirect("/forum/question/%s" % post_id)
return werkzeug.utils.redirect("/forum/%s/question/%s" % (forum.id,post_id))
@http.route(['/forum/question/editanswer'], type='http', auth="user", website=True, multilang=True)
def edit_answer(self, post_id, **kwargs):
@http.route(['/forum/<model("website.forum"):forum>/question/editanswer'], type='http', auth="user", website=True, multilang=True)
def edit_answer(self, forum, post_id, **kwargs):
cr, uid, context = request.cr, request.uid, request.context
request.registry['res.users'].write(cr, uid, uid, {'forum': True}, context=context)
post = request.registry['website.forum.post'].browse(cr, uid, int(post_id), context=context)
@ -163,22 +183,23 @@ class website_forum(http.Controller):
values = {
'post': post,
'post_answer': post_answer,
'forum': forum,
'searches': kwargs
}
return request.website.render("website_forum.edit_answer", values)
@http.route('/forum/question/saveanswer/', type='http', auth="user", multilang=True, methods=['POST'], website=True)
def save_edited_answer(self, forum_id=1, **post):
@http.route('/forum/<model("website.forum"):forum>/question/saveanswer/', type='http', auth="user", multilang=True, methods=['POST'], website=True)
def save_edited_answer(self, forum, **post):
cr, uid, context = request.cr, request.uid, request.context
request.registry['res.users'].write(cr, uid, uid, {'forum': True}, context=context)
answer_id = int(post.get('answer_id'))
new_question_id = request.registry['website.forum.post'].write( cr, uid, [answer_id], {
'content': post.get('answer_content'),
}, context=context)
return werkzeug.utils.redirect("/forum/question/%s" % post.get('post_id'))
return werkzeug.utils.redirect("/forum/%s/question/%s" % (forum.id,post.get('post_id')))
@http.route(['/forum/tag/<model("website.forum.tag"):tag>'], type='http', auth="public", website=True, multilang=True)
def tag_questions(self, tag, page=1, **kwargs):
@http.route(['/forum/<model("website.forum"):forum>/tag/<model("website.forum.tag"):tag>'], type='http', auth="public", website=True, multilang=True)
def tag_questions(self, forum, tag, page=1, **kwargs):
cr, uid, context = request.cr, request.uid, request.context
step = 10
pager = request.website.pager(url="/forum/", total=len(tag.post_ids), page=page, step=step, scope=10)
@ -186,25 +207,27 @@ class website_forum(http.Controller):
values = {
'question_ids': tag.post_ids,
'pager': pager,
'forum': forum,
'searches': kwargs
}
return request.website.render("website_forum.index", values)
@http.route(['/forum/tags'], type='http', auth="public", website=True, multilang=True)
def tags(self, page=1, **searches):
@http.route(['/forum/<model("website.forum"):forum>/tags'], type='http', auth="public", website=True, multilang=True)
def tags(self, forum, page=1, **searches):
cr, uid, context = request.cr, request.uid, request.context
tag_obj = request.registry['website.forum.tag']
obj_ids = tag_obj.search(cr, uid, [], limit=None, context=context)
tags = tag_obj.browse(cr, uid, obj_ids, context=context)
values = {
'tags': tags,
'forum': forum,
'searches': {}
}
return request.website.render("website_forum.tag", values)
@http.route(['/forum/users', '/forum/users/page/<int:page>'], type='http', auth="public", website=True, multilang=True)
def users(self, page=1, **searches):
@http.route(['/forum/<model("website.forum"):forum>/users', '/forum/users/page/<int:page>'], type='http', auth="public", website=True, multilang=True)
def users(self, forum, page=1, **searches):
cr, uid, context = request.cr, request.uid, request.context
user_obj = request.registry['res.users']
@ -219,6 +242,7 @@ class website_forum(http.Controller):
values = {
'users': users,
'pager': pager,
'forum': forum,
'searches': searches,
}

View File

@ -32,8 +32,7 @@ class Forum(osv.Model):
_name = 'website.forum'
_description = 'Forums'
_inherit = ['mail.thread', 'website.seo.metadata']
_order = 'name'
_columnss = {
_columns = {
'name': fields.char('Name', required=True, translate=True),
'faq': fields.html('FAQ'),
'right_column': fields.html('FAQ'),

View File

@ -26,7 +26,8 @@
name="Footer Questions Link">
<xpath expr="//footer//ul[@name='products']" position="inside">
<li>
<a href="/forum">Q&amp;A</a>
<!--TODO: remove static id -->
<a href="/forum/1">Q&amp;A</a>
</li>
</xpath>
</template>
@ -46,17 +47,17 @@
</div>
<div style="margin-left: 95px;">
<div class="question-name">
<a t-attf-href="/forum/question/#{ slug(question) }" t-field="question.name"/>
<a t-attf-href="/forum/#{ forum.id }/question/#{ slug(question) }" t-field="question.name"/>
</div>
<div class="text-muted">
by <a t-attf-href="/forum/user/#{ question.create_uid.id }" t-field="question.create_uid"/>,
by <a t-attf-href="/forum/#{ forum.id }/user/#{ question.create_uid.id }" t-field="question.create_uid"/>,
on <span t-field="question.write_date"/>
<div t-if="len(question.vote_ids)">
<strong>with <span t-esc="len(question.vote_ids)"/> votes</strong>
</div>
</div>
<t t-foreach="question.tags" t-as="tag">
<a t-attf-href="/forum/tag/#{ tag.id }" class="badge" t-field="tag.name"/>
<a t-attf-href="/forum/#{ forum.id }/tag/#{ tag.id }" class="badge" t-field="tag.name"/>
</t>
</div>
</div>
@ -87,19 +88,19 @@
<div class="collapse navbar-collapse" id="oe-help-navbar-collapse">
<ul class="nav navbar-nav">
<li>
<a href="/forum">Questions</a>
<a t-attf-href="/forum/#{ forum.id }">Questions</a>
</li>
<li t-att-class="searches.get('users') and 'active' or '' ">
<a href="/forum/users">People</a>
<a t-attf-href="/forum/#{ forum.id }/users">People</a>
</li>
<li t-att-class="searches.get('tags') and 'active' or '' ">
<a href="/forum/tags">Tags</a>
<a t-attf-href="/forum/#{ forum.id }/tags">Tags</a>
</li>
<li t-att-class="searches.get('badge') and 'active' or '' ">
<a href="/forum/badge">Badges</a>
<a t-attf-href="/forum/#{ forum.id }/badge">Badges</a>
</li>
</ul>
<form class="navbar-form navbar-right" role="search" action="/forum/" method="get">
<form class="navbar-form navbar-right" role="search" t-attf-action="/forum/#{ forum.id }" method="get">
<div class="form-group">
<input type="search" class="form-control"
name="search" placeholder="Search a question..."
@ -117,11 +118,11 @@
<div class="alert alert-success alert-dismissable">
<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&amp;times;</button>
<strong>Congratulation!</strong> You received the <em>New Author</em> badge!<br/>
<a href="/forum/badge" class="fa fa-arrow-right">View Your Badges</a>
<a t-attf-href="/forum/#{ forum.id }/badge" class="fa fa-arrow-right">View Your Badges</a>
</div>
<t t-raw="0"/>
</div><div class="col-sm-3" id="right-column">
<a class="btn btn-primary btn-lg btn-block mb16" href="/forum/ask">Ask a Question</a>
<a class="btn btn-primary btn-lg btn-block mb16" t-attf-href="/forum/#{ forum.id }/ask">Ask a Question</a>
<div class="panel panel-default">
<div class="panel-heading">
@ -130,7 +131,7 @@
<div class="panel-body">
This community is for professional and enthusiast about our
products and services.<br/>
<a href="/forum/faq" class="fa fa-arrow-right"> Read Guidelines</a>
<a t-attf-href="/forum/#{ forum.id }/faq" class="fa fa-arrow-right"> Read Guidelines</a>
</div>
</div>
@ -140,9 +141,24 @@
</t>
</template>
<template id="index">
<t t-call="website_forum.faq">
<div t-field="forum.faq"/>
<template id="faq">
<t t-call="website_forum.header">
<!--TODO: Improve template -->
<div>
<h1>F.A.Q</h1>
</div>
</t>
</template>
<template id="forum_index">
<t t-call="website.layout">
<!--TODO: Improve template -->
<t t-foreach="forum_ids" t-as="forum">
<a t-attf-href="/forum/#{ forum.id }" class="box oe_green" t-field="forum.name"/>
</t>
<!--t t-call="website_forum.faq">
<div t-field="forum.faq"/>
</t-->
</t>
</template>
@ -161,13 +177,13 @@
<ul class="dropdown-menu">
<li class="dropdown-header">Filter on</li>
<li t-att-class="searches.get('type') == 'all' and 'active' or '' ">
<a t-attf-href="/forum/?{{ keep_query( type='all') }}">All</a>
<a t-attf-href="/forum/#{ forum.id }/?{{ keep_query( type='all') }}">All</a>
</li>
<li t-att-class="searches.get('type') == 'unanswered' and 'active' or '' ">
<a t-attf-href="/forum/?{{ keep_query( type='unanswered') }}">Unanswered</a>
<a t-attf-href="/forum/#{ forum.id }/?{{ keep_query( type='unanswered') }}">Unanswered</a>
</li>
<li t-att-class="searches.get('type') == 'followed' and 'active' or '' ">
<a t-attf-href="/forum/?{{ keep_query( type='followed') }}">Followed</a>
<a t-attf-href="/forum/#{ forum.id }/?{{ keep_query( type='followed') }}">Followed</a>
</li>
<li class="dropdown-header">Sort by</li>
<li>
@ -204,7 +220,7 @@
<div>
<span t-field="user.image" t-field-options='{"widget": "image", "class":"pull-left img img-circle img-avatar"}' />
<div>
<a t-attf-href="/forum/user/#{ slug(user) }" t-field="user.name"/>
<a t-attf-href="/forum/#{ forum.id }/user/#{ slug(user) }" t-field="user.name"/>
<t t-raw="separator or ', '"/>
<b>11 badges:</b>
<span class="fa fa-certificate badge-gold"></span>
@ -236,7 +252,7 @@
</li>
</ul>
<form action="/forum/question/ask/" method="post" role="form">
<form t-attf-action="/forum/#{ forum.id }/question/ask/" method="post" role="form">
<div class="col-xs-12">
<input type="text" name="question_name" required="True"
t-attf-value="#{question_name or ''}" id="textbox_user_question"
@ -292,7 +308,7 @@
</div>
</div>
<div class="row">
<form action="/forum/question/postanswer/" method="post" role="form">
<form t-attf-action="/forum/#{ forum.id }/question/postanswer/" method="post" role="form">
<div class="col-xs-12">
<div class="row">
<div class="col-xs-12">
@ -325,7 +341,7 @@
<h3>Edit answer</h3>
</div>
<div class="row">
<form action="/forum/question/saveanswer/" method="post" role="form">
<form t-attf-action="/forum/#{ forum.id }/question/saveanswer/" method="post" role="form">
<div >
<div class="row">
<div class="col-xs-12">
@ -376,7 +392,7 @@
<div class="mt16 clearfix">
<div class="pull-right">
<t t-foreach="question.tags" t-as="tag">
<a t-attf-href="/forum/tag/#{ tag.id }" class="badge" t-field="tag.name"/>
<a t-attf-href="/forum/#{ forum.id }/tag/#{ tag.id }" class="badge" t-field="tag.name"/>
</t>
</div>
<t t-set="user" t-value="question.create_uid"/>
@ -440,7 +456,7 @@
</h1>
<div class="row">
<div class="col-sm-3 mt16" t-foreach="tags" t-as="tag">
<a t-attf-href="/forum/tag/#{ slug(tag) }" class="badge">
<a t-attf-href="/forum/#{ forum.id }/tag/#{ slug(tag) }" class="badge">
<span t-field="tag.name" />
</a>
<span>