-
-
+
diff --git a/addons/website_google_map/controllers/main.py b/addons/website_google_map/controllers/main.py
index 04cea6901fc..98a86230d7e 100644
--- a/addons/website_google_map/controllers/main.py
+++ b/addons/website_google_map/controllers/main.py
@@ -7,7 +7,7 @@ from datetime import datetime
class google_map(http.Controller):
- @http.route(['/google_map/'], type='http', auth="admin", website=True)
+ @http.route(['/google_map/'], type='http', auth="public", website=True)
def google_map(self, *arg, **post):
values = {
'partner_ids': post.get('partner_ids', ""),
@@ -17,7 +17,7 @@ class google_map(http.Controller):
}
return request.website.render("website_google_map.google_map", values)
- @http.route(['/google_map/partners.json'], type='http', auth="admin", website=True)
+ @http.route(['/google_map/partners.json'], type='http', auth="public", website=True)
def google_map_data(self, *arg, **post):
partner_obj = request.registry['res.partner']
@@ -28,7 +28,7 @@ class google_map(http.Controller):
return partner_obj.google_map_json(request.cr, openerp.SUPERUSER_ID,
partner_ids, request.context)
- @http.route(['/google_map/set_partner_position/'], type='http', auth="admin", website=True)
+ @http.route(['/google_map/set_partner_position/'], type='http', auth="public", website=True)
def google_map_set_partner_position(self, *arg, **post):
partner_obj = request.registry['res.partner']
@@ -41,7 +41,7 @@ class google_map(http.Controller):
'partner_longitude': longitude,
'date_localization': datetime.now().strftime('%Y-%m-%d'),
}
- partner_obj.write(request.cr, request.uid, [partner_id], values,
+ partner_obj.write(request.cr, openerp.SUPERUSER_ID, [partner_id], values,
request.context)
diff --git a/addons/website_hr_recruitment/__openerp__.py b/addons/website_hr_recruitment/__openerp__.py
index f09505191d5..810220e1db5 100644
--- a/addons/website_hr_recruitment/__openerp__.py
+++ b/addons/website_hr_recruitment/__openerp__.py
@@ -1,8 +1,8 @@
{
- 'name': 'Career Form',
+ 'name': 'Jobs',
'category': 'Website',
'version': '1.0',
- 'summary': 'Job Position',
+ 'summary': 'Job Descriptions And Application Forms',
'description': """
OpenERP Contact Form
====================
diff --git a/addons/website_hr_recruitment/controllers/main.py b/addons/website_hr_recruitment/controllers/main.py
index 927c843e58d..c50bc6a0428 100644
--- a/addons/website_hr_recruitment/controllers/main.py
+++ b/addons/website_hr_recruitment/controllers/main.py
@@ -1,6 +1,7 @@
# -*- coding: utf-8 -*-
import base64
+from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.tools.translate import _
from openerp.addons.web.http import request
@@ -62,19 +63,19 @@ class website_hr_recruitment(http.Controller):
def jobs_apply(self, job):
return request.website.render("website_hr_recruitment.apply", { 'job': job })
- @http.route(['/jobs/thankyou'], methods=['POST'], type='http', auth="admin", website=True, multilang=True)
+ @http.route(['/jobs/thankyou'], methods=['POST'], type='http', auth="public", website=True, multilang=True)
def jobs_thankyou(self, **post):
cr, uid, context = request.cr, request.uid, request.context
imd = request.registry['ir.model.data']
value = {
'name': _('Online Form'),
'user_id': False,
- 'source_id' : imd.xmlid_to_res_id(cr, uid, 'hr_recruitment.source_website_company'),
+ 'source_id' : imd.xmlid_to_res_id(cr, SUPERUSER_ID, 'hr_recruitment.source_website_company'),
}
for f in ['phone', 'email_from', 'partner_name', 'description', 'department_id', 'job_id']:
value[f] = post.get(f)
- job_id = request.registry['hr.applicant'].create(cr, uid, value, context=context)
+ job_id = request.registry['hr.applicant'].create(cr, SUPERUSER_ID, value, context=context)
if post['ufile']:
attachment_value = {
'name': post['ufile'].filename,
@@ -84,7 +85,7 @@ class website_hr_recruitment(http.Controller):
'datas': base64.encodestring(post['ufile'].read()),
'datas_fname': post['ufile'].filename,
}
- request.registry['ir.attachment'].create(cr, uid, attachment_value, context=context)
+ request.registry['ir.attachment'].create(cr, SUPERUSER_ID, attachment_value, context=context)
return request.website.render("website_hr_recruitment.thankyou", {})
# vim :et:
diff --git a/addons/website_livechat/__openerp__.py b/addons/website_livechat/__openerp__.py
index 98af0eb8d8d..0ab7781b7ab 100644
--- a/addons/website_livechat/__openerp__.py
+++ b/addons/website_livechat/__openerp__.py
@@ -1,7 +1,7 @@
{
- 'name': 'Website LiveChat',
+ 'name': 'LiveChat',
'category': 'Website',
- 'summary': 'Instant Messaging for your Website',
+ 'summary': 'Chat With Your Website Visitors',
'version': '1.0',
'description': """
OpenERP Website LiveChat
diff --git a/addons/website_mail/models/mail_message.py b/addons/website_mail/models/mail_message.py
index 41c4e6a3267..308cf9da4b8 100644
--- a/addons/website_mail/models/mail_message.py
+++ b/addons/website_mail/models/mail_message.py
@@ -56,7 +56,7 @@ class MailMessage(osv.Model):
group_ids = self.pool.get('res.users').browse(cr, uid, uid, context=context).groups_id
group_user_id = self.pool.get("ir.model.data").get_object_reference(cr, uid, 'base', 'group_public')[1]
if group_user_id in [group.id for group in group_ids]:
- cr.execute('SELECT DISTINCT id FROM "%s" WHERE website_published IS FALSE AND id = ANY (%%s)' % (self._table), (ids,))
+ cr.execute('SELECT id FROM "%s" WHERE website_published IS FALSE AND id = ANY (%%s)' % (self._table), (ids,))
if cr.fetchall():
raise osv.except_osv(
_('Access Denied'),
diff --git a/addons/website_mail/static/src/js/website_mail.js b/addons/website_mail/static/src/js/website_mail.js
index 99acd3f939b..862e061afd6 100644
--- a/addons/website_mail/static/src/js/website_mail.js
+++ b/addons/website_mail/static/src/js/website_mail.js
@@ -6,6 +6,11 @@ $(document).ready(function () {
var self = this;
var $data = $(this).parents("div.js_follow");
var $email = $data.find(".js_follow_email");
+
+ if ($email.length && !$email.val().match(/.+@.+/)) {
+ return false;
+ }
+
var message_is_follower = $data.attr("data-follow") || "off";
$data.attr("data-follow", message_is_follower == 'off' ? 'on' : 'off');
@@ -13,7 +18,7 @@ $(document).ready(function () {
'id': $data.data('id'),
'object': $data.data('object'),
'message_is_follower': message_is_follower,
- 'email': $email && $email.val() || false,
+ 'email': $email.length ? $email.val() : false,
}).then(function (result) {
if (result) {
$data.find(" > *").toggleClass("hidden");
diff --git a/addons/website_mail/views/website_mail.xml b/addons/website_mail/views/website_mail.xml
index 244ac4b28c2..e7a17c8f3db 100644
--- a/addons/website_mail/views/website_mail.xml
+++ b/addons/website_mail/views/website_mail.xml
@@ -10,7 +10,8 @@
type="email" name="email"
class="js_follow_email form-control"
t-att-value="email or ''"
- placeholder="your email..."/>
+ placeholder="your email..."
+ groups="base.group_public"/>
diff --git a/addons/website_membership/__openerp__.py b/addons/website_membership/__openerp__.py
index 0f93b6f7a94..8f4bc905dda 100644
--- a/addons/website_membership/__openerp__.py
+++ b/addons/website_membership/__openerp__.py
@@ -1,6 +1,6 @@
{
- 'name': 'Public Members',
- 'name': 'Website for Associations',
+ 'name': 'Associations: Members',
+ 'summary': 'Online Directory of Members',
'category': 'Website',
'summary': 'Publish Associations, Groups and Memberships',
'version': '1.0',
diff --git a/addons/website_membership/controllers/main.py b/addons/website_membership/controllers/main.py
index 888cf982f69..5b760370447 100644
--- a/addons/website_membership/controllers/main.py
+++ b/addons/website_membership/controllers/main.py
@@ -7,7 +7,7 @@ from openerp.addons.web.http import request
from openerp.addons.website_partner.controllers import main as website_partner
from openerp.tools.translate import _
-import urllib
+import werkzeug.urls
class WebsiteMembership(http.Controller):
@@ -37,14 +37,15 @@ class WebsiteMembership(http.Controller):
post_name = post.get('name', '')
# base domain for groupby / searches
- base_line_domain = []
+ base_line_domain = [('state', 'in', ['free', 'paid'])]
if membership_id:
base_line_domain.append(('membership_id', '=', membership_id))
membership = product_obj.browse(cr, uid, membership_id, context=context)
else:
membership = None
if post_name:
- base_line_domain += ['|', ('partner.name', 'ilike', "%%%s%%" % post_name), ('partner.website_description', 'ilike', "%%%s%%" % post_name)]
+ base_line_domain += ['|', ('partner.name', 'ilike', post_name),
+ ('partner.website_description', 'ilike', post_name)]
# group by country, based on all customers (base domain)
membership_line_ids = membership_line_obj.search(cr, uid, base_line_domain, context=context)
@@ -64,6 +65,7 @@ class WebsiteMembership(http.Controller):
membership_line_ids = membership_line_obj.search(cr, uid, line_domain, context=context)
membership_lines = membership_line_obj.browse(cr, uid, membership_line_ids, context=context)
+ membership_lines.sort(key=lambda x: x.membership_id.website_sequence)
partner_ids = [m.partner and m.partner.id for m in membership_lines]
google_map_partner_ids = ",".join(map(str, partner_ids))
@@ -72,7 +74,7 @@ class WebsiteMembership(http.Controller):
partners_data[partner.get("id")] = partner
# format domain for group_by and memberships
- membership_ids = product_obj.search(cr, uid, [('membership', '=', True)], context=context)
+ membership_ids = product_obj.search(cr, uid, [('membership', '=', True)], order="website_sequence", context=context)
memberships = product_obj.browse(cr, uid, membership_ids, context=context)
# request pager for lines
@@ -87,7 +89,7 @@ class WebsiteMembership(http.Controller):
'google_map_partner_ids': google_map_partner_ids,
'pager': pager,
'post': post,
- 'search': "?%s" % urllib.urlencode(post),
+ 'search': "?%s" % werkzeug.url_encode(post),
}
return request.website.render("website_membership.index", values)
diff --git a/addons/website_project/controllers/main.py b/addons/website_project/controllers/main.py
index 17a91bed21b..4940a521072 100644
--- a/addons/website_project/controllers/main.py
+++ b/addons/website_project/controllers/main.py
@@ -31,9 +31,11 @@ class Website(osv.Model):
project_obj = request.registry['project.project']
project_ids = project_obj.search(cr, uid, [('privacy_visibility', "=", "public")], context=request.context)
- request.context['website_project_ids'] = project_obj.browse(cr, uid, project_ids, request.context)
+ request.context.update({
+ 'website_project_ids': project_obj.browse(cr, uid, project_ids, context=request.context)
+ })
- return super(Website, self).preprocess_request(cr, uid, ids, request, context)
+ return super(Website, self).preprocess_request(cr, uid, ids, request, context=None)
class website_project(http.Controller):
diff --git a/addons/website_project/views/website_project.xml b/addons/website_project/views/website_project.xml
index 28adb31e3cf..514194083f2 100644
--- a/addons/website_project/views/website_project.xml
+++ b/addons/website_project/views/website_project.xml
@@ -5,7 +5,9 @@
diff --git a/addons/website_quote/__openerp__.py b/addons/website_quote/__openerp__.py
index 0842926e318..3991f6ac17e 100644
--- a/addons/website_quote/__openerp__.py
+++ b/addons/website_quote/__openerp__.py
@@ -1,7 +1,7 @@
{
- 'name': 'Online Quotation',
+ 'name': 'Online Proposals',
'category': 'Website',
- 'summary': 'Send Live Quotation',
+ 'summary': 'Send Professional Quotations',
'version': '1.0',
'description': """
OpenERP Sale Quote Roller
diff --git a/addons/website_sale/__openerp__.py b/addons/website_sale/__openerp__.py
index b367fcc0bfc..a30da144b1f 100644
--- a/addons/website_sale/__openerp__.py
+++ b/addons/website_sale/__openerp__.py
@@ -1,5 +1,5 @@
{
- 'name': 'E-Commerce',
+ 'name': 'eCommerce',
'category': 'Website',
'summary': 'Sell Your Products Online',
'version': '1.0',
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index dd8f199941e..ba69bfdbed2 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
import random
import simplejson
-import urllib
import werkzeug
from openerp import SUPERUSER_ID
@@ -206,8 +205,8 @@ class Ecommerce(http.Controller):
domain = request.registry.get('website').ecommerce_get_product_domain()
if search:
domain += ['|',
- ('name', 'ilike', "%%%s%%" % search),
- ('description', 'ilike', "%%%s%%" % search)]
+ ('name', 'ilike', search),
+ ('description', 'ilike', search)]
if category:
domain.append(('product_variant_ids.public_categ_id', 'child_of', category.id))
if filters:
@@ -634,7 +633,7 @@ class Ecommerce(http.Controller):
})
acquirer_form_post_url = payment_obj.get_form_action_url(cr, uid, acquirer_id, context=context)
- acquirer_total_url = '%s?%s' % (acquirer_form_post_url, urllib.urlencode(post))
+ acquirer_total_url = '%s?%s' % (acquirer_form_post_url, werkzeug.url_encode(post))
return request.redirect(acquirer_total_url)
@http.route('/shop/payment/get_status/', type='json', auth="public", website=True, multilang=True)
diff --git a/addons/website_sale/models/res_config.py b/addons/website_sale/models/res_config.py
index 9bc1fd1b43e..4d45fc248d2 100644
--- a/addons/website_sale/models/res_config.py
+++ b/addons/website_sale/models/res_config.py
@@ -5,8 +5,11 @@ class sale_configuration(osv.osv_memory):
_inherit = 'sale.config.settings'
_columns = {
- 'group_product_characteristics': fields.boolean("Support multiple characteristics per products ",
+ 'group_product_characteristics': fields.boolean("Support custom product attributes",
group='base.group_user,base.group_portal,base.group_public',
implied_group='product.group_product_characteristics',
- help="""Allow to manage several characteristics per product. This characteristics are used for filter and compare your products. As an example, if you sell all in one computers, you may have characteristics like RAM, Processor Speed, Manufacturing, to compare products"""),
+ help="Lets you add multiple custom attributes on products, "
+ "usable to filter and compare them. "
+ "For example if you sell computers, you could add custom attributes such as RAM size "
+ "or CPU speed to compare your products"""),
}
diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py
index 3ced42da53f..880793a50fa 100644
--- a/addons/website_sale/models/website.py
+++ b/addons/website_sale/models/website.py
@@ -112,6 +112,9 @@ class Website(orm.Model):
values['product_id'] = product_id
values['order_id'] = order.id
+ product = self.pool.get('product.product').browse(cr, uid, product_id, context=context)
+ values['name'] = "%s: %s" % (product.name, product.variants) if product.variants else product.name
+
if order_line_id:
order_line_obj.write(cr, SUPERUSER_ID, order_line_ids, values, context=context)
else:
diff --git a/addons/website_sale/static/src/js/website.tour.shop.js b/addons/website_sale/static/src/js/website.tour.shop.js
index d639760bcf0..1104f40ad4f 100644
--- a/addons/website_sale/static/src/js/website.tour.shop.js
+++ b/addons/website_sale/static/src/js/website.tour.shop.js
@@ -44,27 +44,36 @@
trigger: {
modal: {
stopOnClose: true,
- afterSubmit: 'product-page',
},
},
},
{
stepId: 'enter-name',
element: '.modal input[type=text]',
+ sampleText: 'New Product',
placement: 'right',
title: "Choose name",
content: "Enter a name for your new product then click 'Continue'.",
+ trigger: 'keyup',
+ },
+ {
+ stepId: 'continue-name',
+ element: '.modal button.btn-primary',
+ placement: 'right',
+ title: "Create Product",
+ content: "Click Continue to create the product.",
+ trigger: 'reload',
},
{
stepId: 'product-page',
title: "New product created",
content: "This page contains all the information related to the new product.",
template: self.popover({ next: "OK" }),
- backdrop: true,
},
{
- stepId: 'edit-price',
- element: '.product_price',
+ stepId: 'edit-price-cke',
+ element: '.product_price .oe_currency_value',
+ sampleText: '20.50',
placement: 'left',
title: "Change the price",
content: "Edit the price of this product by clicking on the amount.",
@@ -76,17 +85,24 @@
placement: 'top',
title: "Update image",
content: "Click here to set an image describing your product.",
- triggers: function () {
- function registerClick () {
- $('button.hover-edition-button').one('click', function () {
- $('#wrap img.img:first').off('hover', registerClick);
- self.moveToNextStep();
- });
- }
- $('#wrap img.img:first').on('hover', registerClick);
-
+ triggers: function (callback) {
+ var self = this;
+ $(self.element).on('mouseenter', function () {
+ $(this).off('mouseenter');
+ setTimeout(function () {
+ (callback || self.tour.moveToNextStep).apply(self.tour);
+ },0);
+ });
},
},
+ {
+ stepId: 'update-image-button',
+ element: 'button.hover-edition-button:visible',
+ placement: 'top',
+ title: "Update image",
+ content: "Click here to set an image describing your product.",
+ trigger: 'click',
+ },
{
stepId: 'upload-image',
element: '.well a.pull-right',
@@ -94,7 +110,7 @@
title: "Select an Image",
content: "Let's select an existing image.",
template: self.popover({ fixed: true }),
- trigger: 'click',
+ trigger: 'ajax'
},
{
stepId: 'select-image',
@@ -103,13 +119,22 @@
title: "Select an Image",
content: "Let's select an imac image.",
template: self.popover({ fixed: true }),
- trigger: 'click',
+ triggers: function (callback) {
+ var self = this;
+ var click = function () {
+ $('.modal-dialog.select-image img').off('click', click);
+ setTimeout(function () {
+ (callback || self.tour.moveToNextStep).apply(self.tour);
+ },0);
+ };
+ $('.modal-dialog.select-image img').on('click', click);
+ },
},
{
stepId: 'save-image',
element: 'button.save',
placement: 'bottom',
- title: "Save the Image",
+ title: "Select this Image",
content: "Click to add the image to the product decsription.",
template: self.popover({ fixed: true }),
trigger: 'click',
@@ -139,7 +164,7 @@
title: "Save your modifications",
content: "Once you click on save, your product is updated.",
template: self.popover({ fixed: true }),
- trigger: 'click',
+ trigger: 'reload',
},
{
@@ -148,7 +173,7 @@
placement: 'top',
title: "Publish your product",
content: "Click to publish your product so your customers can see it.",
- trigger: 'click',
+ trigger: 'ajax'
},
{
stepId: 'congratulations',
@@ -190,8 +215,8 @@
website.EditorShopTest = website.Test.extend({
- id: 'shoptest',
- name: "Try to by products",
+ id: 'shop_buy_product',
+ name: "Try to buy products",
path: '/shop',
init: function (editor) {
var self = this;
@@ -212,9 +237,7 @@
{
stepId: 'choose-ipod',
element: 'input[name="product_id"]:not([checked])',
- trigger: {
- id: 'mouseup',
- },
+ trigger: 'mouseup',
},
{
stepId: 'add-ipod',
@@ -231,7 +254,7 @@
{
stepId: 'more-product',
element: '.oe_mycart a.js_add_cart_json:eq(1)',
- trigger: 'click',
+ trigger: 'ajax',
},
{
stepId: 'less-product',
@@ -241,17 +264,8 @@
{
stepId: 'number-product',
element: '.oe_mycart input.js_quantity',
+ sampleText: '1',
trigger: 'reload',
- beforeTrigger: function (tour) {
- if (parseInt($(".oe_mycart input.js_quantity").val(),10) !== 1)
- $(".oe_mycart input.js_quantity").val("1").change();
- },
- afterTrigger: function (tour) {
- if ($(".oe_mycart input.js_quantity").size() !== 1)
- throw "Can't remove suggested item from my cart";
- if (parseInt($(".oe_mycart input.js_quantity").val(),10) !== 1)
- throw "Can't defined number of items in my cart";
- },
},
{
stepId: 'go-checkout-product',
diff --git a/addons/website_sale/tests/__init__.py b/addons/website_sale/tests/__init__.py
index fb84c7bbb6a..bf8ba6321ad 100644
--- a/addons/website_sale/tests/__init__.py
+++ b/addons/website_sale/tests/__init__.py
@@ -1,2 +1 @@
-#TODO : fix test runing
-#import test_ui
\ No newline at end of file
+import test_ui
diff --git a/addons/website_sale/tests/test_ui.py b/addons/website_sale/tests/test_ui.py
index bda42eb1bd7..ec852bdfa3b 100644
--- a/addons/website_sale/tests/test_ui.py
+++ b/addons/website_sale/tests/test_ui.py
@@ -3,4 +3,6 @@ import openerp.addons.website.tests.test_ui as test_ui
def load_tests(loader, base, _):
base.addTest(test_ui.WebsiteUiSuite(test_ui.full_path(__file__,'website_sale-sale_process-test.js'),
{ 'action': 'website.action_website_homepage' }, 120.0))
+ base.addTest(test_ui.WebsiteUiSuite(test_ui.full_path(__file__,'website_sale-sale_process-test-2.js'),
+ { 'action': 'website.action_website_homepage' }, 120.0))
return base
\ No newline at end of file
diff --git a/addons/website_sale/tests/ui_suite/website_sale-sale_process-test-2.js b/addons/website_sale/tests/ui_suite/website_sale-sale_process-test-2.js
new file mode 100644
index 00000000000..35e1ba6edd3
--- /dev/null
+++ b/addons/website_sale/tests/ui_suite/website_sale-sale_process-test-2.js
@@ -0,0 +1,28 @@
+var testRunner = require('../../../website/tests/ui_suite/ui_test_runner.js');
+
+var waitFor = testRunner.waitFor;
+
+testRunner.run(function websiteSaleTest (page, timeout) {
+ page.evaluate(function () { localStorage.clear(); });
+ waitFor(function clientReady () {
+ return page.evaluate(function () {
+ return window.$ && window.openerp && window.openerp.website
+ && window.openerp.website.TestConsole
+ && window.openerp.website.TestConsole.test('shop');
+ });
+ }, function executeTest () {
+ page.evaluate(function () {
+ window.openerp.website.TestConsole.test('shop').run(true);
+ });
+ waitFor(function testExecuted () {
+ var after = page.evaluate(function () {
+ return window.$ && $('button[data-action=edit]').is(":visible") &&
+ $('data-snippet-id="big-picture"').length;
+ });
+ return after;
+ }, function finish () {
+ console.log('{ "event": "success" }');
+ phantom.exit();
+ }, 4*timeout/5);
+ }, timeout/5);
+});
diff --git a/addons/website_sale/tests/ui_suite/website_sale-sale_process-test.js b/addons/website_sale/tests/ui_suite/website_sale-sale_process-test.js
index 5e7c7aa436f..5e6b8279306 100644
--- a/addons/website_sale/tests/ui_suite/website_sale-sale_process-test.js
+++ b/addons/website_sale/tests/ui_suite/website_sale-sale_process-test.js
@@ -8,11 +8,11 @@ testRunner.run(function websiteSaleTest (page, timeout) {
return page.evaluate(function () {
return window.$ && window.openerp && window.openerp.website
&& window.openerp.website.TestConsole
- && window.openerp.website.TestConsole.test('shoptest');
+ && window.openerp.website.TestConsole.test('shop_buy_product');
});
}, function executeTest () {
page.evaluate(function () {
- window.openerp.website.TestConsole.test('shoptest').run(true);
+ window.openerp.website.TestConsole.test('shop_buy_product').run(true);
});
}, timeout);
});
\ No newline at end of file
diff --git a/addons/website_sale/views/website_sale.xml b/addons/website_sale/views/website_sale.xml
index dde42ea5ce7..6717bc62557 100644
--- a/addons/website_sale/views/website_sale.xml
+++ b/addons/website_sale/views/website_sale.xml
@@ -487,13 +487,12 @@
|
-
+ |
|