Added notion of author (owner) and editor to allow the editing of node by non owner users.

This commit is contained in:
2017-03-03 11:12:51 +01:00
parent 4cbdfeff06
commit 6cb6dd1609
18 changed files with 248 additions and 70 deletions

View File

@@ -8,6 +8,7 @@ CREATE TABLE nodes (
`content` TEXT,
`format` VARCHAR(128),
`author` INTEGER,
`editor` INTEGER,
`publish` DATETIME,
`created` DATETIME NOT NULL,
`changed` DATETIME NOT NULL,
@@ -23,6 +24,7 @@ CREATE TABLE node_revisions (
`content` TEXT,
`format` VARCHAR(128),
`author` INTEGER,
`editor` INTEGER,
`changed` DATETIME NOT NULL,
`status` INTEGER,
CONSTRAINT Unique_nid_revision PRIMARY KEY (nid,revision)

View File

@@ -0,0 +1,7 @@
ALTER TABLE nodes ADD editor INTEGER ;
UPDATE nodes SET editor = author;
ALTER TABLE node_revisions ADD editor INTEGER ;
UPDATE node_revisions SET editor = author;

View File

@@ -276,7 +276,11 @@ feature -- Hooks
if l_entity.is_published then
if l_entity.author = Void then
-- FIXME!!!
if attached l_entity.editor as l_last_editor then
l_entity.set_author (l_last_editor)
else
l_entity.set_author (l_blog_api.cms_api.user)
end
a_import_ctx.log (l_node_type.name + " %"" + fp.utf_8_name + "%" WARNING (Author is unknown!)")
end
if attached l_entity.author as l_author then

View File

@@ -159,16 +159,28 @@ feature {NONE} -- Queries
-- Nodes count (Published and not Published)
--| note: {CMS_NODE_API}.trashed = -1
sql_select_blogs_order_created_desc: STRING = "SELECT * FROM nodes WHERE status != -1 AND type = %"blog%" ORDER BY created DESC;"
sql_select_blogs_order_created_desc: STRING
-- SQL Query to retrieve all nodes that are from the type "blog" ordered by descending creation date.
once
Result := sql_select_all_from_nodes + " WHERE status != -1 AND type = %"blog%" ORDER BY created DESC;"
end
sql_blogs_limited: STRING = "SELECT * FROM nodes WHERE status != -1 AND type = %"blog%" ORDER BY created DESC LIMIT :limit OFFSET :offset ;"
sql_blogs_limited: STRING
--- SQL Query to retrieve all nodes of type "blog" limited by limit and starting at offset
once
Result := sql_select_all_from_nodes + " WHERE status != -1 AND type = %"blog%" ORDER BY created DESC LIMIT :limit OFFSET :offset ;"
end
sql_blogs_from_user_limited: STRING = "SELECT * FROM nodes WHERE status != -1 AND type = %"blog%" AND author = :user ORDER BY created DESC LIMIT :limit OFFSET :offset ;"
sql_blogs_from_user_limited: STRING
--- SQL Query to retrieve all nodes of type "blog" from author with id limited by limit + offset
once
Result := sql_select_all_from_nodes + " WHERE status != -1 AND type = %"blog%" AND author = :user ORDER BY created DESC LIMIT :limit OFFSET :offset ;"
end
sql_blogs_from_user_with_title: STRING = "SELECT * FROM nodes WHERE status != -1 AND type = %"blog%" AND author = :user AND title = :title ORDER BY created DESC;"
sql_blogs_from_user_with_title: STRING
--- SQL Query to retrieve all nodes of type "blog" from author with title .
once
Result := sql_select_all_from_nodes + " WHERE status != -1 AND type = %"blog%" AND author = :user AND title = :title ORDER BY created DESC;"
end
end

View File

@@ -243,10 +243,8 @@ feature -- Access: Node
check has_link: Result.has_id implies attached Result.link as lnk and then lnk.location.same_string (node_link (Result).location) end
-- Update partial user if needed.
if
Result /= Void and then
attached {CMS_PARTIAL_USER} Result.author as l_partial_author
then
if Result /= Void then
if attached {CMS_PARTIAL_USER} Result.author as l_partial_author then
if attached cms_api.user_api.user_by_id (l_partial_author.id) as l_author then
Result.set_author (l_author)
else
@@ -255,6 +253,16 @@ feature -- Access: Node
end
end
end
if attached {CMS_PARTIAL_USER} Result.editor as l_partial_editor then
if attached cms_api.user_api.user_by_id (l_partial_editor.id) as l_editor then
Result.set_editor (l_editor)
else
check
valid_author_id: False
end
end
end
end
end
full_nodes (a_nodes: LIST [CMS_NODE]): LIST [CMS_NODE]

View File

@@ -37,7 +37,7 @@ feature {NONE} -- Initialization
make
-- Create Current module, disabled by default.
do
version := "1.0"
version := "1.0.0.1"
description := "Service to manage content based on 'node'"
package := "core"
-- Optional dependencies, mainly for information.
@@ -327,7 +327,7 @@ feature -- Hooks
end
end
ch.set_information (l_info)
ch.set_author (n.author)
ch.set_author (n.editor)
ch.set_summary (n.summary)
if attached {CMS_TAXONOMY_API} l_node_api.cms_api.module_api ({CMS_TAXONOMY_MODULE}) as l_taxonomy_api then
if attached l_taxonomy_api.terms_of_content (n, Void) as l_terms then

View File

@@ -28,7 +28,7 @@ feature{NONE} -- Initialization
end
make (a_title: READABLE_STRING_32)
-- Create current node with `a_title'.
-- Create current node with `a_title`.
local
now: DATE_TIME
do
@@ -45,7 +45,7 @@ feature{NONE} -- Initialization
feature -- Conversion
import_node (a_node: CMS_NODE)
-- Import `a_node' into current node.
-- Import `a_node` into current node.
do
set_id (a_node.id)
set_revision (a_node.revision)
@@ -54,6 +54,7 @@ feature -- Conversion
set_modification_date (a_node.modification_date)
set_publication_date (a_node.publication_date)
set_author (a_node.author)
set_editor (a_node.editor)
set_content (
a_node.content,
a_node.summary,
@@ -144,7 +145,10 @@ feature -- Access: date
feature -- Access: author
author: detachable CMS_USER
-- Author of current node.
-- Author of current node (i.e creator).
editor: detachable CMS_USER
-- Last user that modified Current node.
feature -- status report
@@ -155,7 +159,7 @@ feature -- status report
end
same_node (a_node: CMS_NODE): BOOLEAN
-- Is `a_node' same node as Current?
-- Is `a_node` same node as Current?
do
-- FIXME: if we introduce notion of revision, update this part!
Result := Current = a_node or id = a_node.id
@@ -182,8 +186,8 @@ feature -- Status report
feature -- Element change
set_content (a_content: like content; a_summary: like summary; a_format: like format)
-- Set `content', `summary' and `format' to `a_content', `a_summary' and `a_format'.
-- The `format' is associated with both `content' and `summary'
-- Set `content`, `summary` and `format` to `a_content`, `a_summary` and `a_format`.
-- The `format` is associated with both `content` and `summary`
deferred
ensure
content_assigned: content = a_content
@@ -192,7 +196,7 @@ feature -- Element change
end
set_title (a_title: like title)
-- Assign `title' with `a_title'.
-- Assign `title` with `a_title`.
do
title := a_title
if attached link as lnk then
@@ -203,7 +207,7 @@ feature -- Element change
end
set_modification_date (a_modification_date: like modification_date)
-- Assign `modification_date' with `a_modification_date'.
-- Assign `modification_date` with `a_modification_date`.
do
modification_date := a_modification_date
ensure
@@ -211,7 +215,7 @@ feature -- Element change
end
set_creation_date (a_creation_date: like creation_date)
-- Assign `creation_date' with `a_creation_date'.
-- Assign `creation_date` with `a_creation_date`.
do
creation_date := a_creation_date
ensure
@@ -219,7 +223,7 @@ feature -- Element change
end
set_publication_date (a_publication_date: like publication_date)
-- Assign `publication_date' with `a_publication_date'.
-- Assign `publication_date` with `a_publication_date`.
do
publication_date := a_publication_date
publication_date_output := publication_date.formatted_out ("yyyy/[0]mm/[0]dd")
@@ -228,7 +232,7 @@ feature -- Element change
end
set_id (a_id: like id)
-- Assign `id' with `a_id'.
-- Assign `id` with `a_id`.
do
id := a_id
ensure
@@ -236,7 +240,7 @@ feature -- Element change
end
set_revision (a_revision: like revision)
-- Assign `revision' with `a_revision'.
-- Assign `revision` with `a_revision`.
do
revision := a_revision
ensure
@@ -244,15 +248,23 @@ feature -- Element change
end
set_author (u: like author)
-- Assign 'author' with `u'
-- Assign `author` with `u`
do
author := u
ensure
auther_set: author = u
end
set_editor (u: like editor)
-- Assign `last_editor` with `u`
do
editor := u
ensure
last_editor_set: editor = u
end
set_link (a_link: like link)
-- Set `link' to `a_link'.
-- Set `link` to `a_link`.
do
link := a_link
end
@@ -286,7 +298,7 @@ feature -- Status change
feature {CMS_NODE_STORAGE_I} -- Access: status change.
set_status (a_status: like status)
-- Assign `status' with `a_status'.
-- Assign `status` with `a_status`.
do
status := a_status
ensure

View File

@@ -33,6 +33,9 @@ feature -- Access
if attached n.author as u then
Result.put (user_to_json (u), "author")
end
if attached n.editor as u then
Result.put (user_to_json (u), "editor")
end
create jo.make_empty
if attached n.format as l_format then
jo.put_string (l_format, "format")

View File

@@ -201,9 +201,9 @@ feature -- Forms ...
s := l_summary
end
if attached fd.string_item ("format") as s_format and then attached response.api.format (s_format) as f_format then
if attached fd.string_item ("format") as s_format and then attached cms_api.format (s_format) as f_format then
f := f_format
elseif a_node /= Void and then attached a_node.format as s_format and then attached response.api.format (s_format) as f_format then
elseif a_node /= Void and then attached a_node.format as s_format and then attached cms_api.format (s_format) as f_format then
f := f_format
else
f := cms_api.formats.default_format
@@ -214,8 +214,13 @@ feature -- Forms ...
a_node.set_content (b, s, f.name)
end
-- Update author
a_node.set_author (response.user)
-- Update editor, author
a_node.set_editor (cms_api.user)
if a_node.author = Void then
a_node.set_author (cms_api.user)
else
-- Keep existing author as creator!
end
end
new_node (response: NODE_RESPONSE; fd: WSF_FORM_DATA; a_node: detachable CMS_NODE): G
@@ -253,7 +258,8 @@ feature -- Forms ...
l_node := content_type.new_node_with_title ("...", Void)
end
end
l_node.set_author (response.user)
l_node.set_author (cms_api.user)
l_node.set_editor (cms_api.user)
--Summary
if attached fd.string_item ("summary") as l_summary then

View File

@@ -471,6 +471,7 @@ feature -- Form
Result := a_content_type.new_node (a_node)
end
Result.set_author (user)
Result.set_editor (user)
end
apply_form_data_to_node (a_content_type: CMS_NODE_TYPE [CMS_NODE]; a_form_data: WSF_FORM_DATA; a_node: CMS_NODE)

View File

@@ -333,11 +333,20 @@ feature {NONE} -- Trash:Restore
b.append (" #")
b.append (n.revision.out)
b.append (" : ")
b.append (n.modification_date.out)
b.append (api.formatted_date_time_yyyy_mm_dd__hh_min_ss (n.modification_date))
b.append ("</a>")
if attached n.author as l_author then
b.append (" by ")
if attached n.editor as l_editor then
if n.revision = 1 then
b.append (" created by ")
else
b.append (" edited by ")
end
b.append (r.link (r.user_profile_name (l_editor), "user/" + l_editor.id.out, Void))
end
if attached n.author as l_author and then not l_author.same_as (n.editor) then
b.append (" (owner: ")
b.append (r.link (r.user_profile_name (l_author), "user/" + l_author.id.out, Void))
b.append (")")
end
if node_api.has_permission_for_action_on_node ("edit revisions", l_node, api.user) then
b.append (" (<a href=%"")

View File

@@ -85,6 +85,10 @@ feature -- Conversion
if attached {JSON_OBJECT} j.item ("author") as j_author then
l_node.set_author (json_to_user (j_author, a_node_api))
end
if attached {JSON_OBJECT} j.item ("editor") as j_editor then
l_node.set_editor (json_to_user (j_editor, a_node_api))
end
if attached {JSON_OBJECT} j.item ("data") as j_data then
l_node.set_all_content (json_string_item (j_data, "content"), json_string_item (j_data, "summary"), json_string_8_item (j_data, "format"))
end

View File

@@ -435,7 +435,7 @@ feature {NONE} -- Implementation
error_handler.reset
write_information_log (generator + ".store_node")
create l_parameters.make (9)
create l_parameters.make (10)
l_parameters.put (a_node.content_type, "type")
l_parameters.put (a_node.title, "title")
l_parameters.put (a_node.summary, "summary")
@@ -450,6 +450,13 @@ feature {NONE} -- Implementation
else
l_parameters.put (0, "author")
end
if attached a_node.editor as l_editor then
check valid_editor: l_editor.has_id end
l_parameters.put (l_editor.id, "editor")
else
l_parameters.put (0, "editor")
end
sql_begin_transaction
if a_node.has_id then
@@ -510,7 +517,7 @@ feature -- Helpers
extended_load (a_node)
end
feature {NONE} -- Queries
feature {NONE} -- Queries nodes
sql_select_nodes_count: STRING = "SELECT count(*) FROM nodes WHERE status != -1 ;"
-- Nodes count (Published and not Published)
@@ -520,43 +527,86 @@ feature {NONE} -- Queries
-- Nodes of type `:node_type` count (Published and not Published)
--| note: {CMS_NODE_API}.trashed = -1
sql_select_nodes: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE status != -1 ;"
sql_select_nodes: STRING
-- SQL Query to retrieve all nodes.
--| note: {CMS_NODE_API}.trashed = -1
once
Result := sql_select_all_from_nodes + " WHERE status != -1 ;"
end
sql_select_nodes_of_type: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE status != -1 AND type=:node_type ;"
sql_select_nodes_of_type: STRING
-- SQL Query to retrieve all nodes of type :node_type.
--| note: {CMS_NODE_API}.trashed = -1
once
Result := sql_select_all_from_nodes + " WHERE status != -1 AND type=:node_type ;"
end
sql_select_nodes_of_type_with_title: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE status != -1 AND type=:node_type AND title=:title;"
sql_select_nodes_of_type_with_title: STRING
-- SQL Query to retrieve all nodes of type :node_type with title :title.
--| note: {CMS_NODE_API}.trashed = -1
once
Result := sql_select_all_from_nodes + " WHERE status != -1 AND type=:node_type AND title=:title;"
end
sql_select_node_revisions: STRING = "SELECT nodes.nid, node_revisions.revision, nodes.type, node_revisions.title, node_revisions.summary, node_revisions.content, node_revisions.format, node_revisions.author, nodes.publish, nodes.created, node_revisions.changed, node_revisions.status FROM nodes INNER JOIN node_revisions ON nodes.nid = node_revisions.nid WHERE nodes.nid = :nid AND node_revisions.revision < :revision ORDER BY node_revisions.revision DESC;"
-- SQL query to get node revisions (missing the latest one).
sql_select_trash_nodes: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE status = -1 ;"
sql_select_trash_nodes: STRING
-- SQL Query to retrieve all trahsed nodes.
--| note: {CMS_NODE_API}.trashed = -1
once
Result := sql_select_all_from_nodes + " WHERE status = -1 ;"
end
sql_select_trash_nodes_by_author: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE status = -1 and author = :author ;"
sql_select_trash_nodes_by_author: STRING
-- SQL Query to retrieve all nodes by a given author.
--| note: {CMS_NODE_API}.trashed = -1
once
Result := sql_select_all_from_nodes + " WHERE status = -1 and author = :author ;"
end
sql_select_node_by_id: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE nid =:nid ORDER BY revision DESC, publish DESC LIMIT 1;"
sql_select_node_by_id: STRING
--
once
Result := sql_select_all_from_nodes + " WHERE nid =:nid ORDER BY revision DESC, publish DESC LIMIT 1;"
end
sql_select_node_by_id_and_revision: STRING = "SELECT nodes.nid, node_revisions.revision, nodes.type, node_revisions.title, node_revisions.summary, node_revisions.content, node_revisions.format, node_revisions.author, nodes.publish, nodes.created, node_revisions.changed, node_revisions.status FROM nodes INNER JOIN node_revisions ON nodes.nid = node_revisions.nid WHERE nodes.nid = :nid AND node_revisions.revision = :revision ORDER BY node_revisions.revision DESC;"
sql_select_recent_nodes: STRING
--
once
Result := sql_select_all_from_nodes + " ORDER BY changed DESC, publish DESC LIMIT :size OFFSET :offset ;"
end
sql_select_recent_nodes: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes ORDER BY changed DESC, publish DESC LIMIT :size OFFSET :offset ;"
sql_select_recent_nodes_of_type: STRING
--
once
Result := sql_select_all_from_nodes + " WHERE type=:node_type ORDER BY changed DESC, publish DESC LIMIT :size OFFSET :offset ;"
end
sql_select_recent_nodes_of_type: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE type=:node_type ORDER BY changed DESC, publish DESC LIMIT :size OFFSET :offset ;"
sql_select_recent_node_changes_before: STRING
--
once
Result := sql_select_all_from_nodes + " WHERE changed <= :date ORDER BY changed DESC, nid DESC LIMIT :size OFFSET :offset ;"
end
sql_select_recent_node_changes_before: STRING = "SELECT nid, revision, type, title, summary, content, format, author, publish, created, changed, status FROM nodes WHERE changed <= :date ORDER BY changed DESC, nid DESC LIMIT :size OFFSET :offset ;"
feature {NONE} -- Queries node revisions
sql_insert_node: STRING = "INSERT INTO nodes (revision, type, title, summary, content, format, publish, created, changed, status, author) VALUES (:revision, :type, :title, :summary, :content, :format, :publish, :created, :changed, :status, :author);"
sql_select_node_revisions: STRING = "SELECT nodes.nid, node_revisions.revision, nodes.type, node_revisions.title, node_revisions.summary, node_revisions.content, node_revisions.format, node_revisions.author, node_revisions.editor, nodes.publish, nodes.created, node_revisions.changed, node_revisions.status FROM nodes INNER JOIN node_revisions ON nodes.nid = node_revisions.nid WHERE nodes.nid = :nid AND node_revisions.revision < :revision ORDER BY node_revisions.revision DESC;"
-- SQL query to get node revisions (missing the latest one).
sql_select_node_by_id_and_revision: STRING = "SELECT nodes.nid, node_revisions.revision, nodes.type, node_revisions.title, node_revisions.summary, node_revisions.content, node_revisions.format, node_revisions.author, node_revisions.editor, node_revisions.editor, nodes.publish, nodes.created, node_revisions.changed, node_revisions.status FROM nodes INNER JOIN node_revisions ON nodes.nid = node_revisions.nid WHERE nodes.nid = :nid AND node_revisions.revision = :revision ORDER BY node_revisions.revision DESC;"
--
sql_copy_node_to_revision: STRING = "INSERT INTO node_revisions (nid, revision, title, summary, content, format, author, editor, changed, status) SELECT nid, revision, title, summary, content, format, author, editor, changed, status FROM nodes WHERE nid=:nid;"
Sql_last_insert_node_revision: STRING = "SELECT MAX(revision) FROM node_revisions;"
Sql_last_insert_node_revision_for_nid: STRING = "SELECT MAX(revision) FROM node_revisions WHERE nid=:nid;"
sql_delete_node_revisions: STRING = "DELETE FROM node_revisions WHERE nid=:nid;"
feature {NONE} -- Queries insert and update
sql_insert_node: STRING = "INSERT INTO nodes (revision, type, title, summary, content, format, publish, created, changed, status, author, editor) VALUES (:revision, :type, :title, :summary, :content, :format, :publish, :created, :changed, :status, :author, :editor);"
-- SQL Insert to add a new node.
sql_update_node : STRING = "UPDATE nodes SET revision=:revision, type=:type, title=:title, summary=:summary, content=:content, format=:format, publish=:publish, changed=:changed, status=:status, author=:author WHERE nid=:nid;"
sql_update_node : STRING = "UPDATE nodes SET revision=:revision, type=:type, title=:title, summary=:summary, content=:content, format=:format, publish=:publish, changed=:changed, status=:status, author=:author, editor=:editor WHERE nid=:nid;"
-- SQL update node.
sql_trash_node: STRING = "UPDATE nodes SET changed=:changed, status =:status WHERE nid=:nid"
@@ -570,15 +620,10 @@ feature {NONE} -- Queries
sql_last_insert_node_id: STRING = "SELECT MAX(nid) FROM nodes;"
sql_copy_node_to_revision: STRING = "INSERT INTO node_revisions (nid, revision, title, summary, content, format, author, changed, status) SELECT nid, revision, title, summary, content, format, author, changed, status FROM nodes WHERE nid=:nid;"
Sql_last_insert_node_revision: STRING = "SELECT MAX(revision) FROM node_revisions;"
Sql_last_insert_node_revision_for_nid: STRING = "SELECT MAX(revision) FROM node_revisions WHERE nid=:nid;"
sql_delete_node_revisions: STRING = "DELETE FROM node_revisions WHERE nid=:nid;"
feature {NONE} -- Implementation
sql_select_all_from_nodes: STRING = "SELECT nid, revision, type, title, summary, content, format, author, editor, publish, created, changed, status FROM nodes "
fetch_node: detachable CMS_PARTIAL_NODE
do
if attached sql_read_string (3) as l_type then
@@ -605,16 +650,19 @@ feature {NONE} -- Implementation
if attached sql_read_integer_64 (8) as l_author_id then
Result.set_author (create {CMS_PARTIAL_USER}.make_with_id (l_author_id))
end
if attached sql_read_date_time (9) as l_publication_date then
if attached sql_read_integer_64 (9) as l_editor_id then
Result.set_editor (create {CMS_PARTIAL_USER}.make_with_id (l_editor_id))
end
if attached sql_read_date_time (10) as l_publication_date then
Result.set_publication_date (l_publication_date)
end
if attached sql_read_date_time (10) as l_creation_date then
if attached sql_read_date_time (11) as l_creation_date then
Result.set_creation_date (l_creation_date)
end
if attached sql_read_date_time (11) as l_modif_date then
if attached sql_read_date_time (12) as l_modif_date then
Result.set_modification_date (l_modif_date)
end
if attached sql_read_integer_32 (12) as l_status then
if attached sql_read_integer_32 (13) as l_status then
Result.set_status (l_status)
end
end

View File

@@ -8,6 +8,7 @@ CREATE TABLE nodes (
`content` TEXT,
`format` VARCHAR(128),
`author` INTEGER,
`editor` INTEGER,
`publish` DATETIME,
`created` DATETIME NOT NULL,
`changed` DATETIME NOT NULL,
@@ -23,6 +24,7 @@ CREATE TABLE node_revisions (
`content` TEXT,
`format` VARCHAR(128),
`author` INTEGER,
`editor` INTEGER,
`changed` DATETIME NOT NULL,
`status` INTEGER,
CONSTRAINT Unique_nid_revision PRIMARY KEY (nid,revision)

View File

@@ -0,0 +1,7 @@
ALTER TABLE nodes ADD editor INTEGER ;
UPDATE nodes SET editor = author;
ALTER TABLE node_revisions ADD editor INTEGER ;
UPDATE node_revisions SET editor = author;

View File

@@ -275,7 +275,11 @@ feature -- Hooks
if l_entity.is_published then
if l_entity.author = Void then
-- FIXME!!!
if attached l_entity.editor as l_editor then
l_entity.set_author (l_editor)
else
l_entity.set_author (l_page_api.cms_api.user)
end
a_import_ctx.log (l_node_type.name + " %"" + fp.utf_8_name + "%" WARNING (Author is unknown!)")
end
if attached l_entity.author as l_author then

View File

@@ -72,13 +72,13 @@ feature -- Access
feature {NONE} -- Queries
sql_select_available_parents_for_node : STRING = "[
SELECT node.nid, node.revision, node.type, title, summary, content, format, author, publish, created, changed, status
SELECT node.nid, node.revision, node.type, title, summary, content, format, author, editor, publish, created, changed, status
FROM nodes node LEFT JOIN page_nodes pn ON node.nid = pn.nid AND node.nid != :nid
WHERE node.nid != :nid AND pn.parent != :nid AND node.status != -1 GROUP BY node.nid, node.revision;
]"
sql_select_children_of_node: STRING = "[
SELECT node.nid, node.revision, node.type, title, summary, content, format, author, publish, created, changed, status
SELECT node.nid, node.revision, node.type, title, summary, content, format, author, editor, publish, created, changed, status
FROM nodes node LEFT JOIN page_nodes pn ON node.nid = pn.nid
WHERE pn.parent = :nid AND node.status != -1 GROUP BY node.nid, node.revision;
]"

View File

@@ -417,6 +417,55 @@ feature -- Internationalization (i18n)
Result.append_string_general (ago.smart_date_duration (dt))
end
formatted_date_time_yyyy_mm_dd (dt: DATE_TIME): STRING_8
-- Output date `dt` using YYYY-MM-DD
local
i: INTEGER
do
create Result.make (10)
Result.append_integer (dt.year)
Result.append_character ('-')
i := dt.month
if i <= 9 then
Result.append_character ('0')
end
Result.append_integer (i)
Result.append_character ('-')
i := dt.day
if i <= 9 then
Result.append_character ('0')
end
Result.append_integer (i)
end
formatted_date_time_yyyy_mm_dd__hh_min_ss (dt: DATE_TIME): STRING_8
-- Output date `dt` using YYYY-MM-DD h:min:sec
local
i: INTEGER
do
create Result.make (19)
Result.append (formatted_date_time_yyyy_mm_dd (dt))
Result.append_character (' ')
i := dt.hour
if i <= 9 then
Result.append_character ('0')
end
Result.append_integer (i)
Result.append_character (':')
i := dt.minute
if i <= 9 then
Result.append_character ('0')
end
Result.append_integer (i)
Result.append_character (':')
i := dt.second
if i <= 9 then
Result.append_character ('0')
end
Result.append_integer (i)
end
feature -- Emails
new_email (a_to_address: READABLE_STRING_8; a_subject: READABLE_STRING_8; a_content: READABLE_STRING_8): CMS_EMAIL