summaryrefslogtreecommitdiff
path: root/addons
diff options
context:
space:
mode:
authorJeremy Kersten <jke@odoo.com>2019-10-22 07:19:44 +0000
committerJeremy Kersten <jke@odoo.com>2019-10-28 10:36:56 +0000
commite19227d3ba9c9296bfc0c221ac70a863a571b9a6 (patch)
tree47130e9859ecb4dd2c60bbf5dede855fd6428c5c /addons
parente2176749f6774196c76955319c753f28e849942d (diff)
[IMP] website*: clean sitemap
From now, you need to explicitely add sitemap=True if you want your controller into the sitemap. It's the default value, but if you forgot it, it will raise a Warning on runbot. It will avoid wrong controller in sitemap and duplicate (empty) content. From now, if your model contains a field website_id, the modelConverter for sitemap will automatically add the domain: "[('website_id', 'in', (False, current_website_id))]" It avoid redundant declaration and ugly url in redirect/rewrite view. Migration: need to remove it from url_from in website.rewrite task-2065018 closes odoo/odoo#39427 Signed-off-by: Jérémy Kersten (jke) <jke@openerp.com>
Diffstat (limited to 'addons')
-rw-r--r--addons/project/controllers/rating.py2
-rw-r--r--addons/website/controllers/main.py4
-rw-r--r--addons/website/models/website.py10
-rw-r--r--addons/website_blog/controllers/main.py10
-rw-r--r--addons/website_event/controllers/main.py8
-rw-r--r--addons/website_event_track/controllers/main.py12
-rw-r--r--addons/website_forum/controllers/main.py7
-rw-r--r--addons/website_hr_recruitment/controllers/main.py4
-rw-r--r--addons/website_livechat/controllers/main.py5
-rw-r--r--addons/website_mail_channel/controllers/main.py6
-rw-r--r--addons/website_membership/controllers/main.py2
-rw-r--r--addons/website_profile/controllers/main.py4
-rw-r--r--addons/website_sale/controllers/main.py5
-rw-r--r--addons/website_slides/controllers/main.py6
14 files changed, 46 insertions, 39 deletions
diff --git a/addons/project/controllers/rating.py b/addons/project/controllers/rating.py
index b3af39a3d68..d910d88f367 100644
--- a/addons/project/controllers/rating.py
+++ b/addons/project/controllers/rating.py
@@ -9,7 +9,7 @@ from odoo.http import request
class RatingProject(http.Controller):
- @http.route(['/project/rating'], type='http', auth="public", website=True)
+ @http.route(['/project/rating'], type='http', auth="public", website=True, sitemap=True)
def index(self, **kw):
projects = request.env['project.project'].sudo().search([('rating_status', '!=', 'no'), ('portal_show_rating', '=', True)])
values = {'projects': projects}
diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py
index 32bee3fb203..d8368512d7a 100644
--- a/addons/website/controllers/main.py
+++ b/addons/website/controllers/main.py
@@ -65,7 +65,7 @@ class QueryURL(object):
class Website(Home):
- @http.route('/', type='http', auth="public", website=True)
+ @http.route('/', type='http', auth="public", website=True, sitemap=True)
def index(self, **kw):
homepage = request.website.homepage_id
if homepage and (homepage.sudo().is_visible or request.env.user.has_group('base.group_user')) and homepage.url != '/':
@@ -197,7 +197,7 @@ class Website(Home):
return request.make_response(content, [('Content-Type', mimetype)])
- @http.route('/website/info', type='http', auth="public", website=True)
+ @http.route('/website/info', type='http', auth="public", website=True, sitemap=True)
def website_info(self, **kwargs):
try:
request.website.get_template('website.website_info').name
diff --git a/addons/website/models/website.py b/addons/website/models/website.py
index 73e4e657b56..21ea95069b3 100644
--- a/addons/website/models/website.py
+++ b/addons/website/models/website.py
@@ -704,7 +704,7 @@ class Website(models.Model):
sitemap_endpoint_done = set()
for rule in router.iter_rules():
- if 'sitemap' in rule.endpoint.routing:
+ if 'sitemap' in rule.endpoint.routing and rule.endpoint.routing['sitemap'] is not True:
if rule.endpoint in sitemap_endpoint_done:
continue
sitemap_endpoint_done.add(rule.endpoint)
@@ -719,6 +719,10 @@ class Website(models.Model):
if not self.rule_is_enumerable(rule):
continue
+ if 'sitemap' not in rule.endpoint.routing:
+ logger.warning('No Sitemap value provided for controller %s (%s)' %
+ (rule.endpoint.method, ','.join(rule.endpoint.routing['routes'])))
+
converters = rule._converters or {}
if query_string and not converters and (query_string not in rule.build([{}], append_unknown=False)[1]):
continue
@@ -730,6 +734,9 @@ class Website(models.Model):
key=lambda x: (hasattr(x[1], 'domain') and (x[1].domain != '[]'), rule._trace.index((True, x[0]))))
for (i, (name, converter)) in enumerate(convitems):
+ if 'website_id' in self.env[converter.model]._fields and (not converter.domain or converter.domain == '[]'):
+ converter.domain = "[('website_id', 'in', (False, current_website_id))]"
+
newval = []
for val in values:
query = i == len(convitems) - 1 and query_string
@@ -738,6 +745,7 @@ class Website(models.Model):
query = sitemap_qs2dom(query, r, self.env[converter.model]._rec_name)
if query == FALSE_DOMAIN:
continue
+
for value_dict in converter.generate(uid=self.env.uid, dom=query, args=val):
newval.append(val.copy())
value_dict[name] = value_dict['loc']
diff --git a/addons/website_blog/controllers/main.py b/addons/website_blog/controllers/main.py
index f13ce97eccb..ec9be13a109 100644
--- a/addons/website_blog/controllers/main.py
+++ b/addons/website_blog/controllers/main.py
@@ -138,11 +138,11 @@ class WebsiteBlog(http.Controller):
'/blog/page/<int:page>',
'/blog/tag/<string:tag>',
'/blog/tag/<string:tag>/page/<int:page>',
- '''/blog/<model("blog.blog", "[('website_id', 'in', (False, current_website_id))]"):blog>''',
+ '''/blog/<model("blog.blog"):blog>''',
'''/blog/<model("blog.blog"):blog>/page/<int:page>''',
'''/blog/<model("blog.blog"):blog>/tag/<string:tag>''',
'''/blog/<model("blog.blog"):blog>/tag/<string:tag>/page/<int:page>''',
- ], type='http', auth="public", website=True)
+ ], type='http', auth="public", website=True, sitemap=True)
def blog(self, blog=None, tag=None, page=1, **opt):
Blog = request.env['blog.blog']
if blog and not blog.can_access_from_current_website():
@@ -166,7 +166,7 @@ class WebsiteBlog(http.Controller):
return request.render("website_blog.blog_post_short", values)
- @http.route(['''/blog/<model("blog.blog", "[('website_id', 'in', (False, current_website_id))]"):blog>/feed'''], type='http', auth="public", website=True)
+ @http.route(['''/blog/<model("blog.blog"):blog>/feed'''], type='http', auth="public", website=True, sitemap=True)
def blog_feed(self, blog, limit='15', **kwargs):
v = {}
v['blog'] = blog
@@ -177,8 +177,8 @@ class WebsiteBlog(http.Controller):
return r
@http.route([
- '''/blog/<model("blog.blog", "[('website_id', 'in', (False, current_website_id))]"):blog>/post/<model("blog.post", "[('blog_id','=',blog[0])]"):blog_post>''',
- ], type='http', auth="public", website=True)
+ '''/blog/<model("blog.blog"):blog>/post/<model("blog.post", "[('blog_id','=',blog[0])]"):blog_post>''',
+ ], type='http', auth="public", website=True, sitemap=True)
def blog_post(self, blog, blog_post, tag_id=None, page=1, enable_editor=None, **post):
""" Prepare all values to display the blog.
diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py
index 20031a67781..d5348aa7a4a 100644
--- a/addons/website_event/controllers/main.py
+++ b/addons/website_event/controllers/main.py
@@ -156,7 +156,7 @@ class WebsiteEventController(http.Controller):
return request.render("website_event.index", values)
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/page/<path:page>'''], type='http', auth="public", website=True, sitemap=False)
+ @http.route(['''/event/<model("event.event"):event>/page/<path:page>'''], type='http', auth="public", website=True, sitemap=False)
def event_page(self, event, page, **post):
if not event.can_access_from_current_website():
raise werkzeug.exceptions.NotFound()
@@ -180,7 +180,7 @@ class WebsiteEventController(http.Controller):
return request.render(page, values)
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>'''], type='http', auth="public", website=True)
+ @http.route(['''/event/<model("event.event"):event>'''], type='http', auth="public", website=True, sitemap=True)
def event(self, event, **post):
if not event.can_access_from_current_website():
raise werkzeug.exceptions.NotFound()
@@ -193,7 +193,7 @@ class WebsiteEventController(http.Controller):
target_url += '?enable_editor=1'
return request.redirect(target_url)
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/register'''], type='http', auth="public", website=True, sitemap=False)
+ @http.route(['''/event/<model("event.event"):event>/register'''], type='http', auth="public", website=True, sitemap=False)
def event_register(self, event, **post):
if not event.can_access_from_current_website():
raise werkzeug.exceptions.NotFound()
@@ -282,7 +282,7 @@ class WebsiteEventController(http.Controller):
registration[key] = value
return list(registrations.values())
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/registration/confirm'''], type='http', auth="public", methods=['POST'], website=True)
+ @http.route(['''/event/<model("event.event"):event>/registration/confirm'''], type='http', auth="public", methods=['POST'], website=True)
def registration_confirm(self, event, **post):
if not event.can_access_from_current_website():
raise werkzeug.exceptions.NotFound()
diff --git a/addons/website_event_track/controllers/main.py b/addons/website_event_track/controllers/main.py
index fa852cd5b0b..4f475ac7085 100644
--- a/addons/website_event_track/controllers/main.py
+++ b/addons/website_event_track/controllers/main.py
@@ -14,7 +14,7 @@ from odoo.tools import html_escape as escape, html2plaintext
class WebsiteEventTrackController(http.Controller):
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/track/<model("event.track", "[('event_id','=',event[0])]"):track>'''], type='http', auth="public", website=True)
+ @http.route(['''/event/<model("event.event"):event>/track/<model("event.track", "[('event_id','=',event[0])]"):track>'''], type='http', auth="public", website=True, sitemap=True)
def event_track_view(self, event, track, **post):
if not event.can_access_from_current_website():
raise NotFound()
@@ -70,7 +70,7 @@ class WebsiteEventTrackController(http.Controller):
'dates': dates
}
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/agenda'''], type='http', auth="public", website=True, sitemap=False)
+ @http.route(['''/event/<model("event.event"):event>/agenda'''], type='http', auth="public", website=True, sitemap=False)
def event_agenda(self, event, tag=None, **post):
if not event.can_access_from_current_website():
raise NotFound()
@@ -98,8 +98,8 @@ class WebsiteEventTrackController(http.Controller):
})
@http.route([
- '''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/track''',
- '''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/track/tag/<model("event.track.tag"):tag>'''
+ '''/event/<model("event.event"):event>/track''',
+ '''/event/<model("event.event"):event>/track/tag/<model("event.track.tag"):tag>'''
], type='http', auth="public", website=True, sitemap=False)
def event_tracks(self, event, tag=None, **post):
if not event.can_access_from_current_website() or (tag and tag.color == 0):
@@ -123,14 +123,14 @@ class WebsiteEventTrackController(http.Controller):
}
return request.render("website_event_track.tracks", values)
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/track_proposal'''], type='http', auth="public", website=True, sitemap=False)
+ @http.route(['''/event/<model("event.event"):event>/track_proposal'''], type='http', auth="public", website=True, sitemap=False)
def event_track_proposal(self, event, **post):
if not event.can_access_from_current_website():
raise NotFound()
return request.render("website_event_track.event_track_proposal", {'event': event})
- @http.route(['''/event/<model("event.event", "[('website_id', 'in', (False, current_website_id))]"):event>/track_proposal/post'''], type='http', auth="public", methods=['POST'], website=True)
+ @http.route(['''/event/<model("event.event"):event>/track_proposal/post'''], type='http', auth="public", methods=['POST'], website=True)
def event_track_proposal_post(self, event, **post):
if not event.can_access_from_current_website():
raise NotFound()
diff --git a/addons/website_forum/controllers/main.py b/addons/website_forum/controllers/main.py
index cd647d394bc..fd44edb48a5 100644
--- a/addons/website_forum/controllers/main.py
+++ b/addons/website_forum/controllers/main.py
@@ -39,7 +39,7 @@ class WebsiteForum(WebsiteProfile):
# Forum
# --------------------------------------------------
- @http.route(['/forum'], type='http', auth="public", website=True)
+ @http.route(['/forum'], type='http', auth="public", website=True, sitemap=True)
def forum(self, **kwargs):
domain = request.website.website_domain()
forums = request.env['forum.forum'].search(domain)
@@ -148,7 +148,7 @@ class WebsiteForum(WebsiteProfile):
})
return request.render("website_forum.forum_index", values)
- @http.route(['''/forum/<model("forum.forum", "[('website_id', 'in', (False, current_website_id))]"):forum>/faq'''], type='http', auth="public", website=True)
+ @http.route(['''/forum/<model("forum.forum"):forum>/faq'''], type='http', auth="public", website=True, sitemap=True)
def forum_faq(self, forum, **post):
values = self._prepare_user_values(forum=forum, searches=dict(), header={'is_guidelines': True}, **post)
return request.render("website_forum.faq", values)
@@ -201,7 +201,8 @@ class WebsiteForum(WebsiteProfile):
except IOError:
return False
- @http.route(['''/forum/<model("forum.forum", "[('website_id', 'in', (False, current_website_id))]"):forum>/question/<model("forum.post", "[('forum_id','=',forum[0]),('parent_id','=',False),('can_view', '=', True)]"):question>'''], type='http', auth="public", website=True)
+ @http.route(['''/forum/<model("forum.forum"):forum>/question/<model("forum.post", "[('forum_id','=',forum[0]),('parent_id','=',False),('can_view', '=', True)]"):question>'''],
+ type='http', auth="public", website=True, sitemap=True)
def question(self, forum, question, **post):
if not forum.active:
return request.render("website_forum.header", {'forum': forum})
diff --git a/addons/website_hr_recruitment/controllers/main.py b/addons/website_hr_recruitment/controllers/main.py
index b68c1b240ce..c22920316d7 100644
--- a/addons/website_hr_recruitment/controllers/main.py
+++ b/addons/website_hr_recruitment/controllers/main.py
@@ -80,7 +80,7 @@ class WebsiteHrRecruitment(http.Controller):
})
return request.redirect("/jobs/detail/%s?enable_editor=1" % slug(job))
- @http.route('''/jobs/detail/<model("hr.job", "[('website_id', 'in', (False, current_website_id))]"):job>''', type='http', auth="public", website=True)
+ @http.route('''/jobs/detail/<model("hr.job"):job>''', type='http', auth="public", website=True, sitemap=True)
def jobs_detail(self, job, **kwargs):
if not job.can_access_from_current_website():
raise NotFound()
@@ -90,7 +90,7 @@ class WebsiteHrRecruitment(http.Controller):
'main_object': job,
})
- @http.route('''/jobs/apply/<model("hr.job", "[('website_id', 'in', (False, current_website_id))]"):job>''', type='http', auth="public", website=True)
+ @http.route('''/jobs/apply/<model("hr.job"):job>''', type='http', auth="public", website=True, sitemap=True)
def jobs_apply(self, job, **kwargs):
if not job.can_access_from_current_website():
raise NotFound()
diff --git a/addons/website_livechat/controllers/main.py b/addons/website_livechat/controllers/main.py
index 989d817d2ef..60dd538fc20 100644
--- a/addons/website_livechat/controllers/main.py
+++ b/addons/website_livechat/controllers/main.py
@@ -7,7 +7,7 @@ from odoo.http import request
class WebsiteLivechat(http.Controller):
- @http.route('/livechat', type='http', auth="public", website=True)
+ @http.route('/livechat', type='http', auth="public", website=True, sitemap=True)
def channel_list(self, **kw):
# display the list of the channel
channels = request.env['im_livechat.channel'].search([('website_published', '=', True)])
@@ -16,8 +16,7 @@ class WebsiteLivechat(http.Controller):
}
return request.render('website_livechat.channel_list_page', values)
-
- @http.route('/livechat/channel/<model("im_livechat.channel"):channel>', type='http', auth='public', website=True)
+ @http.route('/livechat/channel/<model("im_livechat.channel"):channel>', type='http', auth='public', website=True, sitemap=True)
def channel_rating(self, channel, **kw):
# get the last 100 ratings and the repartition per grade
domain = [
diff --git a/addons/website_mail_channel/controllers/main.py b/addons/website_mail_channel/controllers/main.py
index 8865fd517b1..c51fc8de585 100644
--- a/addons/website_mail_channel/controllers/main.py
+++ b/addons/website_mail_channel/controllers/main.py
@@ -38,7 +38,7 @@ class MailGroup(http.Controller):
.date() # may be unnecessary?
.strftime(tools.DEFAULT_SERVER_DATE_FORMAT))
- @http.route("/groups", type='http', auth="public", website=True)
+ @http.route("/groups", type='http', auth="public", website=True, sitemap=True)
def view(self, **post):
groups = request.env['mail.channel'].search([('alias_id.alias_name', '!=', False)])
@@ -122,7 +122,7 @@ class MailGroup(http.Controller):
@http.route([
'''/groups/<model('mail.channel', "[('channel_type', '=', 'channel')]"):group>''',
'''/groups/<model('mail.channel'):group>/page/<int:page>'''
- ], type='http', auth="public", website=True)
+ ], type='http', auth="public", website=True, sitemap=True)
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()
@@ -157,7 +157,7 @@ class MailGroup(http.Controller):
@http.route([
'''/groups/<model('mail.channel', "[('channel_type', '=', 'channel')]"):group>/<model('mail.message', "[('model','=','mail.channel'), ('res_id','=',group[0])]"):message>''',
- ], type='http', auth="public", website=True)
+ ], type='http', auth="public", website=True, sitemap=True)
def thread_discussion(self, group, message, mode='thread', date_begin=None, date_end=None, **post):
if group.channel_type != 'channel':
raise werkzeug.exceptions.NotFound()
diff --git a/addons/website_membership/controllers/main.py b/addons/website_membership/controllers/main.py
index 98f55eac68d..d9e8cbdd757 100644
--- a/addons/website_membership/controllers/main.py
+++ b/addons/website_membership/controllers/main.py
@@ -29,7 +29,7 @@ class WebsiteMembership(http.Controller):
'/members/association/<membership_id>/country/<int:country_id>',
'/members/association/<membership_id>/country/<country_name>-<int:country_id>/page/<int:page>',
'/members/association/<membership_id>/country/<int:country_id>/page/<int:page>',
- ], type='http', auth="public", website=True)
+ ], type='http', auth="public", website=True, sitemap=True)
def members(self, membership_id=None, country_name=None, country_id=0, page=1, **post):
Product = request.env['product.product']
Country = request.env['res.country']
diff --git a/addons/website_profile/controllers/main.py b/addons/website_profile/controllers/main.py
index 8db95836b9f..eef5d1d4dc8 100644
--- a/addons/website_profile/controllers/main.py
+++ b/addons/website_profile/controllers/main.py
@@ -168,7 +168,7 @@ class WebsiteProfile(http.Controller):
domain = expression.AND([[('challenge_ids.category', '=', kwargs.get('badge_category'))], domain])
return domain
- @http.route('/profile/ranks_badges', type='http', auth="public", website=True)
+ @http.route('/profile/ranks_badges', type='http', auth="public", website=True, sitemap=True)
def view_ranks_badges(self, **kwargs):
ranks = []
if 'badge_category' not in kwargs:
@@ -204,7 +204,7 @@ class WebsiteProfile(http.Controller):
return user_values
@http.route(['/profile/users',
- '/profile/users/page/<int:page>'], type='http', auth="public", website=True)
+ '/profile/users/page/<int:page>'], type='http', auth="public", website=True, sitemap=True)
def view_all_users_page(self, page=1, **searches):
User = request.env['res.users']
dom = [('karma', '>', 1), ('website_published', '=', True)]
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 91542537232..faeb1b314d7 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -302,7 +302,7 @@ class WebsiteSale(http.Controller):
values['main_object'] = category
return request.render("website_sale.products", values)
- @http.route(['/shop/product/<model("product.template"):product>'], type='http', auth="public", website=True)
+ @http.route(['/shop/product/<model("product.template"):product>'], type='http', auth="public", website=True, sitemap=True)
def product(self, product, category='', search='', **kwargs):
if not product.can_access_from_current_website():
raise NotFound()
@@ -1000,8 +1000,7 @@ class WebsiteSale(http.Controller):
PaymentProcessing.remove_payment_transaction(tx)
return request.redirect('/shop/confirmation')
-
- @http.route(['/shop/terms'], type='http', auth="public", website=True)
+ @http.route(['/shop/terms'], type='http', auth="public", website=True, sitemap=True)
def terms(self, **kw):
return request.render("website_sale.terms")
diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py
index eba4df3ca4d..e937cff43f8 100644
--- a/addons/website_slides/controllers/main.py
+++ b/addons/website_slides/controllers/main.py
@@ -234,7 +234,7 @@ class WebsiteSlides(WebsiteProfile):
# SLIDE.CHANNEL MAIN / SEARCH
# --------------------------------------------------
- @http.route('/slides', type='http', auth="public", website=True)
+ @http.route('/slides', type='http', auth="public", website=True, sitemap=True)
def slides_channel_home(self, **post):
""" Home page for eLearning platform. Is mainly a container page, does not allow search / filter. """
domain = request.website.website_domain()
@@ -279,7 +279,7 @@ class WebsiteSlides(WebsiteProfile):
return request.render('website_slides.courses_home', values)
- @http.route('/slides/all', type='http', auth="public", website=True)
+ @http.route('/slides/all', type='http', auth="public", website=True, sitemap=True)
def slides_channel_all(self, slide_type=None, my=False, **post):
""" Home page displaying a list of courses displayed according to some
criterion and search terms.
@@ -539,7 +539,7 @@ class WebsiteSlides(WebsiteProfile):
# SLIDE.SLIDE MAIN / SEARCH
# --------------------------------------------------
- @http.route('''/slides/slide/<model("slide.slide", "[('website_id', 'in', (False, current_website_id))]"):slide>''', type='http', auth="public", website=True)
+ @http.route('''/slides/slide/<model("slide.slide"):slide>''', type='http', auth="public", website=True, sitemap=True)
def slide_view(self, slide, **kwargs):
if not slide.channel_id.can_access_from_current_website() or not slide.active:
raise werkzeug.exceptions.NotFound()