Merge branch 'master' into es_17_01

This commit is contained in:
2017-02-08 23:02:11 +01:00
7 changed files with 182 additions and 16 deletions

View File

@@ -60,6 +60,7 @@ feature -- Access: router
l_admin_cache_handler: CMS_ADMIN_CACHE_HANDLER l_admin_cache_handler: CMS_ADMIN_CACHE_HANDLER
l_admin_export_handler: CMS_ADMIN_EXPORT_HANDLER l_admin_export_handler: CMS_ADMIN_EXPORT_HANDLER
l_admin_import_handler: CMS_ADMIN_IMPORT_HANDLER l_admin_import_handler: CMS_ADMIN_IMPORT_HANDLER
l_admin_path_alias_handler: CMS_ADMIN_PATH_ALIAS_HANDLER
l_uri_mapping: WSF_URI_MAPPING l_uri_mapping: WSF_URI_MAPPING
do do
@@ -83,6 +84,10 @@ feature -- Access: router
create l_uri_mapping.make_trailing_slash_ignored ("/admin/logs", l_admin_logs_handler) create l_uri_mapping.make_trailing_slash_ignored ("/admin/logs", l_admin_logs_handler)
a_router.map (l_uri_mapping, a_router.methods_get) a_router.map (l_uri_mapping, a_router.methods_get)
create l_admin_path_alias_handler.make (a_api)
create l_uri_mapping.make_trailing_slash_ignored ("/admin/path_alias", l_admin_path_alias_handler)
a_router.map (l_uri_mapping, a_router.methods_get_post)
create l_admin_cache_handler.make (a_api) create l_admin_cache_handler.make (a_api)
create l_uri_mapping.make_trailing_slash_ignored ("/admin/cache", l_admin_cache_handler) create l_uri_mapping.make_trailing_slash_ignored ("/admin/cache", l_admin_cache_handler)
@@ -119,14 +124,10 @@ feature -- Security
Result.force ("admin users") Result.force ("admin users")
Result.force ("admin roles") Result.force ("admin roles")
Result.force ("admin modules") Result.force ("admin modules")
Result.force ("install modules")
Result.force ("view logs")
Result.force ("admin core caches") Result.force ("admin core caches")
Result.force ("clear blocks cache") Result.force ("clear blocks cache")
Result.force ("admin export") Result.force ("admin export")
Result.force ("admin import") Result.force ("admin import")
Result.force ("export core")
Result.force ("import core")
end end
feature -- Hooks feature -- Hooks

View File

