184 lines
4.9 KiB
Python
184 lines
4.9 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""
|
|
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 <https://www.gnu.org/licenses/>.
|
|
"""
|
|
|
|
import json
|
|
from paramecio2.libraries.db.webmodel import PhangoField
|
|
from paramecio2.libraries.db.coreforms import BaseForm
|
|
from paramecio2.libraries.db.extraforms.i18nform import I18nForm
|
|
from paramecio2.libraries.i18n import I18n
|
|
#from paramecio.citoplasma.httputils import GetPostFiles
|
|
import json
|
|
import re
|
|
|
|
class I18nField(PhangoField):
|
|
"""Field for save strings multilanguage in json format"""
|
|
|
|
def __init__(self, name, form=None):
|
|
"""
|
|
Args
|
|
name (str): The name of field
|
|
form (BaseForm): The form used for generate the multiple languade form. Example if you use a TextForm, a TextForm for every language will be showed.
|
|
"""
|
|
|
|
super().__init__(name)
|
|
|
|
if form==None:
|
|
form=BaseForm(name, '')
|
|
|
|
self.name_form=I18nForm
|
|
self.extra_parameters=[form]
|
|
self.show_formatted_value=True
|
|
self.show_blank=False
|
|
|
|
arr_i18n={i:'' for i in I18n.dict_i18n}
|
|
self.default_value=json.dumps(arr_i18n)
|
|
|
|
self.type_sql='longtext'
|
|
|
|
def change_form(self, form):
|
|
self.extra_parameters=[form]
|
|
|
|
def check_value(self, value):
|
|
|
|
return super().check(value)
|
|
|
|
def check(self, value):
|
|
|
|
self.error=False
|
|
self.txt_error=''
|
|
|
|
arr_values={}
|
|
|
|
try:
|
|
arr_values=json.loads(value)
|
|
|
|
if not arr_values:
|
|
arr_values={}
|
|
|
|
except:
|
|
arr_values={}
|
|
|
|
arr_real_values={}
|
|
|
|
error_values=0
|
|
|
|
for lang in I18n.dict_i18n:
|
|
arr_real_values[lang]=arr_values.get(lang, '')
|
|
arr_real_values[lang]=self.check_value(arr_real_values[lang])
|
|
|
|
|
|
if not arr_real_values[lang] or arr_real_values[lang]=='None':
|
|
arr_real_values[lang]=''
|
|
error_values+=1
|
|
|
|
self.error=False
|
|
|
|
arr_values=arr_real_values
|
|
|
|
if error_values:
|
|
if error_values==len(arr_values):
|
|
self.error=True
|
|
self.txt_error='Sorry, You field language is empty'
|
|
return json.dumps(arr_values)
|
|
|
|
|
|
"""
|
|
if arr_values[I18n.default_lang]=='':
|
|
self.error=True
|
|
self.txt_error='Sorry, You need default language '+I18n.default_lang
|
|
return json.dumps(arr_values)
|
|
"""
|
|
|
|
return json.dumps(arr_values)
|
|
|
|
def get_type_sql(self):
|
|
|
|
return 'JSON NOT NULL'
|
|
|
|
def obtain_lang_value(self, lang, value):
|
|
|
|
return value.get(self.name+'_'+lang, '')
|
|
|
|
def obtain_lang_from_post(self, lang, value):
|
|
|
|
#getpost=GetPostFiles()
|
|
|
|
#getpost.obtain_post()
|
|
|
|
return "" #GetPostFiles.post.get(self.name+'_'+lang, '')
|
|
|
|
def show_formatted(self, value):
|
|
|
|
if value=='':
|
|
value='{"en-US": "", "es-ES": ""}'
|
|
|
|
value=json.loads(value)
|
|
|
|
lang=I18n.get_default_lang()
|
|
|
|
if value[lang]!='' or self.show_blank:
|
|
|
|
return value[lang]
|
|
|
|
lang_value=value[I18n.default_lang]
|
|
|
|
if value[I18n.default_lang]=='':
|
|
for l in value:
|
|
|
|
if value[l]!='':
|
|
lang_value=value[l]
|
|
break
|
|
|
|
return lang_value
|
|
|
|
|
|
@staticmethod
|
|
def get_value(value):
|
|
|
|
value=json.loads(value)
|
|
|
|
lang=I18n.get_default_lang()
|
|
|
|
if value[lang]!='':
|
|
|
|
return value[lang]
|
|
|
|
return value[I18n.default_lang]
|
|
|
|
class I18nHTMLField(I18nField):
|
|
|
|
def check_value(self, value):
|
|
|
|
return re.sub('<.*?script?>', '', value)
|
|
|
|
class I18nPhangoField(I18nField):
|
|
|
|
def __init__(self, name, field_class, form=None):
|
|
|
|
super().__init__(name, form)
|
|
|
|
self.field_class=field_class
|
|
|
|
def check_value(self, value):
|
|
|
|
f=self.field_class
|
|
|
|
return f.check(value)
|