diff --git a/paramecio2/libraries/db/corefields.py b/paramecio2/libraries/db/corefields.py index 03c32dd..c6ff036 100644 --- a/paramecio2/libraries/db/corefields.py +++ b/paramecio2/libraries/db/corefields.py @@ -175,7 +175,7 @@ class TextField(PhangoField): class HTMLField(TextField): """Class used for html fields - Class used for html fields, use TEXT sql type for the this field because is children of TextField. + Class used for html fields, use TEXT sql type for the this field because is children of TextField. In this method self.escape is used for convert " to " """ def __init__(self, name, required=False): @@ -204,7 +204,14 @@ class HTMLField(TextField): if tag.name not in self.trusted_tags: tag.hidden=True - return soup.renderContents().decode('utf-8') + value=soup.renderContents().decode('utf-8') + + if self.escape: + + return value.replace('"', '"') + else: + + return value class ForeignKeyField(IntegerField): @@ -217,7 +224,7 @@ class ForeignKeyField(IntegerField): """ Args: name (str): Name of field - related_table(str): The table related with this foreign key + related_table(WebModel): The table-model related with this foreign key size (int): The size of the new field in database. By default 11. required (bool): Boolean for define if field is required or not identifier_field (str): The Id field name from related table @@ -297,6 +304,7 @@ class BooleanField(IntegerField): if value<0 or value>1: self.txt_error=self.default_error self.error=True + value=0 except: diff --git a/paramecio2/libraries/db/extrafields/arrayfield.py b/paramecio2/libraries/db/extrafields/arrayfield.py index 7d5140a..ab18168 100644 --- a/paramecio2/libraries/db/extrafields/arrayfield.py +++ b/paramecio2/libraries/db/extrafields/arrayfield.py @@ -37,10 +37,17 @@ class ArrayField(PhangoField): self.error=True self.txt_error='Sorry, the json array is invalid' + error=0 + if type(self.field_type).__name__!='ArrayField': for k,v in enumerate(value): value[k]=self.field_type.check(v) + if self.field_type.error: + error+=1 + + if error>0: + self.error=True final_value=json.dumps(value) diff --git a/paramecio2/libraries/db/extrafields/colorfield.py b/paramecio2/libraries/db/extrafields/colorfield.py index 927b742..25a756b 100644 --- a/paramecio2/libraries/db/extrafields/colorfield.py +++ b/paramecio2/libraries/db/extrafields/colorfield.py @@ -1,5 +1,9 @@ from paramecio2.libraries.db.corefields import IntegerField -from paramecio2.libraries.db.extraforms.colorform import ColorForm +try: + from paramecio2.libraries.db.extraforms.colorform import ColorForm +except: + class ColorForm: + pass class ColorField(IntegerField): """Simple field for save colors in hexadecimal format.""" diff --git a/paramecio2/libraries/db/extrafields/datefield.py b/paramecio2/libraries/db/extrafields/datefield.py index 4ead3ce..1859b49 100644 --- a/paramecio2/libraries/db/extrafields/datefield.py +++ b/paramecio2/libraries/db/extrafields/datefield.py @@ -1,6 +1,11 @@ from paramecio2.libraries.db.corefields import PhangoField from paramecio2.libraries import datetime -from paramecio2.libraries.db.extraforms.dateform import DateForm +try: + from paramecio2.libraries.db.extraforms.dateform import DateForm +except: + + class DateForm: + pass class DateField(PhangoField): """Field for use and save dates in YYYYMMDDHHSS format""" diff --git a/paramecio2/libraries/db/extrafields/datetimefield.py b/paramecio2/libraries/db/extrafields/datetimefield.py index 2cde5c5..10511d6 100644 --- a/paramecio2/libraries/db/extrafields/datetimefield.py +++ b/paramecio2/libraries/db/extrafields/datetimefield.py @@ -1,6 +1,10 @@ from paramecio2.libraries.db.corefields import PhangoField from paramecio2.libraries import datetime -from paramecio2.libraries.db.extraforms.dateform import DateForm +try: + from paramecio2.libraries.db.extraforms.dateform import DateForm +except: + class DateForm: + pass class DateTimeField(PhangoField): """Field for use and save dates in MySQL date format""" diff --git a/paramecio2/libraries/db/extrafields/dictfield.py b/paramecio2/libraries/db/extrafields/dictfield.py index b737ae8..ee8d6fb 100644 --- a/paramecio2/libraries/db/extrafields/dictfield.py +++ b/paramecio2/libraries/db/extrafields/dictfield.py @@ -36,13 +36,18 @@ class DictField(PhangoField): value={} self.error=True self.txt_error=self.error_default - + error=0 for k,v in value.items(): value[k]=self.field_type.check(v) + if self.field_type.error: + error+=1 final_value=json.dumps(value) + if error>0: + self.error=True + #final_value=WebModel.escape_sql(final_value) return final_value diff --git a/paramecio2/tests/fields_test.py b/paramecio2/tests/fields_test.py new file mode 100644 index 0000000..340821d --- /dev/null +++ b/paramecio2/tests/fields_test.py @@ -0,0 +1,143 @@ +import sys +import os +import pytest + +sys.path.insert(0, os.path.realpath(os.path.dirname(__file__))+'/../../') + +#from settings import config +from paramecio2.libraries.db.webmodel import PhangoField, WebModel +from paramecio2.libraries.db import corefields +from paramecio2.libraries.db.extrafields.arrayfield import ArrayField +from paramecio2.libraries.db.extrafields.colorfield import ColorField +from paramecio2.libraries.db.extrafields.datefield import DateField +from paramecio2.libraries.db.extrafields.datetimefield import DateTimeField +from paramecio2.libraries.db.extrafields.dictfield import DictField +from paramecio2.libraries import datetime + +class ExampleModel(WebModel): + + def __init__(self, connection=None): + + super().__init__(connection) + + # I can change other fields here, how the name. + + self.register(corefields.CharField('title')) + self.register(corefields.CharField('content')) + + +def test_test_phangofield(): + + field=PhangoField('default', 255) + + assert field.check(' "" ')=='"<trial>"' + +def test_test_integerfield(): + + field=corefields.IntegerField('int') + + assert field.check("25")=='25' + + assert field.check("25j")=='0' + + field.check("25j") + + assert field.error==True + +def test_test_floadfield(): + + field=corefields.FloatField('int') + + assert field.check('1,5')=='1.5' + + assert field.check('1.5456')=='1.5456' + + assert field.check('1.5456tet')=='0' + +def test_test_htmlfield(): + + field=corefields.HTMLField('html') + + assert field.check('

"trial"

')=='"trial"' + + field.escape=True + + assert field.check('

"trial"

')=='"trial"' + + field.trusted_tags=['p'] + + assert field.check('

"trial"

')=='

"trial"

' + + #field. +def test_test_foreignkeyfield(): + + field=corefields.ForeignKeyField('foreign', ExampleModel()) + + assert field.check('dsd')=='NULL' + +def test_test_booleanfield(): + + field=corefields.BooleanField('bool') + + assert field.check('25')=='0' + + assert field.error==True + + +def test_test_arrayfield(): + + field=ArrayField('array', corefields.IntegerField('item')) + + assert field.check([1, 2, 3])=='["1", "2", "3"]' + + assert field.check([1, 2, '3t'])=='["1", "2", "0"]' + + assert field.error==True + +def test_test_colorfield(): + + field=ColorField('color') + + assert field.check('#ff12f5')==0xff12f5 + + assert field.check('#ff12f54')==0 + + assert field.get_hex_color(0xaf42f5)=='#af42f5' + +def test_test_datefield(): + + datetime.timezone='Europe/Madrid' + + datetime.set_timezone() + + field=DateField('date') + + field.utc=False + + assert field.check('20201234121011')=='' + + assert field.check('20201230121011')=='20201230121011' + +def test_test_datetimefield(): + + datetime.timezone='Europe/Madrid' + + datetime.set_timezone() + + field=DateTimeField('date') + + field.utc=False + + assert field.check('20201230121011')=='2020-12-30 12:10:11' + + assert field.check('20201290121011')=='' + +def test_test_dictfield(): + + field=DictField('dict', corefields.IntegerField('item')) + + assert field.check({'come': '5'})=='{"come": "5"}' + + assert field.check({'come': '5t'})=='{"come": "0"}' + + assert field.error==True