@@ -0,0 +1,124 @@
note
description: "[
Administrate path aliases.
]"
date: "$Date$"
revision: "$Revision$"
class
CMS_ADMIN_PATH_ALIAS_HANDLER
inherit
CMS_HANDLER
WSF_URI_HANDLER
rename
new_mapping as new_uri_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get,
do_post
end
REFACTORING_HELPER
create
make
feature -- Execution
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler
do
execute_methods (req, res)
end
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
local
l_response: CMS_RESPONSE
l_sources: ARRAYED_LIST [READABLE_STRING_8]
l_alias: detachable READABLE_STRING_8
s: STRING
b: BOOLEAN
do
if api.has_permission ("admin path_alias") then
create {GENERIC_VIEW_CMS_RESPONSE} l_response.make (req, res, api)
if attached api.storage.path_aliases as tb then
create s.make_empty
s.append ("<h1>Path aliases</h1>%N")
s.append ("<ul class=%"path_aliases%">")
create l_sources.make (tb.count)
l_sources.compare_objects
across
tb as ic
loop
b := l_sources.has (ic.item)
if b then
s.append ("<li class=%"warning%">")
else
s.append ("<li>")
l_sources.force (ic.item)
end
if ic.key.is_valid_as_string_8 then
l_alias := ic.key.to_string_8
s.append (l_response.link (ic.key, l_alias, Void))
else
l_alias := Void
s.append (l_response.html_encoded (ic.key))
end
s.append (" =&gt; ")
s.append (l_response.link (ic.item, ic.item, Void))
if b then
s.append (" <span class=%"warning%">(archived)</span>")
if l_alias /= Void then
s.append ("<form action=%"%" method=%"POST%"><input type=%"hidden%" name=%"path_alias%" value=%"" + l_alias + "%"/><input type=%"hidden%" name=%"source%" value=%"" + ic.item + "%"/><input type=%"submit%" name=%"op%" value=%"unset%"/></form>")
end
end
s.append ("</li>")
end
s.append ("</ul>")
end
l_response.set_main_content (s)
else
create {FORBIDDEN_ERROR_CMS_RESPONSE} l_response.make (req, res, api)
end
l_response.execute
end
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
local
l_response: CMS_RESPONSE
s: STRING
do
if api.has_permission ("admin path_alias") then
create {GENERIC_VIEW_CMS_RESPONSE} l_response.make (req, res, api)
create s.make_empty
if
attached {WSF_STRING} req.form_parameter ("op") as p_op and then p_op.same_string ("unset") and then
attached {WSF_STRING} req.form_parameter ("path_alias") as p_alias and then
attached {WSF_STRING} req.form_parameter ("source") as p_source
then
api.unset_path_alias (p_source.value.to_string_8, p_alias.value.to_string_8) -- FIXME: avoid `to_string_8`
if api.has_error then
s.append ("<div class=%"error%">ERROR: Path alias %"" + l_response.html_encoded (p_alias.value) + "%" raised error!</div>")
else
s.append ("<div class=%"success%">Path alias %"" + l_response.html_encoded (p_alias.value) + "%" is now unset!</div>")
end
end
s.append ("<p><a href=%"%">Back to list of path aliases ...</a><p>")
s.append ("(in 3 seconds...)")
l_response.set_main_content (s)
l_response.set_redirection (l_response.location)
l_response.set_redirection_delay (3)
else
create {FORBIDDEN_ERROR_CMS_RESPONSE} l_response.make (req, res, api)
l_response.set_redirection (l_response.location)
end
l_response.execute
end
end

View File

@@ -27,9 +27,10 @@ feature -- Process
l_admin_links.force (["core", <<"admin roles">>, local_link ("Roles", "admin/roles"), "View/Edit/Add Roles"]) l_admin_links.force (["core", <<"admin roles">>, local_link ("Roles", "admin/roles"), "View/Edit/Add Roles"])
l_admin_links.force (["core", <<"admin modules">>, local_link ("Modules", "admin/modules"), "(un)Install modules"]) l_admin_links.force (["core", <<"admin modules">>, local_link ("Modules", "admin/modules"), "(un)Install modules"])
l_admin_links.force (["core", <<"view logs">>, local_link ("Logs", "admin/logs"), "View logs"]) l_admin_links.force (["core", <<"view logs">>, local_link ("Logs", "admin/logs"), "View logs"])
l_admin_links.force (["core", <<"admin path_alias">>, local_link ("Path Alias", "admin/path_alias"), "Manage path aliases"])
l_admin_links.force (["support", <<"admin cache">>, local_link ("Cache", "admin/cache"), "Clear caches"]) l_admin_links.force (["support", <<"admin cache">>, local_link ("Cache", "admin/cache"), "Clear caches"])
l_admin_links.force (["support", <<"admin export">>, local_link ("Export", "admin/export"), "Export CMS contents, and modules contents."]) l_admin_links.force (["support", <<"admin export">>, local_link ("Export", "admin/export"), "Export CMS contents, and modules contents."])
l_admin_links.force (["support", <<"admin import">>, local_link ("Export", "admin/import"), "Import CMS contents, and modules contents."]) l_admin_links.force (["support", <<"admin import">>, local_link ("Import", "admin/import"), "Import CMS contents, and modules contents."])
create categories.make_caseless (3) create categories.make_caseless (3)
across across
l_admin_links as ic l_admin_links as ic

View File

@@ -151,6 +151,10 @@ feature -- Forms ...
end end
end(?, response, a_node) end(?, response, a_node)
) )
if not cms_api.has_permission ("edit path_alias") then
-- FIXME: should we have an input field or just a raw text?
ti.set_is_readonly (True)
end
if if
attached f.fields_by_name ("title") as l_title_fields and then attached f.fields_by_name ("title") as l_title_fields and then
attached l_title_fields.first as l_title_field attached l_title_fields.first as l_title_field

