Files
ROC/modules/taxonomy/handler/taxonomy_vocabulary_admin_handler.e

415 lines
12 KiB
Plaintext

note
description: "[
Request handler related to
/admin/taxonomy/vocabulary/
/admin/taxonomy/vocabulary/{vocid}
]"
date: "$Date$"
revision: "$revision$"
class
TAXONOMY_VOCABULARY_ADMIN_HANDLER
inherit
CMS_MODULE_HANDLER [CMS_TAXONOMY_API]
rename
module_api as taxonomy_api
end
WSF_URI_HANDLER
rename
execute as uri_execute,
new_mapping as new_uri_mapping
end
WSF_URI_TEMPLATE_HANDLER
rename
execute as uri_template_execute,
new_mapping as new_uri_template_mapping
select
new_uri_template_mapping
end
WSF_RESOURCE_HANDLER_HELPER
redefine
do_get,
do_post
end
REFACTORING_HELPER
CMS_API_ACCESS
create
make
feature -- execute
execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler for any kind of mapping.
do
execute_methods (req, res)
end
uri_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler for URI mapping.
do
execute (req, res)
end
uri_template_execute (req: WSF_REQUEST; res: WSF_RESPONSE)
-- Execute request handler for URI-template mapping.
do
execute (req, res)
end
feature -- HTTP Methods
do_post (req: WSF_REQUEST; res: WSF_RESPONSE)
local
l_page: CMS_RESPONSE
voc: CMS_VOCABULARY
l_typename: READABLE_STRING_GENERAL
s: STRING
do
if not api.has_permission ("admin taxonomy") then
send_access_denied (req, res)
else
if attached {WSF_STRING} req.form_parameter ("op") as p_op then
if p_op.same_string ("New Vocabulary") then
if
attached {WSF_STRING} req.form_parameter ("vocabulary_name") as p_name and then
not p_name.is_empty
then
create voc.make (p_name.value)
taxonomy_api.save_vocabulary (voc)
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
if taxonomy_api.has_error then
l_page.add_error_message ("Vocabulary creation failed!")
else
l_page.add_success_message ("Vocabulary creation succeed!")
l_page.set_redirection (api.administration_path_location ("taxonomy/vocabulary/" + voc.id.out))
end
else
create {BAD_REQUEST_ERROR_CMS_RESPONSE} l_page.make (req, res, api)
end
elseif
p_op.same_string ("Save changes") and then
attached {WSF_STRING} req.path_parameter ("vocid") as p_vocid and then p_vocid.is_integer and then
attached taxonomy_api.vocabulary (p_vocid.value.to_integer_64) as l_vocabulary
then
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
create s.make_empty
l_page.add_notice_message ("Vocabulary " + l_vocabulary.id.out)
if attached {WSF_STRING} req.form_parameter ("name") as p_name then
l_vocabulary.set_name (p_name.value)
end
if attached {WSF_STRING} req.form_parameter ("description") as p_desc then
l_vocabulary.set_description (p_desc.value)
end
if attached {WSF_STRING} req.form_parameter ("weight") as p_weight and then p_weight.is_integer then
l_vocabulary.set_weight (p_weight.integer_value)
end
taxonomy_api.save_vocabulary (l_vocabulary)
if taxonomy_api.has_error then
l_page.add_error_message ("Could not save vocabulary")
elseif
attached {WSF_TABLE} req.form_parameter ("typenames") as typenames_table
then
across
typenames_table as ic
loop
l_typename := ic.item.string_representation
create voc.make_from_term (l_vocabulary)
voc.set_associated_content_type (l_typename, False, False, False)
l_page.add_notice_message ("Content type :" + api.html_encoded (l_typename))
if attached {WSF_TABLE} req.form_parameter ({STRING_32} "vocabulary_" + l_typename.as_string_32) as opts then
across
opts as o_ic
loop
if o_ic.item.same_string ("tags") then
voc.set_is_tags (True)
elseif o_ic.item.same_string ("multiple") then
voc.allow_multiple_term (True)
elseif o_ic.item.same_string ("required") then
voc.set_is_term_required (True)
end
end
end
taxonomy_api.associate_vocabulary_with_type (voc, l_typename)
if taxonomy_api.has_error then
l_page.add_error_message ("Could not save vocabulary content type associations.")
end
end
end
if not taxonomy_api.has_error then
l_page.add_notice_message (l_page.link ({STRING_32} "Back to vocabulary %"" + l_vocabulary.name + "%"", api.administration_path_location ("taxonomy/vocabulary/" + l_vocabulary.id.out), Void))
end
l_page.set_main_content (s)
else
create {NOT_IMPLEMENTED_ERROR_CMS_RESPONSE} l_page.make (req, res, api)
end
else
create {BAD_REQUEST_ERROR_CMS_RESPONSE} l_page.make (req, res, api)
end
l_page.execute
end
end
do_get (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
tid: INTEGER_64
do
if not api.has_permission ("admin taxonomy") then
send_access_denied (req, res)
else
if attached {WSF_STRING} req.path_parameter ("vocid") as p_vocid then
if p_vocid.is_integer then
tid := p_vocid.value.to_integer_64
end
end
if tid > 0 then
do_get_vocabulary (tid, req, res)
else
do_get_vocabularies (req, res)
end
end
end
do_get_vocabulary (tid: INTEGER_64; req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
require
valid_tid: tid > 0
local
l_page: CMS_RESPONSE
s: STRING
l_typename: detachable READABLE_STRING_8
v: detachable CMS_VOCABULARY
l_typenames: detachable LIST [READABLE_STRING_32]
f: CMS_FORM
wtb: WSF_WIDGET_TABLE
wtb_row: WSF_WIDGET_TABLE_ROW
wtb_item: WSF_WIDGET_TABLE_ITEM
voc: detachable CMS_VOCABULARY
l_term: detachable CMS_TERM
tf_input: WSF_FORM_TEXT_INPUT
tf_text: WSF_FORM_TEXTAREA
tf_num: WSF_FORM_NUMBER_INPUT
w_set: WSF_FORM_FIELD_SET
w_cb: WSF_FORM_CHECKBOX_INPUT
sub: WSF_FORM_SUBMIT_INPUT
do
voc := taxonomy_api.vocabulary (tid)
if voc /= Void then
-- Responding with `main_content_html (l_page)'.
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
l_page.set_title (voc.name)
taxonomy_api.fill_vocabularies_with_terms (voc)
create f.make (req.percent_encoded_path_info, "taxonomy")
create tf_input.make_with_text ("name", voc.name)
f.extend (tf_input)
create tf_text.make ("description")
tf_text.set_text_value (voc.description)
tf_text.set_description ("Description of the vocabulary; also used as intructions to present to the user when selecting terms.")
tf_text.set_rows (3)
f.extend (tf_text)
create tf_num.make_with_text ("weight", voc.weight.out)
tf_num.set_label ("weight")
tf_num.set_description ("Items are displayed in ascending order by weight.")
f.extend (tf_num)
create wtb.make
wtb.add_css_class ("with_border")
create wtb_row.make (2)
create wtb_item.make_with_text ("Text")
wtb_row.set_item (wtb_item, 1)
create wtb_item.make_with_text ("Description")
wtb_row.set_item (wtb_item, 2)
wtb.add_head_row (wtb_row)
across
voc as ic
loop
l_term := ic.item
create wtb_row.make (3)
wtb.add_row (wtb_row)
create wtb_item.make_with_text (l_page.link (ic.item.text, api.administration_path_location ("taxonomy/term/" + l_term.id.out), Void))
wtb_row.set_item (wtb_item, 1)
if attached ic.item.description as l_desc then
create wtb_item.make_with_text (api.html_encoded (l_desc))
else
create wtb_item.make_with_text ("")
end
wtb_row.set_item (wtb_item, 2)
end
if wtb.body_row_count > 0 then
f.extend (wtb)
else
f.extend_raw_text ("No terms.")
end
create w_set.make
w_set.set_legend ("Content types")
f.extend (w_set)
l_typenames := taxonomy_api.types_associated_with_vocabulary (voc)
create wtb.make
wtb.add_css_class ("with_border")
create wtb_row.make (5)
wtb_row.set_item (create {WSF_WIDGET_TABLE_ITEM}.make_with_text ("Type"), 1)
create wtb_item.make_with_text ("Settings ...")
wtb_item.add_html_attribute ("colspan", "3")
wtb_row.set_item (wtb_item, 2)
wtb.add_head_row (wtb_row)
across
api.content_types as ic
loop
create wtb_row.make (4)
wtb.add_row (wtb_row)
l_typename := ic.item.name
create w_cb.make_with_value ("typenames[]", api.html_encoded (l_typename))
w_cb.set_title (ic.item.name.to_string_32)
wtb_row.set_item (create {WSF_WIDGET_TABLE_ITEM}.make_with_content (w_cb), 1)
v := Void
if
l_typenames /= Void and then
across l_typenames as tn_ic some l_typename.is_case_insensitive_equal_general (tn_ic.item) end
then
w_cb.set_checked (True)
if attached taxonomy_api.vocabularies_for_type (l_typename) as v_list then
across v_list as v_ic until v /= Void loop
if v_ic.item.id = voc.id then
v := v_ic.item
end
end
end
end
create w_cb.make_with_value ("vocabulary_" + l_typename +"[]", "tags")
w_cb.set_title ("Tags")
w_cb.set_checked (v /= Void and then v.is_tags)
wtb_row.set_item (create {WSF_WIDGET_TABLE_ITEM}.make_with_content (w_cb), 2)
create w_cb.make_with_value ("vocabulary_" + l_typename +"[]", "multiple")
w_cb.set_title ("Multiple Select")
w_cb.set_checked (v /= Void and then v.multiple_terms_allowed)
wtb_row.set_item (create {WSF_WIDGET_TABLE_ITEM}.make_with_content (w_cb), 3)
create w_cb.make_with_value ("vocabulary_" + l_typename +"[]", "required")
w_cb.set_title ("Required")
w_cb.set_checked (v /= Void and then v.is_term_required)
wtb_row.set_item (create {WSF_WIDGET_TABLE_ITEM}.make_with_content (w_cb), 4)
end
if wtb.body_row_count > 0 then
w_set.extend (wtb)
end
create sub.make_with_text ("op", "Save changes")
f.extend (sub)
create s.make_empty
f.append_to_html (l_page.wsf_theme, s)
l_page.set_main_content (s)
l_page.execute
else
-- Responding with `main_content_html (l_page)'.
send_not_found (req, res)
end
end
do_get_vocabularies (req: WSF_REQUEST; res: WSF_RESPONSE)
-- <Precursor>
local
l_page: CMS_RESPONSE
s: STRING
l_typenames: detachable LIST [READABLE_STRING_32]
f: CMS_FORM
wtb: WSF_WIDGET_TABLE
wtb_row: WSF_WIDGET_TABLE_ROW
wtb_item: WSF_WIDGET_TABLE_ITEM
voc: detachable CMS_VOCABULARY
tf_input: WSF_FORM_TEXT_INPUT
w_set: WSF_FORM_FIELD_SET
sub: WSF_FORM_SUBMIT_INPUT
do
-- Responding with `main_content_html (l_page)'.
create {GENERIC_VIEW_CMS_RESPONSE} l_page.make (req, res, api)
create wtb.make
wtb.add_css_class ("with_border")
create wtb_row.make (3)
create wtb_item.make_with_text ("Name")
wtb_row.set_item (wtb_item, 1)
create wtb_item.make_with_text ("Type")
wtb_row.set_item (wtb_item, 2)
create wtb_item.make_with_text ("Operations")
wtb_row.set_item (wtb_item, 3)
wtb.add_head_row (wtb_row)
if attached taxonomy_api.vocabularies (0, 0) as lst then
across
lst as ic
loop
voc := ic.item
create wtb_row.make (3)
wtb.add_row (wtb_row)
create wtb_item.make_with_text (l_page.link (ic.item.name, api.administration_path_location ("taxonomy/vocabulary/" + ic.item.id.out), Void))
-- if attached ic.item.description as l_desc then
-- s.append (" : <em>")
-- s.append (api.html_encoded (l_desc))
-- s.append ("</em>")
-- end
wtb_row.set_item (wtb_item, 1)
l_typenames := taxonomy_api.types_associated_with_vocabulary (voc)
if l_typenames /= Void then
create s.make_empty
across
l_typenames as types_ic
loop
if not s.is_empty then
s.append_character (',')
s.append_character (' ')
end
s.append (api.html_encoded (types_ic.item))
end
create wtb_item.make_with_text (s)
wtb_row.set_item (wtb_item, 2)
end
s := l_page.link ("edit", api.administration_path_location ("taxonomy/vocabulary/" + voc.id.out), Void)
create wtb_item.make_with_text (s)
wtb_row.set_item (wtb_item, 3)
end
end
create f.make (req.percent_encoded_path_info, "taxonomy")
f.set_method_post
f.extend (wtb)
create w_set.make
w_set.set_legend ("Create a new vocabulary")
create tf_input.make_with_text ("vocabulary_name", "")
tf_input.set_label ("Vocabulary name")
w_set.extend (tf_input)
create sub.make_with_text ("op", "New Vocabulary")
w_set.extend (sub)
f.extend (w_set)
create s.make_empty
f.append_to_html (l_page.wsf_theme, s)
l_page.set_title ("Vocabularies")
l_page.set_main_content (s)
l_page.execute
end
end