Source code for rdfframework.forms.rdffields
import datetime
import json
from wtforms.fields import StringField, TextAreaField, PasswordField, \
BooleanField, FileField, DateField, DateTimeField, SelectField, Field,\
FormField, FieldList, HiddenField
from wtforms.validators import InputRequired, Optional, URL
from rdfframework import get_framework as rdfw
from rdfframework.processors import clean_processors
from rdfframework.validators import get_wtform_validators
from rdfframework.utilities import make_list, make_set, cbool, \
calculate_default_value #, code_timer, \
# fw_config, iri, is_not_null
from rdfframework.forms.widgets import BsGridTableWidget, \
RepeatingSubFormWidget, ButtonActionWidget
[docs]def get_field_json(field, instructions, instance, user_info, item_permissions=None):
'''This function will read through the RDF defined info and proccess the
json to return the correct values for the instance, security and details'''
debug = False
if item_permissions is None:
item_permissions = []
_rdf_app = rdfw().app
instance = instance.replace(".html", "")
# Determine Security Access
_new_field = {}
_access_level = get_field_security_access(field, user_info, item_permissions)
if "acl_Read" not in _access_level:
return None
_new_field['accessLevel'] = _access_level
# get form instance info
_form_instance_info = {}
_form_field_instance_type_list = make_list(field.get('kds_formInstance', field.get(\
'kds_formDefault', {}).get('kds_formInstance', [])))
#print("instance type list: ",_form_field_instance_type_list)
#print("instance: ", instance)
for _field_instance in _form_field_instance_type_list:
if _field_instance.get('kds_formInstanceType') == instance:
_form_instance_info = _field_instance
#print("instance info\n",_form_instance_info)
# Determine the field paramaters
_new_field['kds_formFieldName'] = _form_instance_info.get('kds_formFieldName', field.get(\
"kds_formFieldName", field.get('kds_formDefault', {}).get(\
'kds_formFieldName', "")))
_new_field['kds_fieldType'] = _form_instance_info.get('kds_fieldType', field.get(\
'kds_fieldType', field.get('kds_formDefault', {}).get('kds_fieldType', "")))
if not isinstance(_new_field['kds_fieldType'], dict):
_new_field['kds_fieldType'] = {"rdf_type":_new_field['kds_fieldType']}
_new_field['kds_formLabelName'] = _form_instance_info.get('kds_formLabelName', \
field.get("kds_formLabelName", field.get('kds_formDefault', {}).get(\
'kds_formLabelName', "")))
_new_field['kds_formFieldHelp'] = _form_instance_info.get('kds_formFieldHelp', \
field.get("formFieldHelp", field.get('formDefault', {}).get(\
'kds_formFieldHelp', "")))
_new_field['kds_formFieldOrder'] = _form_instance_info.get('kds_formFieldOrder', \
field.get("kds_formFieldOrder", field.get('kds_formDefault', {}).get(\
'kds_formFieldOrder', "")))
_new_field['kds_formLayoutRow'] = _form_instance_info.get('kds_formLayoutRow', \
field.get("kds_formLayoutRow", field.get('kds_formDefault', {}).get(\
'kds_formLayoutRow', "")))
_new_field['kds_propUri'] = field.get('kds_propUri')
_new_field['kds_classUri'] = field.get('kds_classUri')
_new_field['rdfs_range'] = field.get('rdfs_range')
_new_field['kds_defaultVal'] = _form_instance_info.get('kds_defaultVal',\
field.get('kds_defaultVal'))
# get applicationActionList
_new_field['kds_actionList'] = make_set(_form_instance_info.get(\
'kds_applicationAction', set()))
_new_field['kds_actionList'].union(make_set(field.get('kds_applicationAction', set())))
_new_field['kds_actionList'] = list(_new_field['kds_actionList'])
#print("action List:_______________", _new_field['kds_actionList'])
if "kdr_RemoveFromForm" in\
_new_field['kds_actionList']:
return None
# get valiator list
if field.get('kds_overrideValidation'):
_new_field['kds_validators'] = field.get('kds_overrideValidation')
else:
_new_field['kds_validators'] = make_list(\
_form_instance_info.get('kds_formValidation', []))
_new_field['kds_validators'] += make_list(\
field.get('kds_formValidation', []))
_new_field['kds_validators'] += make_list(\
field.get('kds_propertyValidation', []))
# get processing list
_new_field['kds_processors'] = make_list(_form_instance_info.get('kds_formProcessing', []))
_new_field['kds_processors'] += make_list(field.get('kds_formProcessing', []))
_new_field['kds_processors'] += make_list(field.get('kds_propertyProcessing', []))
if debug:
if field['kds_propUri'] == "schema_image":
x=1
# get required state
_required = False
_field_req_var = cbool(field.get('kds_requiredField'))
if (field.get('kds_propUri') in make_list(field.get('kds_classInfo', {}).get(\
'kds_primaryKey', []))) or _field_req_var:
_required = True
if field.get('kds_classUri') in make_list(field.get('kds_requiredByDomain', {})):
_required = True
if _field_req_var == False:
_required = False
_new_field['kds_required'] = _required
# Determine EditState
if ("acl_Write" in _access_level) and ("kdr_NotEditable" \
not in _new_field['kds_actionList']):
_new_field['editable'] = True
else:
_new_field['editable'] = False
# Determine css classes
css = _form_instance_info.get('kds_overrideCss', field.get('kds_overrideCss', \
instructions.get('kds_overrideCss', None)))
if css is None:
css = _rdf_app.get('kds_formDefault', {}).get('kds_fieldCss', '')
css = css.strip() + " " + instructions.get('kds_propertyAddOnCss', '')
css = css.strip() + " " + _form_instance_info.get('kds_addOnCss', field.get(\
'kds_addOnCss', field.get('kds_formDefault', {}).get('kds_addOnCss', '')))
css = css.strip()
_new_field['kds_css'] = css
#print("field_json:\n", json.dumps(_new_field, indent=4))
return _new_field
[docs]def get_wtform_field(field, instance='', **kwargs):
''' return a wtform field '''
_form_field = None
_field_label = field.get("kds_formLabelName", '')
#print("______label:", _field_label)
_field_name = field.get("kds_formFieldName", '')
_field_type_obj = field.get("kds_fieldType", {})
if isinstance(_field_type_obj.get('rdf_type'), list):
_field_type_obj = _field_type_obj['rdf_type'][0]
_field_validators = get_wtform_validators(field)
_field_type = _field_type_obj.get('rdf_type', '')
_field_row = float(field.get("kds_formLayoutRow",0))
_default_val = calculate_default_value(field)
if _field_type == 'kdr_TextField':
_form_field = StringField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_OpenBadgeSenderField':
_form_field = ButtonActionField(_field_label,
description=field.get('kds_formFieldHelp', ''),
#button_action="mozillaBackpackSender",
#button_text={'true':"Resend",'false':'Claim now'}
)
field['kds_call_in_display'] = True
field['kds_buttonAction']="mozillaBackpackSender"
field['kds_buttonText']={'true':"Resend",'false':'Claim now'}
field['kds_errorLogPropUri']="kds_errorLog"
#x=y
elif _field_type == 'kdr_ServerField':
_form_field = None
#form_field = StringField(_field_label, _field_validators, description= \
#field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_TextAreaField':
_form_field = TextAreaField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_PasswordField':
#print("!!!! Mode: ", _field_type_obj.get('fieldMode'))
_field_mode = _field_type_obj.get('kds_fieldMode', '')
if _field_mode == "kdr_InitialPassword":
_form_field = [{"kds_fieldName":_field_name,
"kds_field":PasswordField(_field_label,
_field_validators,
description=\
field.get('kds_formFieldHelp',\
''))},
{"kds_fieldName":_field_name + "_confirm",
"kds_field":PasswordField("Re-enter"),
"doNotSave":True}]
elif _field_mode == "kdr_ChangePassword":
_form_field = [{"kds_fieldName":_field_name + "_old",
"kds_field":PasswordField("Current"),
"doNotSave":True},
{"kds_fieldName":_field_name,
"kds_field":PasswordField("New"),
"kds_formLayoutRow":_field_row + .01},
{"kds_fieldName":_field_name + "_confirm",
"kds_field":PasswordField("Re-enter"),
"doNotSave":True,
"kds_formLayoutRow":_field_row + .02}]
elif _field_mode == "kdr_LoginPassword":
_form_field = PasswordField(_field_label,
[InputRequired()],
description=\
field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_BooleanField':
_form_field = BooleanField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_FileField':
_form_field = FileField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_HiddenField':
_form_field = FileField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_DateField':
_date_format = rdfw().app.get(\
'kds_dataFormats', {}).get('kds_pythonDateFormat', '')
#print("date validators:\n", _field_validators)
_add_optional = True
for _val in _field_validators:
if isinstance(_val, InputRequired):
_add_optional = False
break
if _add_optional:
_field_validators = [Optional()] + _field_validators
_form_field = DateField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''),
default=_default_val,
format=_date_format)
field['kds_css'] += " dp"
elif _field_type == 'kdr_DateTimeField':
_form_field = DateTimeField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_SelectField':
#print("--Select Field: ", _field_label, _field_validators, description= \
#field.get('kds_formFieldHelp', ''))
_form_field = SelectField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
#_form_field = StringField(_field_label, _field_validators, description= \
#field.get('kds_formFieldHelp', ''))
elif _field_type == 'kdr_ImageFileOrURLField':
if instance == "kdr_DisplayForm":
_form_field = StringField(_field_label,
description=field.get('kds_formFieldHelp', ''))
field['kds_formFieldName'] = field['kds_formFieldName'] + "_image"
print(" image count ")
else:
_form_field = [{"kds_fieldName":_field_name +"_image",
"kds_field":FileField("Image File")},
{"kds_fieldName":_field_name + "_url",
"kds_field":StringField("Image Url", [URL])}]
elif _field_type == 'kdr_SubForm':
from .rdfforms import rdf_framework_form_factory
_sub_form_instance = _field_type_obj.get('kds_subFormInstance',\
'kdr_LinkWithParent')
if _sub_form_instance == 'kdr_LinkWithParent':
_sub_form_instance = instance
_form_path = rdfw().get_form_path(\
_field_type_obj.get('kds_subFormUri'), instance)
kwargs['is_subobj'] = True
_sub_form = FormField(\
rdf_framework_form_factory(_form_path, is_subobj=True),
widget=BsGridTableWidget())
if "RepeatingSubForm" in _field_type_obj.get("kds_subFormMode"):
_form_field = FieldList(_sub_form, _field_label, min_entries=1,
widget=RepeatingSubFormWidget())
setattr(_form_field,"frameworkField","RepeatingSubForm")
else:
_form_field = _sub_form
setattr(_form_field,"frameworkField","subForm")
elif _field_type == 'kdr_FieldList':
_field_json = dict.copy(field)
_field_type_obj['rdf_type'] = _field_type_obj['kds_listFieldType']
_field_json['kds_fieldType'] = _field_type_obj
list_field = get_wtform_field(_field_json, instance, **kwargs)['fld']
_form_field = FieldList(list_field, _field_label, min_entries=1)
else:
_form_field = StringField(_field_label,
_field_validators,
description=field.get('kds_formFieldHelp', ''))
#print("--_form_field: ", _form_field)
return {"fld": _form_field, "fld_json": field, "form_js": None}
[docs]def get_field_security_access(field, user_info, item_permissions=None):
'''This function will return level security access allowed for the field'''
if item_permissions is None:
item_permissions = []
#Check application wide access
_app_security = user_info.get('kds_applicationSecurity', set())
#Check class access
_class_access_list = make_list(field.get('kds_classInfo', {"kds_classSecurity":[]}\
).get("kds_classSecurity", []))
_class_access = set()
if len(_class_access_list) > 0:
for i in _class_access_list:
if i['acl_agent'] in user_info['kds_userGroups']:
_class_access.add(i.get('acl_mode'))
#check property security
_property_access_list = make_list(field.get('kds_propertySecurity', []))
_property_access = set()
if len(_property_access_list) > 0:
for i in _property_access_list:
if i['acl_agent'] in user_info['kds_userGroups']:
_class_access.add(i.get('acl_mode'))
#check item permissions
_item_access_list = make_list(field.get('itemSecurity', []))
_item_access = set()
if len(_item_access_list) > 0:
for i in _item_access_list:
if i['agent'] in user_info['kds_userGroups']:
_item_access.add(i.get('mode'))
_main_access = _item_access.intersection(_property_access)
if "SuperUser" in _app_security:
return set('Read', 'Write')
elif len(_main_access) > 0:
return _main_access
elif len(_class_access) > 0:
return _class_access
elif len(_app_security) > 0:
return _app_security
else:
return set()
[docs]def add_field_attributes(wt_field, attributes):
for attribute, value in attributes.items():
setattr(wt_field, attribute, value)
setattr(wt_field, "old_data", None)
setattr(wt_field, "processed_data", None)
setattr(wt_field, "query_data", None)
return wt_field