Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 6 additions & 1 deletion g2p_formio/__manifest__.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,12 @@
"wizard/g2p_self_service_program_view_wizard.xml",
],
"external_dependencies": {"python": ["formio-data"]},
"assets": {},
"assets": {
"web.assets_backend": [
# builder
"g2p_formio/static/src/scss/formio_builder.scss",
],
},
"demo": [],
"images": [],
"application": True,
Expand Down
91 changes: 65 additions & 26 deletions g2p_formio/models/program.py
Original file line number Diff line number Diff line change
@@ -1,48 +1,81 @@
import json
import logging

from odoo import api, fields, models

_logger = logging.getLogger(__name__)


class G2PProgram(models.Model):
_inherit = "g2p.program"

portal_form_builder_id = fields.Many2one(
"formio.builder", string="Program Form", domain="[('is_form_mapped_with_program', '=', False)]"
"formio.builder",
string="Program Form",
domain="[('is_form_mapped_with_program', '=', False)]",
)

is_multiple_form_submission = fields.Boolean(default=False)

@api.constrains("portal_form_builder_id")
def _constrain_portal_form_mapping(self):
self.ensure_one()
def _update_form_JS_options(self, formio_builder, upload_url):
try:
js_options = json.loads(formio_builder.formio_js_options)

if self.portal_form_builder_id:
formio_builder = self.portal_form_builder_id
if js_options:
formio_builder.write({"is_form_mapped_with_program": True})

if not js_options.get("editForm", {}).get("file"):
return False

file_components = js_options["editForm"]["file"][0]["components"]

for component in file_components:
if component.get("key") == "url":
component["defaultValue"] = upload_url

formio_builder.write({"formio_js_options": json.dumps(js_options, indent=1)})
return True

except Exception as e:
_logger.error("Error updating form JSON schema: %s", str(e))
return False

try:
# Parse the JSON string into a dictionary
js_options = json.loads(formio_builder.formio_js_options)
def _update_form_json_schema(self, formio_builder, upload_url):
try:
if not formio_builder.schema:
return

if "editForm" in js_options and "file" in js_options["editForm"]:
file_components = js_options["editForm"]["file"][0]["components"]
schema_dict = json.loads(formio_builder.schema)
updated = False

for component in file_components:
if "defaultValue" in component and component["key"] == "url":
component["defaultValue"] = f"/v1/selfservice/uploadDocument/{self.id}"
for component in schema_dict.get("components", []):
if component.get("type") == "file" and component.get("storage") == "url":
component["url"] = upload_url
updated = True

# Convert back to JSON string and update the builder
formio_builder.write(
{
"formio_js_options": json.dumps(js_options, indent=4),
"is_form_mapped_with_program": True,
}
)
else:
formio_builder.write({"is_form_mapped_with_program": False})
if updated:
formio_builder.write({"schema": json.dumps(schema_dict, indent=1)})

except (json.JSONDecodeError, KeyError, IndexError):
# Handle potential JSON parsing errors or missing keys
formio_builder.write({"is_form_mapped_with_program": False})
except Exception as e:
_logger.error("Error updating form JSON schema: %s", str(e))

@api.constrains("portal_form_builder_id")
def _constrain_portal_form_mapping(self):
self.ensure_one()
formio_builder = self.portal_form_builder_id
if not formio_builder:
return

upload_url = f"/v1/selfservice/uploadDocument/{self.id}"

# Update Form JS Options
success = self._update_form_JS_options(formio_builder, upload_url)

# Update the Form JSON schema; if the update fails, unmap the form
if success:
self._update_form_json_schema(formio_builder, upload_url)
else:
formio_builder.write({"is_form_mapped_with_program": False})

@api.onchange("portal_form_builder_id")
def _onchange_portal_form_unmapping(self):
Expand All @@ -53,6 +86,12 @@ def _onchange_portal_form_unmapping(self):
if previous_form and not current_form:
previous_form.write({"is_form_mapped_with_program": False})

# Before deleting the program, unmap its form
def unlink(self):
if self.portal_form_builder_id:
self.portal_form_builder_id.write({"is_form_mapped_with_program": False})
return super().unlink()


class G2PProgramFomio(models.Model):
_inherit = "formio.builder"
Expand Down
7 changes: 7 additions & 0 deletions g2p_formio/static/src/scss/formio_builder.scss
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#formio_builder_container {
height: 125vh;
}

#formio_builder_iframe_container {
height: 100vh;
}
5 changes: 5 additions & 0 deletions g2p_programs/i18n/g2p_programs.pot
Original file line number Diff line number Diff line change
Expand Up @@ -4905,6 +4905,11 @@ msgstr ""
msgid "Set Defaults"
msgstr ""

#. module: g2p_programs
#: model:ir.model.fields,help:g2p_programs.field_g2p_program_membership__use_partner_credit_limit
msgid "Set a value greater than 0.0 to activate a credit limit check"
msgstr ""

#. module: g2p_programs
#: model_terms:ir.ui.view,arch_db:g2p_programs.view_cycle_form
msgid "Set as Ended"
Expand Down
2 changes: 1 addition & 1 deletion g2p_theme/static/src/css/style.css
Original file line number Diff line number Diff line change
Expand Up @@ -352,7 +352,7 @@ main {

.o_notification_close,
.o_notification_close:hover {
color: #ffffff !important;
color: #495057 !important;
opacity: 1;
font-weight: 100;
text-shadow: none;
Expand Down
Loading