View File

@@ -253,7 +253,8 @@ feature -- Form
l_preview: BOOLEAN l_preview: BOOLEAN
l_node: detachable CMS_NODE l_node: detachable CMS_NODE
s: STRING s: STRING
l_path_alias: detachable READABLE_STRING_8 l_node_path: READABLE_STRING_8
l_path_alias, l_existing_path_alias: detachable READABLE_STRING_8
do do
fixme ("Refactor code per operacion: Preview, Save") fixme ("Refactor code per operacion: Preview, Save")
l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview") l_preview := attached {WSF_STRING} fd.item ("op") as l_op and then l_op.same_string ("Preview")
@@ -301,14 +302,34 @@ feature -- Form
add_success_message ("Node #" + l_node.id.out + " saved.") add_success_message ("Node #" + l_node.id.out + " saved.")
end end
if if attached fd.string_item ("path_alias") as f_path_alias then
attached fd.string_item ("path_alias") as f_path_alias and then l_node_path := node_api.node_path (l_node)
not f_path_alias.is_empty
then
l_path_alias := percent_encoder.partial_encoded_string (f_path_alias, <<'/'>>) l_path_alias := percent_encoder.partial_encoded_string (f_path_alias, <<'/'>>)
-- Path alias, are always from the root of the cms. l_existing_path_alias := api.location_alias (l_node_path)
api.set_path_alias (node_api.node_path (l_node), l_path_alias, False) if
l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_path_alias)) l_existing_path_alias /= Void and then
l_path_alias.same_string (l_existing_path_alias)
then
-- Same path alias
l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_path_alias))
elseif l_existing_path_alias /= Void and then l_path_alias.is_whitespace then
-- Reset to builtin alias.
if api.has_permission ("edit path_alias") then
api.set_path_alias (l_node_path, l_node_path, True)
else
add_error_message ("Permission denied to reset path alias on node #" + l_node.id.out + "!")
end
l_node.set_link (node_api.node_link (l_node))
else
if api.has_permission ("edit path_alias") then
-- Path alias, are always from the root of the cms.
api.set_path_alias (l_node_path, l_path_alias, True)
l_node.set_link (create {CMS_LOCAL_LINK}.make (l_node.title, l_path_alias))
else
add_error_message ("Permission denied to set path alias on node #" + l_node.id.out + "!")
l_node.set_link (node_api.node_link (l_node))
end
end
else else
l_node.set_link (node_api.node_link (l_node)) l_node.set_link (node_api.node_link (l_node))
end end

View File

@@ -10,7 +10,8 @@ inherit
CMS_MODULE CMS_MODULE
redefine redefine
initialize, initialize,
install install,
permissions
end end
create create
@@ -102,6 +103,20 @@ feature -- Router
do do
end end
feature -- Security
permissions: LIST [READABLE_STRING_8]
-- List of permission ids, used by this module, and declared.
do
Result := Precursor
Result.force ("install modules")
Result.force ("view logs")
Result.force ("export core")
Result.force ("import core")
Result.force ("admin path_alias")
Result.force ("edit path_alias")
end
note note
copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"

View File

@@ -153,7 +153,7 @@ feature -- URL aliases
sql_finalize sql_finalize
end end
sql_select_all_path_alias: STRING = "SELECT source, alias, lang FROM path_aliases;" sql_select_all_path_alias: STRING = "SELECT source, alias, lang FROM path_aliases ORDER BY pid DESC;"
-- SQL select all path aliases. -- SQL select all path aliases.
sql_select_path_alias: STRING = "SELECT source FROM path_aliases WHERE alias=:alias ;" sql_select_path_alias: STRING = "SELECT source FROM path_aliases WHERE alias=:alias ;"
@@ -411,6 +411,6 @@ feature -- Misc
note note
copyright: "2011-2016, Jocelyn Fiat, Javier Velilla, Eiffel Software and others" copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end end