[MERGE] forward port branch saas-11.3 up to 97d81f1220
This commit is contained in:
@@ -744,6 +744,7 @@ var LineRenderer = Widget.extend(FieldManagerMixin, {
|
||||
*/
|
||||
_onSelectMoveLine: function (event) {
|
||||
var $el = $(event.target);
|
||||
$el.prop('disabled', true);
|
||||
this._destroyPopover($el);
|
||||
var moveLineId = $el.closest('.mv_line').data('line-id');
|
||||
this.trigger_up('add_proposition', {'data': moveLineId});
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import api, fields, models
|
||||
from odoo import api, fields, models, tools
|
||||
|
||||
|
||||
class TimesheetAttendance(models.Model):
|
||||
@@ -17,7 +17,7 @@ class TimesheetAttendance(models.Model):
|
||||
|
||||
@api.model_cr
|
||||
def init(self):
|
||||
self._cr.execute("DROP VIEW IF EXISTS hr_timesheet_attendance_report")
|
||||
tools.drop_view_if_exists(self.env.cr, self._table)
|
||||
self._cr.execute("""CREATE OR REPLACE VIEW %s AS (
|
||||
SELECT
|
||||
max(id) AS id,
|
||||
|
||||
@@ -276,7 +276,7 @@
|
||||
"account_common_523","Proveedores de inmovilizado a corto plazo","523","account.data_account_type_payable","l10n_es.account_chart_template_common","l10n_es.account_group_523","True"
|
||||
"account_common_524","Acreedores por arrendamiento financiero a corto plazo","524","account.data_account_type_current_liabilities","l10n_es.account_chart_template_common","l10n_es.account_group_524","False"
|
||||
"account_common_525","Efectos a pagar a corto plazo","525","account.data_account_type_current_liabilities","l10n_es.account_chart_template_common","l10n_es.account_group_525","False"
|
||||
"account_common_526","Dividendo activo a pagar","526","account.data_account_type_current_liabilities","l10n_es.account_chart_template_common","l10n_es.account_group_526","False"
|
||||
"account_common_526","Dividendo activo a pagar","526","account.data_account_type_payable","l10n_es.account_chart_template_common","l10n_es.account_group_526","True"
|
||||
"account_common_527","Intereses a corto plazo de deudas con entidades de crédito","527","account.data_account_type_current_liabilities","l10n_es.account_chart_template_common","l10n_es.account_group_527","False"
|
||||
"account_common_528","Intereses a corto plazo de deudas","528","account.data_account_type_current_liabilities","l10n_es.account_chart_template_common","l10n_es.account_group_528","False"
|
||||
"account_common_5290","Provisión a corto plazo por retribuciones al personal","5290","account.data_account_type_current_liabilities","l10n_es.account_chart_template_common","l10n_es.account_group_5290","True"
|
||||
|
||||
|
@@ -225,6 +225,7 @@
|
||||
<field name="amount_type">group</field>
|
||||
<field name="amount" eval="100"/>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva21_sp_in_1'), ref('account_tax_template_p_iva21_sp_in_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_10_11'), ref('mod_303_14_15_purchase'), ref('mod_303_36_37'), ref('mod_303_40_41')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_21"/>
|
||||
</record>
|
||||
<record id="account_tax_template_p_iva21_ic_bc_1" model="account.tax.template">
|
||||
@@ -257,7 +258,8 @@
|
||||
<field name="description">P_IVA21_IC_BC</field>
|
||||
<field name="amount_type">group</field>
|
||||
<field name="amount" eval="100"/>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva21_ic_bc_1'), ref('account_tax_template_p_iva21_ic_bc_2')])]"/>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva21_ic_bc_1'), ref('account_tax_template_p_iva21_ic_bc_2'), ])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_36_37'), ref('mod_303_40_41'), ref('mod_303_10_11'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 21% Adquisición Intracomunitaria. Bienes corrientes</field>
|
||||
@@ -296,6 +298,7 @@
|
||||
<field name="amount_type">group</field>
|
||||
<field name="amount" eval="100"/>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva21_ic_bi_1'), ref('account_tax_template_p_iva21_ic_bi_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_38_39'), ref('mod_303_40_41'), ref('mod_303_10_11'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_21"/>
|
||||
</record>
|
||||
@@ -368,6 +371,7 @@
|
||||
<field name="amount_type">group</field>
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva4_sp_ex_1'), ref('account_tax_template_p_iva4_sp_ex_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_12_13'), ref('mod_303_14_15_purchase'), ref('mod_303_28_29'), ref('mod_303_40_41')])]"/>
|
||||
<field name="name">IVA 4% Adquisición de servicios extracomunitarios</field>
|
||||
<field name="tax_group_id" ref="tax_group_iva_4"/>
|
||||
</record>
|
||||
@@ -403,6 +407,7 @@
|
||||
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
|
||||
<field name="amount_type">group</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva10_sp_ex_1'), ref('account_tax_template_p_iva10_sp_ex_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_12_13'), ref('mod_303_14_15_purchase'), ref('mod_303_28_29'), ref('mod_303_40_41')])]"/>
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 10% Adquisición de servicios extracomunitarios</field>
|
||||
<field name="tax_group_id" ref="tax_group_iva_10"/>
|
||||
@@ -441,6 +446,7 @@
|
||||
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
|
||||
<field name="amount_type">group</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva21_sp_ex_1'), ref('account_tax_template_p_iva21_sp_ex_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_12_13'), ref('mod_303_14_15_purchase'), ref('mod_303_28_29'), ref('mod_303_40_41')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_21"/>
|
||||
</record>
|
||||
<record id="account_tax_template_p_iva4_ic_bc_1" model="account.tax.template">
|
||||
@@ -477,6 +483,7 @@
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 4% Adquisición Intracomunitario. Bienes corrientes</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva4_ic_bc_1'), ref('account_tax_template_p_iva4_ic_bc_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_36_37'), ref('mod_303_40_41'), ref('mod_303_10_11'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_4"/>
|
||||
</record>
|
||||
<record id="account_tax_template_p_iva4_ic_bi_1" model="account.tax.template">
|
||||
@@ -514,6 +521,7 @@
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 4% Adquisición Intracomunitario. Bienes de inversión</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva4_ic_bi_1'), ref('account_tax_template_p_iva4_ic_bi_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_38_39'), ref('mod_303_40_41'), ref('mod_303_10_11'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_4"/>
|
||||
</record>
|
||||
<record id="account_tax_template_p_iva10_ic_bc_1" model="account.tax.template">
|
||||
@@ -550,6 +558,7 @@
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 10% Adquisición Intracomunitario. Bienes corrientes</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva10_ic_bc_1'), ref('account_tax_template_p_iva10_ic_bc_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_36_37'), ref('mod_303_40_41'), ref('mod_303_10_11'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_10"/>
|
||||
</record>
|
||||
<record id="account_tax_template_p_iva10_ic_bi_1" model="account.tax.template">
|
||||
@@ -586,6 +595,7 @@
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 10% Adquisición Intracomunitario. Bienes de inversión</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva10_ic_bi_1'), ref('account_tax_template_p_iva10_ic_bi_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_38_39'), ref('mod_303_40_41'), ref('mod_303_10_11'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_10"/>
|
||||
</record>
|
||||
<record id="account_tax_template_s_iva0_sp_i" model="account.tax.template">
|
||||
@@ -1248,6 +1258,7 @@
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 10% Adquisición de servicios intracomunitarios</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva10_sp_in_1'), ref('account_tax_template_p_iva10_sp_in_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_10_11'), ref('mod_303_14_15_purchase'), ref('mod_303_36_37'), ref('mod_303_40_41')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_10"/>
|
||||
</record>
|
||||
<record id="account_tax_template_p_iva4_sp_in_1" model="account.tax.template">
|
||||
@@ -1284,6 +1295,7 @@
|
||||
<field name="type_tax_use">purchase</field>
|
||||
<field name="name">IVA 4% Adquisición de servicios intracomunitarios</field>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva4_sp_in_1'), ref('account_tax_template_p_iva4_sp_in_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_10_11'), ref('mod_303_14_15_purchase'), ref('mod_303_36_37'), ref('mod_303_40_41')])]"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_4"/>
|
||||
</record>
|
||||
<record id="account_tax_template_p_irpf21te" model="account.tax.template">
|
||||
@@ -1390,6 +1402,7 @@
|
||||
<field name="amount_type">group</field>
|
||||
<field name="amount" eval="100"/>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva4_isp_1'), ref('account_tax_template_p_iva4_isp_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_28_29'), ref('mod_303_40_41'), ref('mod_303_12_13'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_4"/>
|
||||
</record>
|
||||
@@ -1426,6 +1439,7 @@
|
||||
<field name="amount_type">group</field>
|
||||
<field name="amount" eval="100"/>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva10_isp_1'), ref('account_tax_template_p_iva10_isp_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_28_29'), ref('mod_303_40_41'), ref('mod_303_12_13'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_10"/>
|
||||
</record>
|
||||
@@ -1462,6 +1476,7 @@
|
||||
<field name="amount_type">group</field>
|
||||
<field name="amount" eval="100"/>
|
||||
<field name="children_tax_ids" eval="[(6, 0, [ref('account_tax_template_p_iva21_isp_1'), ref('account_tax_template_p_iva21_isp_2')])]"/>
|
||||
<field name="tag_ids" eval="[(6, False, [ref('mod_303_28_29'), ref('mod_303_40_41'), ref('mod_303_12_13'), ref('mod_303_14_15_purchase')])]"/>
|
||||
<field name="chart_template_id" ref="l10n_es.account_chart_template_common"/>
|
||||
<field name="tax_group_id" ref="tax_group_iva_21"/>
|
||||
</record>
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
</template>
|
||||
|
||||
<template id="message_origin_link">
|
||||
<p>This <t t-esc="self._description.lower()"/> has been <span t-if="edit">modified</span><span t-if="not edit">created</span> from:
|
||||
<p>This <t t-esc="self.env['ir.model']._get(self._name).name.lower()"/> has been <span t-if="edit">modified</span><span t-if="not edit">created</span> from:
|
||||
<t t-foreach="origin" t-as="o">
|
||||
<a href="#" t-att-data-oe-model="o._name" t-att-data-oe-id="o.id"> <t t-esc="o.display_name"/></a><span t-if="origin.ids[-1:] != o.ids">, </span>
|
||||
</t>
|
||||
|
||||
@@ -399,7 +399,7 @@
|
||||
<input type="text" name="city" t-attf-class="form-control #{error.get('city') and 'is-invalid' or ''}" t-att-value="city or partner.city" />
|
||||
</div>
|
||||
<div t-attf-class="form-group #{error.get('zip') and 'o_has_error' or ''} col-xl-6">
|
||||
<label class="col-form-label" for="zipcode">Zip / Postal Code</label>
|
||||
<label class="col-form-label label-optional" for="zipcode">Zip / Postal Code</label>
|
||||
<input type="text" name="zipcode" t-attf-class="form-control #{error.get('zip') and 'is-invalid' or ''}" t-att-value="zipcode or partner.zip" />
|
||||
</div>
|
||||
<div t-attf-class="form-group #{error.get('country_id') and 'o_has_error' or ''} col-xl-6">
|
||||
|
||||
@@ -1046,7 +1046,8 @@ class SaleOrderLine(models.Model):
|
||||
for line in self:
|
||||
fpos = line.order_id.fiscal_position_id or line.order_id.partner_id.property_account_position_id
|
||||
# If company_id is set, always filter taxes by the company
|
||||
taxes = line.product_id.taxes_id.filtered(lambda r: not line.company_id or r.company_id == line.company_id)
|
||||
line_company_id = line.company_id or line.order_id.company_id
|
||||
taxes = line.product_id.taxes_id.filtered(lambda r: not line_company_id or r.company_id == line_company_id)
|
||||
line.tax_id = fpos.map_tax(taxes, line.product_id, line.order_id.partner_shipping_id) if fpos else taxes
|
||||
|
||||
@api.model
|
||||
|
||||
@@ -238,3 +238,56 @@ class TestSaleOrder(TestCommonSaleNoChart):
|
||||
self.assertEquals(self.sale_order.amount_total,
|
||||
self.sale_order.amount_untaxed + self.sale_order.amount_tax,
|
||||
'Taxes should be applied')
|
||||
|
||||
def test_so_create_multicompany(self):
|
||||
# Preparing test Data
|
||||
user_demo = self.env.ref('base.user_demo')
|
||||
company_1 = self.env.ref('base.main_company')
|
||||
company_2 = self.env['res.company'].create({
|
||||
'name': 'company 2',
|
||||
'parent_id': company_1.id,
|
||||
})
|
||||
user_demo.write({
|
||||
'groups_id': [(4, self.env.ref('sales_team.group_sale_manager').id, False)],
|
||||
'company_ids': [(6, False, [company_1.id])],
|
||||
'company_id': company_1.id,
|
||||
})
|
||||
|
||||
so_partner = self.env.ref('base.res_partner_2')
|
||||
so_partner.write({
|
||||
'property_account_position_id': False,
|
||||
})
|
||||
|
||||
tax_company_1 = self.env['account.tax'].create({
|
||||
'name': 'T1',
|
||||
'amount': 90,
|
||||
'company_id': company_1.id,
|
||||
})
|
||||
|
||||
tax_company_2 = self.env['account.tax'].create({
|
||||
'name': 'T2',
|
||||
'amount': 90,
|
||||
'company_id': company_2.id,
|
||||
})
|
||||
|
||||
product_shared = self.env['product.template'].create({
|
||||
'name': 'shared product',
|
||||
'taxes_id': [(6, False, [tax_company_1.id, tax_company_2.id])],
|
||||
})
|
||||
|
||||
# Use case
|
||||
so_1 = self.env['sale.order'].sudo(user_demo.id).create({
|
||||
'partner_id': so_partner.id,
|
||||
'company_id': company_1.id,
|
||||
})
|
||||
so_1.invalidate_cache()
|
||||
|
||||
# This is what is done when importing the csv lines (on sale.order):
|
||||
# id,order_line/product_id
|
||||
# __export__.sale_order_37_1bb960ba,Product name
|
||||
so_1.write({
|
||||
'order_line': [(0, False, {'product_id': product_shared.product_variant_id.id, 'order_id': so_1.id})],
|
||||
})
|
||||
|
||||
self.assertEqual(set(so_1.order_line.tax_id.ids), set([tax_company_1.id]),
|
||||
'Only taxes from the right company are put by default')
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
<field name="name">stock_move multi-company</field>
|
||||
<field name="model_id" search="[('model','=','stock.move')]" model="ir.model"/>
|
||||
<field name="global" eval="True"/>
|
||||
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
|
||||
<field name="domain_force">['|','|',('company_id','=',False),('company_id','child_of',[user.company_id.id]),('location_dest_id.company_id', '=', False)]</field>
|
||||
</record>
|
||||
|
||||
<record model="ir.rule" id="stock_quant_rule">
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
<record model="ir.ui.view" id="product_form_view_procurement_button">
|
||||
<field name="name">product.product.procurement</field>
|
||||
<field name="model">product.product</field>
|
||||
<field name="groups_id" eval="[(4, ref('stock.group_stock_user'))]"/>
|
||||
<field name="inherit_id" ref="product.product_normal_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<data>
|
||||
@@ -265,6 +266,7 @@
|
||||
<record model="ir.ui.view" id="product_template_form_view_procurement_button">
|
||||
<field name="name">product.template_procurement</field>
|
||||
<field name="model">product.template</field>
|
||||
<field name="groups_id" eval="[(4, ref('stock.group_stock_user'))]"/>
|
||||
<field name="inherit_id" ref="product.product_template_only_form_view"/>
|
||||
<field name="arch" type="xml">
|
||||
<data>
|
||||
|
||||
@@ -488,7 +488,7 @@ class TestHeavyMailPerformance(TransactionCase):
|
||||
})
|
||||
self.assertEqual(rec.message_partner_ids, self.partners | self.env.user.partner_id)
|
||||
|
||||
with self.assertQueryCount(__system__=61, emp=79): # com runbot: 61 - 75 // test_mail only: 60 - 72
|
||||
with self.assertQueryCount(__system__=62, emp=79): # com runbot: 61 - 75 // test_mail only: 60 - 72
|
||||
rec.write({'user_id': self.user_portal.id})
|
||||
|
||||
self.assertEqual(rec.message_partner_ids, self.partners | self.env.user.partner_id | self.user_portal.partner_id)
|
||||
|
||||
@@ -198,11 +198,11 @@ def concat_xml(file_list):
|
||||
|
||||
:param list(str) file_list: list of files to check
|
||||
:returns: (concatenation_result, checksum)
|
||||
:rtype: (str, str)
|
||||
:rtype: (bytes, str)
|
||||
"""
|
||||
checksum = hashlib.new('sha1')
|
||||
if not file_list:
|
||||
return '', checksum.hexdigest()
|
||||
return b'', checksum.hexdigest()
|
||||
|
||||
root = None
|
||||
for fname in file_list:
|
||||
|
||||
@@ -857,6 +857,7 @@ var BasicModel = AbstractModel.extend({
|
||||
});
|
||||
_.each(fields, function (field) {
|
||||
var dataPoint;
|
||||
record.data[field.name] = null;
|
||||
if (field.type === 'many2one') {
|
||||
if (field.value) {
|
||||
var id = _.isArray(field.value) ? field.value[0] : field.value;
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
Vietnam, 2019-07-27
|
||||
|
||||
I hereby agree to the terms of the Odoo Individual Contributor License
|
||||
Agreement v1.0.
|
||||
|
||||
I declare that I am authorized and able to make this agreement and sign this
|
||||
declaration.
|
||||
|
||||
Signed,
|
||||
|
||||
Anh Vu <vuna2004@gmail.com> https://github.com/anhvu-sg
|
||||
@@ -0,0 +1,11 @@
|
||||
Denmark, 2019-07-24
|
||||
|
||||
I hereby agree to the terms of the Odoo Individual Contributor License
|
||||
Agreement v1.0.
|
||||
|
||||
I declare that I am authorized and able to make this agreement and sign this
|
||||
declaration.
|
||||
|
||||
Signed,
|
||||
|
||||
Stefan Andersen <stfnandersen@gmail.com> https://github.com/stfnndrsn
|
||||
@@ -25,9 +25,11 @@
|
||||
<rng:optional><rng:attribute name="consolidation"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="consolidation_max"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="consolidation_exclude"/></rng:optional>
|
||||
<!-- Shouldn't be forward ported to >= saas-12.2 -->
|
||||
<rng:optional><rng:attribute name="duration_unit"/></rng:optional>
|
||||
<rng:empty/>
|
||||
<rng:optional><rng:attribute name="drag_resize"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="relative_field"/></rng:optional>
|
||||
<rng:optional><rng:attribute name="action"/></rng:optional>
|
||||
<rng:empty/>
|
||||
</rng:element>
|
||||
</rng:define>
|
||||
<rng:start>
|
||||
|
||||
Reference in New Issue
Block a user