check regex-code when save online-source

This commit is contained in:
Frederik Jaeckel 2024-01-21 18:55:21 +01:00
parent c2df388692
commit 9f74b8fbf7
5 changed files with 94 additions and 3 deletions

View file

@ -50,6 +50,10 @@ msgctxt "model:ir.message,text:msg_missing_url"
msgid "URL for the online source '%(oname)s' is missing." msgid "URL for the online source '%(oname)s' is missing."
msgstr "URL für die Onlinequelle '%(oname)s' fehlt." msgstr "URL für die Onlinequelle '%(oname)s' fehlt."
msgctxt "model:ir.message,text:msg_bug_in_regexquery"
msgid "Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s]"
msgstr "Fehler in Regex-Code des Feldes '%(fname)s': %(errmsg)s [%(code)s]"
############## ##############
# ir.ui.menu # # ir.ui.menu #

View file

@ -38,6 +38,10 @@ msgctxt "model:ir.message,text:msg_missing_url"
msgid "URL for the online source '%(oname)s' is missing." msgid "URL for the online source '%(oname)s' is missing."
msgstr "URL for the online source '%(oname)s' is missing." msgstr "URL for the online source '%(oname)s' is missing."
msgctxt "model:ir.message,text:msg_bug_in_regexquery"
msgid "Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s]"
msgstr "Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s]"
msgctxt "model:ir.ui.menu,name:menu_investment" msgctxt "model:ir.ui.menu,name:menu_investment"
msgid "Investment" msgid "Investment"
msgstr "Investment" msgstr "Investment"
@ -294,6 +298,18 @@ msgctxt "selection:investment.asset,updtdays:"
msgid "Mon - Sun" msgid "Mon - Sun"
msgstr "Mon - Sun" msgstr "Mon - Sun"
msgctxt "field:investment.asset,updturl:"
msgid "URL"
msgstr "URL"
msgctxt "help:investment.asset,updturl:"
msgid "URL for data retrieval."
msgstr "URL for data retrieval."
msgctxt "field:investment.asset,updturl_enable:"
msgid "URL required"
msgstr "URL required"
msgctxt "model:investment.asset_source_rel,name:" msgctxt "model:investment.asset_source_rel,name:"
msgid "Asset Source Relation" msgid "Asset Source Relation"
msgstr "Asset Source Relation" msgstr "Asset Source Relation"

View file

@ -23,6 +23,9 @@ full copyright notices and license terms. -->
<record model="ir.message" id="msg_missing_url"> <record model="ir.message" id="msg_missing_url">
<field name="text">URL for the online source '%(oname)s' is missing.</field> <field name="text">URL for the online source '%(oname)s' is missing.</field>
</record> </record>
<record model="ir.message" id="msg_bug_in_regexquery">
<field name="text">Error in regex code of field '%(fname)s': %(errmsg)s [%(code)s]</field>
</record>
</data> </data>
</tryton> </tryton>

View file

@ -260,6 +260,15 @@ class OnlineSource(ModelSQL, ModelView):
""" """
pass pass
@classmethod
def validate(cls, records):
""" check regex-code
"""
for record in records:
for x in ['rgxdate', 'rgxrate', 'rgxident']:
if x:
record.get_regex_result('', x)
@classmethod @classmethod
def run_query_method(cls, osource, isin, nsin, symbol, url, debug=False): def run_query_method(cls, osource, isin, nsin, symbol, url, debug=False):
""" run selected query to retrive data """ run selected query to retrive data
@ -380,13 +389,22 @@ class OnlineSource(ModelSQL, ModelView):
def get_regex_result(self, html_text, field_name): def get_regex_result(self, html_text, field_name):
""" run regex on html-text, convert result """ run regex on html-text, convert result
""" """
OSource = Pool().get('investment.source')
rgxcode = getattr(self, field_name) or '' rgxcode = getattr(self, field_name) or ''
if len(rgxcode) == 0: if len(rgxcode) == 0:
return None return None
search_result = re.compile(rgxcode).search(html_text) try:
if search_result is None: search_result = re.compile(rgxcode).search(html_text)
return None if search_result is None:
return None
except Exception as e1:
raise UserError(gettext(
'investment.msg_bug_in_regexquery',
errmsg=str(e1),
fname=getattr(OSource, field_name).string,
code=rgxcode))
try: try:
result = search_result.group(1) result = search_result.group(1)

View file

@ -6,6 +6,7 @@
from trytond.tests.test_tryton import with_transaction from trytond.tests.test_tryton import with_transaction
from trytond.pool import Pool from trytond.pool import Pool
from trytond.transaction import Transaction from trytond.transaction import Transaction
from trytond.exceptions import UserError
from decimal import Decimal from decimal import Decimal
from datetime import time, date, datetime from datetime import time, date, datetime
from unittest.mock import MagicMock from unittest.mock import MagicMock
@ -131,5 +132,54 @@ High 34,87 EUR
'rgxdate' 'rgxdate'
), date(2022, 3, 14)) ), date(2022, 3, 14))
@with_transaction()
def test_waitlist_source_check_regex_validate(self):
""" create source, check validation of regex-code
"""
pool = Pool()
OSource = pool.get('investment.source')
self.assertRaisesRegex(
UserError,
r"Error in regex code of field 'Date': nothing to repeat " +
r"at position 0 \[\*+ multiple repeat\]",
OSource.create,
[{
'name': 'Check date',
'rgxdate': '** multiple repeat',
'rgxrate': 'rate -- multiple repeat',
'rgxident': 'identifiert ** multiple repeat',
}])
self.assertRaisesRegex(
UserError,
r"Error in regex code of field 'Rate': multiple repeat " +
r"at position 6 \[rate \*+ multiple repeat\]",
OSource.create,
[{
'name': 'Check rate',
'rgxdate': '-- multiple repeat',
'rgxrate': 'rate ** multiple repeat',
'rgxident': 'identifiert -- multiple repeat',
}])
self.assertRaisesRegex(
UserError,
r"Error in regex code of field 'Identifier': multiple " +
r"repeat at position 13 \[identifiert \*+ multiple repeat\]",
OSource.create,
[{
'name': 'Check rgxident',
'rgxdate': '-- multiple repeat',
'rgxrate': 'rate -- multiple repeat',
'rgxident': 'identifiert ** multiple repeat',
}])
OSource.create([{
'name': 'Check rgxident',
'rgxdate': '-- multiple repeat',
'rgxrate': 'rate -- multiple repeat',
'rgxident': 'identifiert -- multiple repeat',
}])
# end SourceTestCase # end SourceTestCase