mirror of
https://github.com/OCA/knowledge.git
synced 2025-07-16 04:02:56 -06:00
Updated from template
This commit is contained in:
parent
acebd9ca3b
commit
0e785715f0
@ -1,8 +1,8 @@
|
|||||||
# Do NOT update manually; changes here will be overwritten by Copier
|
# Do NOT update manually; changes here will be overwritten by Copier
|
||||||
_commit: v1.14.2
|
_commit: v1.17.2-11-g69f3b9a
|
||||||
_src_path: gh:oca/oca-addons-repo-template
|
_src_path: gh:oca/oca-addons-repo-template
|
||||||
|
additional_ruff_rules: []
|
||||||
ci: GitHub
|
ci: GitHub
|
||||||
dependency_installation_mode: PIP
|
|
||||||
generate_requirements_txt: true
|
generate_requirements_txt: true
|
||||||
github_check_license: true
|
github_check_license: true
|
||||||
github_ci_extra_env: {}
|
github_ci_extra_env: {}
|
||||||
@ -11,14 +11,16 @@ github_enable_makepot: true
|
|||||||
github_enable_stale_action: true
|
github_enable_stale_action: true
|
||||||
github_enforce_dev_status_compatibility: true
|
github_enforce_dev_status_compatibility: true
|
||||||
include_wkhtmltopdf: false
|
include_wkhtmltopdf: false
|
||||||
|
odoo_test_flavor: Both
|
||||||
odoo_version: 16.0
|
odoo_version: 16.0
|
||||||
org_name: Odoo Community Association (OCA)
|
org_name: Odoo Community Association (OCA)
|
||||||
org_slug: OCA
|
org_slug: OCA
|
||||||
rebel_module_groups: []
|
rebel_module_groups: []
|
||||||
repo_description: 'TODO: add repo description.'
|
repo_description: Knowlesge management addons. Also has some usefull tools to handle
|
||||||
|
attachments
|
||||||
repo_name: knowledge
|
repo_name: knowledge
|
||||||
repo_slug: knowledge
|
repo_slug: knowledge
|
||||||
repo_website: https://github.com/OCA/knowledge
|
repo_website: https://github.com/OCA/knowledge
|
||||||
travis_apt_packages: []
|
use_pyproject_toml: false
|
||||||
travis_apt_sources: []
|
use_ruff: true
|
||||||
|
|
||||||
|
@ -22,6 +22,7 @@ globals:
|
|||||||
odoo: readonly
|
odoo: readonly
|
||||||
openerp: readonly
|
openerp: readonly
|
||||||
owl: readonly
|
owl: readonly
|
||||||
|
luxon: readonly
|
||||||
|
|
||||||
# Styling is handled by Prettier, so we only need to enable AST rules;
|
# Styling is handled by Prettier, so we only need to enable AST rules;
|
||||||
# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
|
# see https://github.com/OCA/maintainer-quality-tools/pull/618#issuecomment-558576890
|
||||||
|
12
.flake8
12
.flake8
@ -1,12 +0,0 @@
|
|||||||
[flake8]
|
|
||||||
max-line-length = 88
|
|
||||||
max-complexity = 16
|
|
||||||
# B = bugbear
|
|
||||||
# B9 = bugbear opinionated (incl line length)
|
|
||||||
select = C,E,F,W,B,B9
|
|
||||||
# E203: whitespace before ':' (black behaviour)
|
|
||||||
# E501: flake8 line length (covered by bugbear B950)
|
|
||||||
# W503: line break before binary operator (black behaviour)
|
|
||||||
ignore = E203,E501,W503
|
|
||||||
per-file-ignores=
|
|
||||||
__init__.py:F401
|
|
13
.github/workflows/pre-commit.yml
vendored
13
.github/workflows/pre-commit.yml
vendored
@ -13,8 +13,10 @@ jobs:
|
|||||||
pre-commit:
|
pre-commit:
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: actions/setup-python@v2
|
- uses: actions/setup-python@v2
|
||||||
|
with:
|
||||||
|
python-version: "3.11"
|
||||||
- name: Get python version
|
- name: Get python version
|
||||||
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
|
run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV
|
||||||
- uses: actions/cache@v1
|
- uses: actions/cache@v1
|
||||||
@ -25,6 +27,15 @@ jobs:
|
|||||||
run: pip install pre-commit
|
run: pip install pre-commit
|
||||||
- name: Run pre-commit
|
- name: Run pre-commit
|
||||||
run: pre-commit run --all-files --show-diff-on-failure --color=always
|
run: pre-commit run --all-files --show-diff-on-failure --color=always
|
||||||
|
env:
|
||||||
|
# Consider valid a PR that changes README fragments but doesn't
|
||||||
|
# change the README.rst file itself. It's not really a problem
|
||||||
|
# because the bot will update it anyway after merge. This way, we
|
||||||
|
# lower the barrier for functional contributors that want to fix the
|
||||||
|
# readme fragments, while still letting developers get README
|
||||||
|
# auto-generated (which also helps functionals when using runboat).
|
||||||
|
# DOCS https://pre-commit.com/#temporarily-disabling-hooks
|
||||||
|
SKIP: oca-gen-addon-readme
|
||||||
- name: Check that all files generated by pre-commit are in git
|
- name: Check that all files generated by pre-commit are in git
|
||||||
run: |
|
run: |
|
||||||
newfiles="$(git ls-files --others --exclude-from=.gitignore)"
|
newfiles="$(git ls-files --others --exclude-from=.gitignore)"
|
||||||
|
6
.github/workflows/test.yml
vendored
6
.github/workflows/test.yml
vendored
@ -14,7 +14,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
name: Detect unreleased dependencies
|
name: Detect unreleased dependencies
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- run: |
|
- run: |
|
||||||
for reqfile in requirements.txt test-requirements.txt ; do
|
for reqfile in requirements.txt test-requirements.txt ; do
|
||||||
if [ -f ${reqfile} ] ; then
|
if [ -f ${reqfile} ] ; then
|
||||||
@ -36,10 +36,10 @@ jobs:
|
|||||||
matrix:
|
matrix:
|
||||||
include:
|
include:
|
||||||
- container: ghcr.io/oca/oca-ci/py3.10-odoo16.0:latest
|
- container: ghcr.io/oca/oca-ci/py3.10-odoo16.0:latest
|
||||||
makepot: "true"
|
|
||||||
name: test with Odoo
|
name: test with Odoo
|
||||||
- container: ghcr.io/oca/oca-ci/py3.10-ocb16.0:latest
|
- container: ghcr.io/oca/oca-ci/py3.10-ocb16.0:latest
|
||||||
name: test with OCB
|
name: test with OCB
|
||||||
|
makepot: "true"
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:12.0
|
image: postgres:12.0
|
||||||
@ -50,7 +50,7 @@ jobs:
|
|||||||
ports:
|
ports:
|
||||||
- 5432:5432
|
- 5432:5432
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
with:
|
with:
|
||||||
persist-credentials: false
|
persist-credentials: false
|
||||||
- name: Install addons and dependencies
|
- name: Install addons and dependencies
|
||||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -3,6 +3,7 @@ __pycache__/
|
|||||||
*.py[cod]
|
*.py[cod]
|
||||||
/.venv
|
/.venv
|
||||||
/.pytest_cache
|
/.pytest_cache
|
||||||
|
/.ruff_cache
|
||||||
|
|
||||||
# C extensions
|
# C extensions
|
||||||
*.so
|
*.so
|
||||||
|
13
.isort.cfg
13
.isort.cfg
@ -1,13 +0,0 @@
|
|||||||
[settings]
|
|
||||||
; see https://github.com/psf/black
|
|
||||||
multi_line_output=3
|
|
||||||
include_trailing_comma=True
|
|
||||||
force_grid_wrap=0
|
|
||||||
combine_as_imports=True
|
|
||||||
use_parentheses=True
|
|
||||||
line_length=88
|
|
||||||
known_odoo=odoo
|
|
||||||
known_odoo_addons=odoo.addons
|
|
||||||
sections=FUTURE,STDLIB,THIRDPARTY,ODOO,ODOO_ADDONS,FIRSTPARTY,LOCALFOLDER
|
|
||||||
default_section=THIRDPARTY
|
|
||||||
ensure_newline_before_comments = True
|
|
@ -12,6 +12,10 @@ exclude: |
|
|||||||
/static/(src/)?lib/|
|
/static/(src/)?lib/|
|
||||||
# Repos using Sphinx to generate docs don't need prettying
|
# Repos using Sphinx to generate docs don't need prettying
|
||||||
^docs/_templates/.*\.html$|
|
^docs/_templates/.*\.html$|
|
||||||
|
# Don't bother non-technical authors with formatting issues in docs
|
||||||
|
readme/.*\.(rst|md)$|
|
||||||
|
# Ignore build and dist directories in addons
|
||||||
|
/build/|/dist/|
|
||||||
# You don't usually want a bot to modify your legal texts
|
# You don't usually want a bot to modify your legal texts
|
||||||
(LICENSE.*|COPYING.*)
|
(LICENSE.*|COPYING.*)
|
||||||
default_language_version:
|
default_language_version:
|
||||||
@ -33,27 +37,24 @@ repos:
|
|||||||
language: fail
|
language: fail
|
||||||
files: '[a-zA-Z0-9_]*/i18n/en\.po$'
|
files: '[a-zA-Z0-9_]*/i18n/en\.po$'
|
||||||
- repo: https://github.com/oca/maintainer-tools
|
- repo: https://github.com/oca/maintainer-tools
|
||||||
rev: 4cd2b852214dead80822e93e6749b16f2785b2fe
|
rev: 568cacd1d6eef453063a524a5ce63dcd49c7259b
|
||||||
hooks:
|
hooks:
|
||||||
# update the NOT INSTALLABLE ADDONS section above
|
# update the NOT INSTALLABLE ADDONS section above
|
||||||
- id: oca-update-pre-commit-excluded-addons
|
- id: oca-update-pre-commit-excluded-addons
|
||||||
- id: oca-fix-manifest-website
|
- id: oca-fix-manifest-website
|
||||||
args: ["https://github.com/OCA/knowledge"]
|
args: ["https://github.com/OCA/knowledge"]
|
||||||
- repo: https://github.com/myint/autoflake
|
- id: oca-gen-addon-readme
|
||||||
rev: v1.6.1
|
|
||||||
hooks:
|
|
||||||
- id: autoflake
|
|
||||||
args:
|
args:
|
||||||
- --expand-star-imports
|
- --addons-dir=.
|
||||||
- --ignore-init-module-imports
|
- --branch=16.0
|
||||||
- --in-place
|
- --org-name=OCA
|
||||||
- --remove-all-unused-imports
|
- --repo-name=knowledge
|
||||||
- --remove-duplicate-keys
|
- --if-source-changed
|
||||||
- --remove-unused-variables
|
- repo: https://github.com/OCA/odoo-pre-commit-hooks
|
||||||
- repo: https://github.com/psf/black
|
rev: v0.0.25
|
||||||
rev: 22.8.0
|
|
||||||
hooks:
|
hooks:
|
||||||
- id: black
|
- id: oca-checks-odoo-module
|
||||||
|
- id: oca-checks-po
|
||||||
- repo: https://github.com/pre-commit/mirrors-prettier
|
- repo: https://github.com/pre-commit/mirrors-prettier
|
||||||
rev: v2.7.1
|
rev: v2.7.1
|
||||||
hooks:
|
hooks:
|
||||||
@ -95,19 +96,6 @@ repos:
|
|||||||
- id: check-xml
|
- id: check-xml
|
||||||
- id: mixed-line-ending
|
- id: mixed-line-ending
|
||||||
args: ["--fix=lf"]
|
args: ["--fix=lf"]
|
||||||
- repo: https://github.com/asottile/pyupgrade
|
|
||||||
rev: v2.38.2
|
|
||||||
hooks:
|
|
||||||
- id: pyupgrade
|
|
||||||
args: ["--keep-percent-format"]
|
|
||||||
- repo: https://github.com/PyCQA/isort
|
|
||||||
rev: 5.12.0
|
|
||||||
hooks:
|
|
||||||
- id: isort
|
|
||||||
name: isort except __init__.py
|
|
||||||
args:
|
|
||||||
- --settings=.
|
|
||||||
exclude: /__init__\.py$
|
|
||||||
- repo: https://github.com/acsone/setuptools-odoo
|
- repo: https://github.com/acsone/setuptools-odoo
|
||||||
rev: 3.1.8
|
rev: 3.1.8
|
||||||
hooks:
|
hooks:
|
||||||
@ -118,14 +106,14 @@ repos:
|
|||||||
- requirements.txt
|
- requirements.txt
|
||||||
- --header
|
- --header
|
||||||
- "# generated from manifests external_dependencies"
|
- "# generated from manifests external_dependencies"
|
||||||
- repo: https://github.com/PyCQA/flake8
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
||||||
rev: 3.9.2
|
rev: v0.1.3
|
||||||
hooks:
|
hooks:
|
||||||
- id: flake8
|
- id: ruff
|
||||||
name: flake8
|
args: [--fix, --exit-non-zero-on-fix]
|
||||||
additional_dependencies: ["flake8-bugbear==21.9.2"]
|
- id: ruff-format
|
||||||
- repo: https://github.com/OCA/pylint-odoo
|
- repo: https://github.com/OCA/pylint-odoo
|
||||||
rev: 7.0.2
|
rev: v8.0.19
|
||||||
hooks:
|
hooks:
|
||||||
- id: pylint_odoo
|
- id: pylint_odoo
|
||||||
name: pylint with optional checks
|
name: pylint with optional checks
|
||||||
|
12
.pylintrc
12
.pylintrc
@ -5,12 +5,12 @@ load-plugins=pylint_odoo
|
|||||||
score=n
|
score=n
|
||||||
|
|
||||||
[ODOOLINT]
|
[ODOOLINT]
|
||||||
readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
|
readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
|
||||||
manifest_required_authors=Odoo Community Association (OCA)
|
manifest-required-authors=Odoo Community Association (OCA)
|
||||||
manifest_required_keys=license
|
manifest-required-keys=license
|
||||||
manifest_deprecated_keys=description,active
|
manifest-deprecated-keys=description,active
|
||||||
license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
|
license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
|
||||||
valid_odoo_versions=16.0
|
valid-odoo-versions=16.0
|
||||||
|
|
||||||
[MESSAGES CONTROL]
|
[MESSAGES CONTROL]
|
||||||
disable=all
|
disable=all
|
||||||
|
@ -4,12 +4,12 @@ load-plugins=pylint_odoo
|
|||||||
score=n
|
score=n
|
||||||
|
|
||||||
[ODOOLINT]
|
[ODOOLINT]
|
||||||
readme_template_url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
|
readme-template-url="https://github.com/OCA/maintainer-tools/blob/master/template/module/README.rst"
|
||||||
manifest_required_authors=Odoo Community Association (OCA)
|
manifest-required-authors=Odoo Community Association (OCA)
|
||||||
manifest_required_keys=license
|
manifest-required-keys=license
|
||||||
manifest_deprecated_keys=description,active
|
manifest-deprecated-keys=description,active
|
||||||
license_allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
|
license-allowed=AGPL-3,GPL-2,GPL-2 or any later version,GPL-3,GPL-3 or any later version,LGPL-3
|
||||||
valid_odoo_versions=16.0
|
valid-odoo-versions=16.0
|
||||||
|
|
||||||
[MESSAGES CONTROL]
|
[MESSAGES CONTROL]
|
||||||
disable=all
|
disable=all
|
||||||
|
29
.ruff.toml
Normal file
29
.ruff.toml
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
target-version = "py310"
|
||||||
|
fix = true
|
||||||
|
|
||||||
|
[lint]
|
||||||
|
extend-select = [
|
||||||
|
"B",
|
||||||
|
"C90",
|
||||||
|
"I", # isort
|
||||||
|
"UP", # pyupgrade
|
||||||
|
]
|
||||||
|
exclude = ["setup/*"]
|
||||||
|
|
||||||
|
[format]
|
||||||
|
exclude = ["setup/*"]
|
||||||
|
|
||||||
|
[per-file-ignores]
|
||||||
|
"__init__.py" = ["F401", "I001"] # ignore unused and unsorted imports in __init__.py
|
||||||
|
"__manifest__.py" = ["B018"] # useless expression
|
||||||
|
|
||||||
|
[isort]
|
||||||
|
section-order = ["future", "standard-library", "third-party", "odoo", "odoo-addons", "first-party", "local-folder"]
|
||||||
|
|
||||||
|
[isort.sections]
|
||||||
|
"odoo" = ["odoo"]
|
||||||
|
"odoo-addons" = ["odoo.addons"]
|
||||||
|
|
||||||
|
[mccabe]
|
||||||
|
max-complexity = 16
|
@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
# knowledge
|
# knowledge
|
||||||
|
|
||||||
TODO: add repo description.
|
Knowlesge management addons. Also has some usefull tools to handle attachments
|
||||||
|
|
||||||
<!-- /!\ do not modify below this line -->
|
<!-- /!\ do not modify below this line -->
|
||||||
|
|
||||||
|
@ -5,7 +5,6 @@ from odoo import _, models
|
|||||||
|
|
||||||
|
|
||||||
class IrAttachmentActionDownloadMixin(models.AbstractModel):
|
class IrAttachmentActionDownloadMixin(models.AbstractModel):
|
||||||
|
|
||||||
_name = "ir.attachment.action_download"
|
_name = "ir.attachment.action_download"
|
||||||
_description = """
|
_description = """
|
||||||
Mixin to help download attachments linked to record(s).
|
Mixin to help download attachments linked to record(s).
|
||||||
|
@ -11,7 +11,7 @@ from .test_attachment_zipped_download import TestAttachmentZippedDownloadBase
|
|||||||
class TestMixin(SavepointCase, TestAttachmentZippedDownloadBase):
|
class TestMixin(SavepointCase, TestAttachmentZippedDownloadBase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super(TestMixin, cls).setUpClass()
|
super().setUpClass()
|
||||||
cls.loader = FakeModelLoader(cls.env, cls.__module__)
|
cls.loader = FakeModelLoader(cls.env, cls.__module__)
|
||||||
cls.addClassCleanup(cls.loader.restore_registry)
|
cls.addClassCleanup(cls.loader.restore_registry)
|
||||||
cls.loader.backup_registry()
|
cls.loader.backup_registry()
|
||||||
|
@ -106,7 +106,7 @@ class DocumentPage(models.Model):
|
|||||||
action = parent.menu_id.action
|
action = parent.menu_id.action
|
||||||
parent = parent.parent_id
|
parent = parent.parent_id
|
||||||
if action:
|
if action:
|
||||||
url += "&action={}".format(action.id)
|
url += f"&action={action.id}"
|
||||||
rec.backend_url = url
|
rec.backend_url = url
|
||||||
|
|
||||||
@api.constrains("parent_id")
|
@api.constrains("parent_id")
|
||||||
@ -122,7 +122,7 @@ class DocumentPage(models.Model):
|
|||||||
]
|
]
|
||||||
r = ""
|
r = ""
|
||||||
if link:
|
if link:
|
||||||
r = '<a href="{}">{}</a>'.format(self.backend_url, self.name)
|
r = f'<a href="{self.backend_url}">{self.name}</a>'
|
||||||
if index:
|
if index:
|
||||||
r += "<ul>" + "".join(index) + "</ul>"
|
r += "<ul>" + "".join(index) + "</ul>"
|
||||||
return r
|
return r
|
||||||
|
@ -61,8 +61,8 @@ class DocumentPageHistory(models.Model):
|
|||||||
return diff.make_table(
|
return diff.make_table(
|
||||||
line1,
|
line1,
|
||||||
line2,
|
line2,
|
||||||
"Revision-{}".format(v1),
|
f"Revision-{v1}",
|
||||||
"Revision-{}".format(v2),
|
f"Revision-{v2}",
|
||||||
context=True,
|
context=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ class TestDocumentPage(common.TransactionCase):
|
|||||||
page = self.page_obj.create({"name": "Test Page 3", "content": "Test content"})
|
page = self.page_obj.create({"name": "Test Page 3", "content": "Test content"})
|
||||||
self.assertEqual(
|
self.assertEqual(
|
||||||
page.backend_url,
|
page.backend_url,
|
||||||
"/web#id={}&model=document.page&view_type=form".format(page.id),
|
f"/web#id={page.id}&model=document.page&view_type=form",
|
||||||
)
|
)
|
||||||
menu = self.env.ref("document_knowledge.menu_document")
|
menu = self.env.ref("document_knowledge.menu_document")
|
||||||
page.menu_id = menu
|
page.menu_id = menu
|
||||||
|
@ -5,7 +5,6 @@ from odoo import api, fields, models
|
|||||||
|
|
||||||
|
|
||||||
class DocumentPage(models.Model):
|
class DocumentPage(models.Model):
|
||||||
|
|
||||||
_inherit = "document.page"
|
_inherit = "document.page"
|
||||||
|
|
||||||
group_ids = fields.Many2many(
|
group_ids = fields.Many2many(
|
||||||
|
@ -47,7 +47,6 @@ except Exception:
|
|||||||
|
|
||||||
|
|
||||||
class DocumentPage(models.Model):
|
class DocumentPage(models.Model):
|
||||||
|
|
||||||
_inherit = "document.page"
|
_inherit = "document.page"
|
||||||
|
|
||||||
reference = fields.Char(
|
reference = fields.Char(
|
||||||
@ -144,7 +143,7 @@ class DocumentPage(models.Model):
|
|||||||
try:
|
try:
|
||||||
self._validate_reference(reference=reference)
|
self._validate_reference(reference=reference)
|
||||||
vals["reference"] = reference
|
vals["reference"] = reference
|
||||||
except ValidationError: # pylint: disable=W7938
|
except ValidationError: # pylint: disable=W8138
|
||||||
# Do not fill reference.
|
# Do not fill reference.
|
||||||
pass
|
pass
|
||||||
return super(DocumentPage, self).create(vals_list)
|
return super().create(vals_list)
|
||||||
|
@ -8,7 +8,7 @@ from odoo.tests.common import TransactionCase
|
|||||||
class TestDocumentReference(TransactionCase):
|
class TestDocumentReference(TransactionCase):
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpClass(cls):
|
def setUpClass(cls):
|
||||||
super(TestDocumentReference, cls).setUpClass()
|
super().setUpClass()
|
||||||
cls.page_obj = cls.env["document.page"]
|
cls.page_obj = cls.env["document.page"]
|
||||||
cls.history_obj = cls.env["document.page.history"]
|
cls.history_obj = cls.env["document.page.history"]
|
||||||
cls.page1 = cls.page_obj.create(
|
cls.page1 = cls.page_obj.create(
|
||||||
|
Loading…
Reference in New Issue
Block a user