""" Paramecio2fm is a series of wrappers for Flask, mako and others and construct a simple headless cms. Copyright (C) 2023 Antonio de la Rosa Caballero This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . """ from paramecio2.libraries.db.webmodel import PhangoField,WebModel import json class ArrayField(PhangoField): """Field for save json arrays with determined values""" def __init__(self, name, field_type, required=False): """ Args: name (str): The name of new field field_type (PhangoField): The type of PhangoField for save in ArrayField required (bool): Boolean for define if field is required or not """ super().__init__(name, required) self.field_type=field_type self.error_default='Sorry, the json array is invalid' self.set_default='NOT NULL' self.type_sql='text' self.jtype='array' self.default_value='[]' def check(self, value): if type(value).__name__=='str': try: value=json.loads(value) except json.JSONDecodeError: value=[] self.error=True self.txt_error=self.error_default elif type(value).__name__!='list': value=[] 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) final_value=WebModel.escape_sql(final_value) return final_value def get_type_sql(self): return 'TEXT '+self.set_default def show_formatted(self, value): return ", ".join(value) def loads(self, value): try: return json.loads(value) except: return False