Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[17.0][MIG] report py3o: Migration to 17.0 #954

Open
wants to merge 138 commits into
base: 17.0
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
c820a10
Move to report_py3o after import from HG
lmignon Oct 3, 2016
6d43f6e
Add setup
lmignon Oct 3, 2016
3fd7b8b
[FIX] View inheritance may not use attribute 'string' as a selector.
lmignon Oct 3, 2016
3afe566
[IMP] New API + Short Hearder
lmignon Oct 4, 2016
89cf3e6
Remove unicode string
lmignon Oct 4, 2016
871a1cc
[IMP] Add the possiblity to get the template from an absolute path on…
lmignon Oct 4, 2016
c8f3534
[IMP] Allow user to use local fusion
lmignon Oct 4, 2016
aa7448e
Add a simple way to extend the parser context
lmignon Oct 4, 2016
b62afdb
Remove ACL on removed model
lmignon Oct 4, 2016
dfe676c
Improve filetype selection name
lmignon Oct 4, 2016
ec931d9
Fix native flag
lmignon Oct 4, 2016
1a96946
fixed missing comma in model definition
faide Oct 4, 2016
f4a63a4
Add simple tests and fix call to fusion server
lmignon Oct 4, 2016
3ad6df1
Fix skip fusion on server when the fusion is local
lmignon Oct 4, 2016
3c59e37
Improve tests
lmignon Oct 4, 2016
ca74e47
Replace openerp element by odoo
lmignon Oct 4, 2016
4d2cf82
Small usability improvements
alexis-via Oct 4, 2016
663c3d3
Take into accounts most remarks of @lasley
alexis-via Oct 5, 2016
e4ff94c
Replace plain SQL by orm
lmignon Oct 6, 2016
8a76fcb
rename module ir_report to ir_actions_report_xml
lmignon Oct 6, 2016
e73a723
Add more tests and fixes issues found by tests
lmignon Oct 6, 2016
ce0ba0d
[FIX] Check constrains only if report_type == 'py3o'
lmignon Oct 12, 2016
78fad85
report_py3o: full installation procedure in README
alexis-via Oct 14, 2016
d3a53ea
Port report_py3o to Odoo v10
alexis-via Oct 14, 2016
766a37a
Update version numbers
alexis-via Oct 14, 2016
a468813
PEP8 fix
alexis-via Oct 14, 2016
f175749
Update README
alexis-via Nov 4, 2016
50222bd
FIX double dot in filename
alexis-via Dec 19, 2016
d634eac
Add access to report_xml object in report
alexis-via Dec 19, 2016
89a6d40
FIX Adapt test suite to my recent commit to avoid double dot on filen…
alexis-via Dec 20, 2016
39925a5
[IMP] Escape 'False' when rendering value
lmignon Nov 16, 2016
4c1738f
[IMP] Replace old style parser by TransientModel
lmignon Dec 17, 2016
0f511ab
[FIX] imports
Dec 22, 2016
123c916
[IMP] Minimizes memory consumption
lmignon Dec 23, 2016
0e1928b
* travis.yml
Jan 9, 2017
ac5208a
Update and improve README instructions to setup py3o
alexis-via Jan 25, 2017
10a7c87
[IMP] Allow to override/extend the way we get the fallback template
lmignon Jan 25, 2017
27434ac
[FIX] report_py3o: fix exception when report must be saved as attache…
lmignon Feb 23, 2017
6a60f89
OCA Transbot updated translations from Transifex
oca-transbot Feb 25, 2017
73f079c
[FIX] delete PDF invoice attachment on invoice back to draft (native …
alexis-via Mar 2, 2017
abeed67
[IMP] report_py3o: update authors and contributors
lmignon Mar 6, 2017
21cf746
OCA Transbot updated translations from Transifex
oca-transbot Mar 11, 2017
3564141
[IMP] report_py3o: prevent injections when retrieving the template fr…
lmignon Mar 8, 2017
21eeedc
OCA Transbot updated translations from Transifex
oca-transbot Mar 18, 2017
158641d
report_py3o: bump version following last merge
sbidoul Mar 22, 2017
dabca6b
Fix py3o freeze when using server fusion
guewen Apr 3, 2017
d8abb61
Pass option for escaping False values to server
guewen Apr 5, 2017
cb74b08
Add option py3o_multi_in_one for Py3o reports
alexis-via Apr 12, 2017
4f3a6b3
OCA Transbot updated translations from Transifex
oca-transbot May 1, 2017
5c80264
[FIX] report_py3o: must return the path to the report
lmignon May 30, 2017
4298b0b
[IMP] report_py3o: Take into account print_report_name
lmignon Feb 17, 2017
ba7d1ac
OCA Transbot updated translations from Transifex
oca-transbot Jun 3, 2017
5b79ad8
[IMP] report_py3o: Allows to interpret \n and \t in texts, cleans htm…
omar7r Oct 31, 2017
ae04d1f
[FIX] Deletes an unnecessary function call
omar7r Nov 7, 2017
b0280c9
[FIX] report_py3o: Removes api.one
omar7r Nov 9, 2017
cf9f0c9
[FIX] report_py3o: Import new dependencies in try...except
omar7r Nov 9, 2017
a597689
[UPD] report_py3o: Bump version
omar7r Nov 10, 2017
a82aa72
OCA Transbot updated translations from Transifex
oca-transbot Nov 25, 2017
36617a8
[RFR] split off the fusion server to its own module
hbrunn Dec 17, 2017
b9af10e
Improve README.rst for report_py3o* modules
alexis-via Jan 10, 2018
b03e390
[ADD] migration script to install report_py3o_fusion_server on upgrades
hbrunn Jan 11, 2018
7a24542
OCA Transbot updated translations from Transifex
oca-transbot Jan 16, 2018
ef9cc5d
[FIX] fallback to libreoffice conversion when no server is configured
hbrunn Mar 21, 2018
334fdba
[FIX] report_py3o: Bump version number
pedrobaeza Mar 26, 2018
0ce7376
[FIX]report_py3o: Escape correctly html characters.
jesusVMayor Dec 19, 2017
6d62bd0
[IMP] check for template data, not for the id
hbrunn Apr 16, 2018
4d8c356
[FIX] If this is not a py3o report, do nothing at all. In some cases …
SimoRubi May 2, 2018
2f8364e
report_py3o: mention formatLang in README
sbidoul May 16, 2018
72199b1
report_py3o_fusion_server: Add support for PDF Export options of libr…
alexis-via Apr 24, 2018
d11ab80
[UPD] Update report_py3o.pot
oca-travis Jun 23, 2018
4d0042d
Translated using Weblate (Français)
kryskool Jul 18, 2018
46f75e7
[MIG] report_py3o, report_py3o_fusion_server: Migration to 12.0
lmignon Nov 26, 2018
013115a
[IMP] report_py2o: cleanup js
lmignon Nov 27, 2018
bef7ab3
[12.0][MIG] improvement py3o_report_extender
Nov 29, 2018
4ff053e
Update i18n
sbejaoui Dec 4, 2018
5a22373
[FIX] report_py3o: Use the right naming convention for the render method
lmignon Jan 8, 2019
fc81ac3
[IMP] report_py3o: remove obsolete methods
lmignon Jan 8, 2019
38ea1a3
[IMP] report_py3o: Document new methods available into the parser con…
lmignon Jan 31, 2019
1855406
[FIX] report_py3o: Add missing method _merge_pdf.
lmignon Jan 31, 2019
b793f7b
[IMP][FIX] py3o_report, py3o_report_fusion_server: Compute the availa…
lmignon Feb 1, 2019
2d92a83
[FIX] report_py3o: Add missing 'user' and 'lang' into the parser context
lmignon Feb 1, 2019
ae0ba6a
[IMP] py3o_report: Allow to specify the lang when calling o_format_lang
lmignon Feb 1, 2019
8c1616d
[FIX] report_py3o: Access to ir.config_parameter with sudo
lmignon Feb 5, 2019
bf04455
[UPD] Update report_py3o.pot
oca-travis Mar 12, 2019
d65052e
Update translation files
oca-transbot Mar 17, 2019
a2c8faf
[UPD] Update report_py3o.pot
oca-travis Jun 12, 2019
18f93fb
Update translation files
oca-transbot Jun 16, 2019
a9af91d
Update README for report_py3o and report_py3o_fusion_server (#306)
alexis-via Jul 18, 2019
011e35a
[FIX] report_py3o readme structure
sbidoul Jul 31, 2019
46d828c
[UPD] README.rst
OCA-git-bot Jul 31, 2019
a411120
[IMP] report_py3o, report_py3o_fusion_server: black, isort
lmignon Nov 19, 2019
324d83c
[MIG] report_py3o, report_py3o_fusion_server: Migration to 13.0
lmignon Nov 19, 2019
2c93d9c
Make sure value is always set for computed fields
dupski Oct 28, 2019
2fa7c35
[12.0][FIX] - report_py3o: run libreoffice in an isolated user instal…
sbejaoui Jan 23, 2020
2ae56d4
[FIX] report_py3o: prettier xml after merge with master
lmignon May 12, 2020
4b4a0c8
[FIX] make prettier happy
sbidoul May 13, 2020
fef5a27
[UPD] Update report_py3o.pot
oca-travis Jun 17, 2020
e7dcbcc
[UPD] README.rst
OCA-git-bot Jun 18, 2020
0c083c4
Update translation files
oca-transbot Jun 18, 2020
b85ec72
Update translation files
oca-transbot Aug 16, 2020
6c6bf36
[14.0][MIG] report_py3o: Migration to 14.0
elmeriniemela Oct 21, 2020
cb85092
Update report_py3o/models/ir_actions_report.py
elmeriniemela Nov 7, 2020
baad77a
[MIG] Use safe_eval wrapped time module. Fix deprecation warnings.
elmeriniemela Feb 2, 2021
dd6897c
[IMP] Add ability to include properly formatted datetime field in a r…
elmeriniemela Nov 5, 2021
1374344
[IMP] Workaround for genshi DeprecationWarning that makes runbot buil…
elmeriniemela Nov 7, 2021
7312d5c
[IMP] Cleanup unnecessary imports
elmeriniemela Nov 7, 2021
788178b
[IMP] Remove except of IOError as its an alias to OSError in python3
elmeriniemela Nov 7, 2021
3b60019
run pre-commit
leemannd Nov 23, 2021
a8a0373
[UPD] Update report_py3o.pot
oca-travis Dec 9, 2021
918efdc
[UPD] README.rst
OCA-git-bot Dec 9, 2021
86fe95c
[MIG] report_py3o: Migration to 15.0
phuctranfxvn May 15, 2022
9dae660
[MIG] report_py3o to v16
alexis-via Dec 12, 2022
70de5f1
[UPD] Update report_py3o.pot
Aug 23, 2023
8454f19
[UPD] README.rst
OCA-git-bot Aug 23, 2023
35f0d11
[UPD] README.rst
OCA-git-bot Sep 3, 2023
3ce840f
Update translation files
weblate Sep 3, 2023
cc53e17
Translated using Weblate (Spanish)
Ivorra78 Sep 7, 2023
f999f16
Translated using Weblate (Spanish (Argentina))
ibuioli Sep 10, 2023
3e47f17
Translated using Weblate (Italian)
mymage Sep 13, 2023
168a809
Update translation files
weblate Oct 10, 2023
8d3e4e6
Replaced `mktemp` with `mkstemp`
fazledyn-or Nov 8, 2023
c36e319
Reformatted using pre-commit
fazledyn-or Nov 9, 2023
e0b5f53
[BOT] post-merge updates
OCA-git-bot Dec 8, 2023
a4a1424
Translated using Weblate (Italian)
mymage Jan 19, 2024
0214623
[IMP] remove python libs included in odoo from requirements
CRogos Apr 4, 2024
9e0384b
[BOT] post-merge updates
OCA-git-bot Apr 4, 2024
0332ac1
Translated using Weblate (Swedish)
jakobkrabbe Jun 27, 2024
7a39762
[FIX] _py3o_parser_context: fix call to format_date in old_format_lang
jdoutreloux Jan 8, 2024
6c44897
[BOT] post-merge updates
OCA-git-bot Jul 24, 2024
5003beb
[FIX] report_py3o: change display_address() to _display_address()
imbarbudiman Aug 21, 2024
9349068
[IMP] report_py3o: use the standard file name behavior when zipping r…
ThomasBinsfeld Dec 18, 2023
a4930d0
[BOT] post-merge updates
OCA-git-bot Sep 5, 2024
34c3808
[BOT] post-merge updates
OCA-git-bot Oct 22, 2024
d8a20e9
[MIG] report_py3o: Migration to 17.0
yaseentai Dec 4, 2024
69e207d
[FIX] python version compatibility
yaseentai Dec 5, 2024
b923a48
refactoring
yaseentai Dec 5, 2024
141c66e
fixes
yaseentai Dec 5, 2024
8d684bc
fix format
yaseentai Dec 5, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Translated using Weblate (Swedish)
Currently translated at 100.0% (46 of 46 strings)

Translation: reporting-engine-16.0/reporting-engine-16.0-report_py3o
Translate-URL: https://translation.odoo-community.org/projects/reporting-engine-16-0/reporting-engine-16-0-report_py3o/sv/
jakobkrabbe authored and yaseentai committed Dec 4, 2024
commit 0332ac1f4d48e3299e4b916b4540f8ba7be915e1
90 changes: 54 additions & 36 deletions report_py3o/i18n/sv.po
Original file line number Diff line number Diff line change
@@ -9,21 +9,22 @@ msgstr ""
"Project-Id-Version: Odoo Server 10.0\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-01-16 08:52+0000\n"
"PO-Revision-Date: 2018-01-16 08:52+0000\n"
"Last-Translator: OCA Transbot <[email protected]>, 2017\n"
"PO-Revision-Date: 2024-06-27 09:55+0000\n"
"Last-Translator: jakobkrabbe <[email protected]>\n"
"Language-Team: Swedish (https://www.transifex.com/oca/teams/23907/sv/)\n"
"Language: sv\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 4.17\n"

#. module: report_py3o
#. odoo-python
#: code:addons/report_py3o/models/ir_actions_report.py:0
#, python-format
msgid "(Native)"
msgstr ""
msgstr "(infödd)"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_py3o_report__create_uid
@@ -46,24 +47,24 @@ msgstr "Visa namn"
#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__py3o_template_fallback
msgid "Fallback"
msgstr ""
msgstr "Fallback"

#. module: report_py3o
#. odoo-python
#: code:addons/report_py3o/models/ir_actions_report.py:0
#, python-format
msgid "Field 'Output Format' is required for Py3O report"
msgstr ""
msgstr "Fältet \"Utdataformat\" krävs för Py3O-rapport"

#. module: report_py3o
#: model_terms:ir.ui.view,arch_db:report_py3o.py3o_template_configuration_search_view
msgid "File Type"
msgstr ""
msgstr "Filtyp"

#. module: report_py3o
#: model_terms:ir.ui.view,arch_db:report_py3o.py3o_template_configuration_search_view
msgid "Group By"
msgstr ""
msgstr "Grupp av"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_py3o_report__id
@@ -77,6 +78,9 @@ msgid ""
"If the user does not provide a template this will be used it should be a "
"relative path to root of YOUR module or an absolute path on your server."
msgstr ""
"Om användaren inte anger någon mall kommer denna att användas. Den bör vara "
"en relativ sökväg till roten för DIN modul eller en absolut sökväg på din "
"server."

#. module: report_py3o
#: model:ir.model.fields,help:report_py3o.field_ir_actions_report__py3o_multi_in_one
@@ -85,21 +89,25 @@ msgid ""
"ZIP file that contains as many files as selected records. If you enable this "
"option, Odoo will generate instead a single report for the selected records."
msgstr ""
"Om du kör en rapport på flera poster kommer Odoo som standard att generera "
"en ZIP-fil som innehåller lika många filer som de valda posterna. Om du "
"aktiverar det här alternativet kommer Odoo istället att generera en enda "
"rapport för de valda posterna."

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_py3o_report__ir_actions_report_id
msgid "Ir Actions Report"
msgstr ""
msgstr "Rapport om Ir-åtgärder"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__is_py3o_native_format
msgid "Is Py3O Native Format"
msgstr ""
msgstr "Är Py3O inbyggt format"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__is_py3o_report_not_available
msgid "Is Py3O Report Not Available"
msgstr ""
msgstr "Är Py3O-rapporten inte tillgänglig"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_py3o_report____last_update
@@ -123,34 +131,35 @@ msgstr "Senast uppdaterad"
#: model:ir.model.fields,field_description:report_py3o.field_py3o_template__py3o_template_data
#: model_terms:ir.ui.view,arch_db:report_py3o.py3o_report_view
msgid "LibreOffice Template"
msgstr ""
msgstr "LibreOffice-mall"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_py3o_template__filetype
msgid "LibreOffice Template File Type"
msgstr ""
msgstr "LibreOffice mall filtyp"

#. module: report_py3o
#. odoo-python
#: code:addons/report_py3o/models/py3o_report.py:0
#, python-format
msgid "Libreoffice runtime not available. Please contact your administrator."
msgstr ""
"Libreoffice runtime är inte tillgänglig. Vänligen kontakta din administratör."

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__module
msgid "Module"
msgstr ""
msgstr "Modul"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__msg_py3o_report_not_available
msgid "Msg Py3O Report Not Available"
msgstr ""
msgstr "Msg Py3O-rapport inte tillgänglig"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__py3o_multi_in_one
msgid "Multiple Records in a Single Report"
msgstr ""
msgstr "Flera poster i en enda rapport"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_py3o_template__name
@@ -162,93 +171,93 @@ msgstr "Namn"
#: code:addons/report_py3o/models/py3o_report.py:0
#, python-format
msgid "No template found. Aborting."
msgstr ""
msgstr "Ingen mall hittades. Avbryter."

#. module: report_py3o
#: model:ir.model.fields.selection,name:report_py3o.selection__py3o_template__filetype__odp
msgid "ODF Presentation"
msgstr ""
msgstr "ODF-presentation"

#. module: report_py3o
#: model:ir.model.fields.selection,name:report_py3o.selection__py3o_template__filetype__fodp
msgid "ODF Presentation (Flat)"
msgstr ""
msgstr "ODF-presentation (platt)"

#. module: report_py3o
#: model:ir.model.fields.selection,name:report_py3o.selection__py3o_template__filetype__ods
msgid "ODF Spreadsheet"
msgstr ""
msgstr "ODF kalkylblad"

#. module: report_py3o
#: model:ir.model.fields.selection,name:report_py3o.selection__py3o_template__filetype__fods
msgid "ODF Spreadsheet (Flat)"
msgstr ""
msgstr "ODF kalkylblad (platt)"

#. module: report_py3o
#: model:ir.model.fields.selection,name:report_py3o.selection__py3o_template__filetype__odt
msgid "ODF Text Document"
msgstr ""
msgstr "ODF textdokument"

#. module: report_py3o
#: model:ir.model.fields.selection,name:report_py3o.selection__py3o_template__filetype__fodt
msgid "ODF Text Document (Flat)"
msgstr ""
msgstr "ODF Textdokument (platt)"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__py3o_filetype
msgid "Output Format"
msgstr ""
msgstr "Utmatningsformat"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__lo_bin_path
msgid "Path to the libreoffice runtime"
msgstr ""
msgstr "Sökväg till libreoffice runtime"

#. module: report_py3o
#: model:ir.actions.report,name:report_py3o.res_users_report_py3o
msgid "Py3o Demo Report"
msgstr ""
msgstr "Py3o Demo Rapport"

#. module: report_py3o
#: model_terms:ir.ui.view,arch_db:report_py3o.act_report_xml_search_view
msgid "Py3o Reports"
msgstr ""
msgstr "Py3o-rapporter"

#. module: report_py3o
#: model:ir.actions.act_window,name:report_py3o.py3o_template_configuration_action
#: model:ir.ui.menu,name:report_py3o.py3o_template_configuration_menu
msgid "Py3o Templates"
msgstr ""
msgstr "Py3o-mallar"

#. module: report_py3o
#: model:ir.model,name:report_py3o.model_py3o_template
msgid "Py3o template"
msgstr ""
msgstr "Py3o-mall"

#. module: report_py3o
#: model:ir.model,name:report_py3o.model_ir_actions_report
msgid "Report Action"
msgstr ""
msgstr "Rapportera åtgärd"

#. module: report_py3o
#: model:ir.model,name:report_py3o.model_py3o_report
msgid "Report Py30"
msgstr ""
msgstr "Rapportera Py30"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__report_type
msgid "Report Type"
msgstr ""
msgstr "Rapporttyp"

#. module: report_py3o
#: model:ir.model.fields,field_description:report_py3o.field_ir_actions_report__py3o_template_id
msgid "Template"
msgstr ""
msgstr "Mall"

#. module: report_py3o
#: model:ir.model.fields,help:report_py3o.field_ir_actions_report__module
msgid "The implementer module that provides this report"
msgstr ""
msgstr "Den implementeringsmodul som tillhandahåller denna rapport"

#. module: report_py3o
#. odoo-python
@@ -261,6 +270,11 @@ msgid ""
"can provide the full path to the runtime by setting the key 'py3o."
"conversion_command' into the configuration parameters."
msgstr ""
"Körningsprogrammet libreoffice krävs för att generera py3o-rapporten \"%s\" "
"men finns inte i bin-sökvägen. Du måste installera libreoffice runtime på "
"servern. Om körtiden redan är installerad och inte hittas av Odoo kan du "
"ange den fullständiga sökvägen till körtiden genom att ange nyckeln \"py3o."
"conversion_command\" i konfigurationsparametrarna."

#. module: report_py3o
#: model:ir.model.fields,help:report_py3o.field_ir_actions_report__report_type
@@ -270,13 +284,17 @@ msgid ""
"browser PDF means the report will be rendered using Wkhtmltopdf and "
"downloaded by the user."
msgstr ""
"Den typ av rapport som kommer att återges, var och en har sin egen "
"återgivningsmetod. HTML innebär att rapporten öppnas direkt i din webbläsare "
"PDF innebär att rapporten renderas med Wkhtmltopdf och laddas ner av "
"användaren."

#. module: report_py3o
#: model:ir.actions.report,print_report_name:report_py3o.res_users_report_py3o
msgid "object.name.replace(' ', '_') + '-demo.odt'"
msgstr ""
msgstr "objekt.namn.ersätt(' ', '_') + '-demo.odt'"

#. module: report_py3o
#: model:ir.model.fields.selection,name:report_py3o.selection__ir_actions_report__report_type__py3o
msgid "py3o"
msgstr ""
msgstr "py3o"