mirror of
https://github.com/YunoHost/yunohost.git
synced 2024-09-03 20:06:10 +02:00
domain:config: handle "portal_logo" with "python" mode and save content in portal settings
This commit is contained in:
parent
2b75c8f036
commit
b6f7967758
2 changed files with 25 additions and 20 deletions
|
@ -5,6 +5,7 @@ i18n = "domain_config"
|
||||||
name = "Features"
|
name = "Features"
|
||||||
|
|
||||||
[feature.portal]
|
[feature.portal]
|
||||||
|
# Only available for "topest" domains
|
||||||
name = "Portal"
|
name = "Portal"
|
||||||
|
|
||||||
[feature.portal.show_other_domains_apps]
|
[feature.portal.show_other_domains_apps]
|
||||||
|
@ -17,6 +18,9 @@ name = "Features"
|
||||||
|
|
||||||
[feature.portal.portal_logo]
|
[feature.portal.portal_logo]
|
||||||
type = "file"
|
type = "file"
|
||||||
|
accept = ["image/png", "image/jpeg", "image/svg+xml"]
|
||||||
|
mode = "python"
|
||||||
|
bind = "/usr/share/yunohost/portallogos/{filename}{ext}"
|
||||||
|
|
||||||
[feature.portal.portal_theme]
|
[feature.portal.portal_theme]
|
||||||
type = "select"
|
type = "select"
|
||||||
|
|
|
@ -762,26 +762,6 @@ class DomainConfigPanel(ConfigPanel):
|
||||||
"portal_theme",
|
"portal_theme",
|
||||||
]
|
]
|
||||||
|
|
||||||
if "portal_logo" in next_settings:
|
|
||||||
|
|
||||||
import magic, hashlib
|
|
||||||
with open(next_settings["portal_logo"], "rb") as f:
|
|
||||||
file_content = f.read()
|
|
||||||
mimetype = magic.Magic(mime=True).from_buffer(file_content)
|
|
||||||
if mimetype not in ["image/png", "image/jpeg"]:
|
|
||||||
raise YunohostValidationError(f"Unsupported image type : {mimetype}", raw=True)
|
|
||||||
ext = mimetype.split("/")[-1]
|
|
||||||
m = hashlib.sha256()
|
|
||||||
m.update(file_content)
|
|
||||||
sha256sum = m.hexdigest()
|
|
||||||
filename = f"/usr/share/yunohost/portallogos/{sha256sum}.{ext}"
|
|
||||||
with open(filename, "wb") as f:
|
|
||||||
f.write(file_content)
|
|
||||||
next_settings["portal_logo"] = filename
|
|
||||||
# FIXME : the previous line doesn't actually set anything in the actual form ...
|
|
||||||
# ... and calling `form.portal_logo = filename` would actually make it sort of "re-upload" the file to another place ...
|
|
||||||
# not sure how to address this issue ...
|
|
||||||
|
|
||||||
if _get_parent_domain_of(self.entity, topest=True) is None and any(
|
if _get_parent_domain_of(self.entity, topest=True) is None and any(
|
||||||
option in next_settings for option in portal_options
|
option in next_settings for option in portal_options
|
||||||
):
|
):
|
||||||
|
@ -793,6 +773,27 @@ class DomainConfigPanel(ConfigPanel):
|
||||||
|
|
||||||
portal_values = form.dict(include=set(portal_options))
|
portal_values = form.dict(include=set(portal_options))
|
||||||
|
|
||||||
|
if "portal_logo" in next_settings:
|
||||||
|
if previous_settings.get("portal_logo"):
|
||||||
|
try:
|
||||||
|
os.remove(previous_settings["portal_logo"])
|
||||||
|
except:
|
||||||
|
logger.warning(
|
||||||
|
f"Coulnd't remove previous logo file, maybe the file was already deleted, path: {previous_settings['portal_logo']}"
|
||||||
|
)
|
||||||
|
|
||||||
|
if next_settings["portal_logo"]:
|
||||||
|
# Save the file content as `{mimetype}:{base64content}` in portal settings
|
||||||
|
# while keeping the file path in the domain settings
|
||||||
|
from base64 import b64encode
|
||||||
|
from magic import Magic
|
||||||
|
|
||||||
|
file_content = Path(portal_values["portal_logo"]).read_bytes()
|
||||||
|
mimetype = Magic(mime=True).from_buffer(file_content)
|
||||||
|
portal_values["portal_logo"] = (
|
||||||
|
mimetype + ":" + b64encode(file_content).decode("utf-8")
|
||||||
|
)
|
||||||
|
|
||||||
portal_settings_path = Path(f"{PORTAL_SETTINGS_DIR}/{self.entity}.json")
|
portal_settings_path = Path(f"{PORTAL_SETTINGS_DIR}/{self.entity}.json")
|
||||||
portal_settings: dict[str, Any] = {"apps": {}}
|
portal_settings: dict[str, Any] = {"apps": {}}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue