Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
moodle
moodle
Commits
6c9b2bb5
Commit
6c9b2bb5
authored
Jul 10, 2015
by
Juan Leyva
Browse files
MDL-50013 mod_book: New WS mod_book_view_book
parent
1af52267
Changes
6
Hide whitespace changes
Inline
Side-by-side
lib/db/services.php
View file @
6c9b2bb5
...
...
@@ -1160,6 +1160,7 @@ $services = array(
'mod_page_view_page'
,
'mod_resource_view_resource'
,
'mod_folder_view_folder'
,
'mod_book_view_book'
,
),
'enabled'
=>
0
,
'restrictedusers'
=>
0
,
...
...
mod/book/classes/external.php
0 → 100644
View file @
6c9b2bb5
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Book external API
*
* @package mod_book
* @category external
* @copyright 2015 Juan Leyva <juan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 3.0
*/
defined
(
'MOODLE_INTERNAL'
)
||
die
;
require_once
(
"
$CFG->libdir
/externallib.php"
);
/**
* Book external functions
*
* @package mod_book
* @category external
* @copyright 2015 Juan Leyva <juan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 3.0
*/
class
mod_book_external
extends
external_api
{
/**
* Returns description of method parameters
*
* @return external_function_parameters
* @since Moodle 3.0
*/
public
static
function
view_book_parameters
()
{
return
new
external_function_parameters
(
array
(
'bookid'
=>
new
external_value
(
PARAM_INT
,
'book instance id'
),
'chapterid'
=>
new
external_value
(
PARAM_INT
,
'chapter id'
,
VALUE_DEFAULT
,
0
)
)
);
}
/**
* Simulate the book/view.php web interface page: trigger events, completion, etc...
*
* @param int $bookid the book instance id
* @param int $chapterid the book chapter id
* @return array of warnings and status result
* @since Moodle 3.0
* @throws moodle_exception
*/
public
static
function
view_book
(
$bookid
,
$chapterid
=
0
)
{
global
$DB
,
$CFG
;
require_once
(
$CFG
->
dirroot
.
"/mod/book/lib.php"
);
require_once
(
$CFG
->
dirroot
.
"/mod/book/locallib.php"
);
$params
=
self
::
validate_parameters
(
self
::
view_book_parameters
(),
array
(
'bookid'
=>
$bookid
,
'chapterid'
=>
$chapterid
));
$bookid
=
$params
[
'bookid'
];
$chapterid
=
$params
[
'chapterid'
];
$warnings
=
array
();
// Request and permission validation.
$book
=
$DB
->
get_record
(
'book'
,
array
(
'id'
=>
$bookid
),
'*'
,
MUST_EXIST
);
list
(
$course
,
$cm
)
=
get_course_and_cm_from_instance
(
$book
,
'book'
);
$context
=
context_module
::
instance
(
$cm
->
id
);
self
::
validate_context
(
$context
);
require_capability
(
'mod/book:read'
,
$context
);
$chapters
=
book_preload_chapters
(
$book
);
$firstchapterid
=
0
;
$lastchapterid
=
0
;
foreach
(
$chapters
as
$ch
)
{
if
(
$ch
->
hidden
)
{
continue
;
}
if
(
!
$firstchapterid
)
{
$firstchapterid
=
$ch
->
id
;
}
$lastchapterid
=
$ch
->
id
;
}
if
(
!
$chapterid
)
{
// Trigger the module viewed events since we are displaying the book.
book_view
(
$book
,
null
,
false
,
$course
,
$cm
,
$context
);
$chapterid
=
$firstchapterid
;
}
// Check if book is empty (warning).
if
(
!
$chapterid
)
{
$warnings
[]
=
array
(
'item'
=>
'book'
,
'itemid'
=>
$book
->
id
,
'warningcode'
=>
'1'
,
'message'
=>
get_string
(
'nocontent'
,
'mod_book'
)
);
}
else
{
$chapter
=
$DB
->
get_record
(
'book_chapters'
,
array
(
'id'
=>
$chapterid
,
'bookid'
=>
$book
->
id
));
$viewhidden
=
has_capability
(
'mod/book:viewhiddenchapters'
,
$context
);
if
(
!
$chapter
or
(
$chapter
->
hidden
and
!
$viewhidden
))
{
throw
new
moodle_exception
(
'errorchapter'
,
'mod_book'
);
}
// Trigger the chapter viewed event.
$islastchapter
=
(
$chapter
->
id
==
$lastchapterid
)
?
true
:
false
;
book_view
(
$book
,
$chapter
,
$islastchapter
,
$course
,
$cm
,
$context
);
}
$result
=
array
();
$result
[
'status'
]
=
true
;
$result
[
'warnings'
]
=
$warnings
;
return
$result
;
}
/**
* Returns description of method result value
*
* @return external_description
* @since Moodle 3.0
*/
public
static
function
view_book_returns
()
{
return
new
external_single_structure
(
array
(
'status'
=>
new
external_value
(
PARAM_BOOL
,
'status: true if success'
),
'warnings'
=>
new
external_warnings
()
)
);
}
}
mod/book/db/services.php
0 → 100644
View file @
6c9b2bb5
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* Book external functions and service definitions.
*
* @package mod_book
* @category external
* @copyright 2015 Juan Leyva <juan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 3.0
*/
defined
(
'MOODLE_INTERNAL'
)
||
die
;
$functions
=
array
(
'mod_book_view_book'
=>
array
(
'classname'
=>
'mod_book_external'
,
'methodname'
=>
'view_book'
,
'description'
=>
'Simulate the view.php web interface book: trigger events, completion, etc...'
,
'type'
=>
'write'
,
'capabilities'
=>
'mod/book:read'
),
);
mod/book/tests/externallib_test.php
0 → 100644
View file @
6c9b2bb5
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
/**
* External mod_book functions unit tests
*
* @package mod_book
* @category external
* @copyright 2015 Juan Leyva <juan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 3.0
*/
defined
(
'MOODLE_INTERNAL'
)
||
die
();
global
$CFG
;
require_once
(
$CFG
->
dirroot
.
'/webservice/tests/helpers.php'
);
/**
* External mod_book functions unit tests
*
* @package mod_book
* @category external
* @copyright 2015 Juan Leyva <juan@moodle.com>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
* @since Moodle 3.0
*/
class
mod_book_external_testcase
extends
externallib_advanced_testcase
{
/**
* Test view_book
*/
public
function
test_view_book
()
{
global
$DB
;
$this
->
resetAfterTest
(
true
);
$this
->
setAdminUser
();
// Setup test data.
$course
=
$this
->
getDataGenerator
()
->
create_course
();
$book
=
$this
->
getDataGenerator
()
->
create_module
(
'book'
,
array
(
'course'
=>
$course
->
id
));
$bookgenerator
=
$this
->
getDataGenerator
()
->
get_plugin_generator
(
'mod_book'
);
$chapter
=
$bookgenerator
->
create_chapter
(
array
(
'bookid'
=>
$book
->
id
));
$chapterhidden
=
$bookgenerator
->
create_chapter
(
array
(
'bookid'
=>
$book
->
id
,
'hidden'
=>
1
));
$context
=
context_module
::
instance
(
$book
->
cmid
);
$cm
=
get_coursemodule_from_instance
(
'book'
,
$book
->
id
);
// Test invalid instance id.
try
{
mod_book_external
::
view_book
(
0
);
$this
->
fail
(
'Exception expected due to invalid mod_book instance id.'
);
}
catch
(
moodle_exception
$e
)
{
$this
->
assertEquals
(
'invalidrecord'
,
$e
->
errorcode
);
}
// Test not-enrolled user.
$user
=
self
::
getDataGenerator
()
->
create_user
();
$this
->
setUser
(
$user
);
try
{
mod_book_external
::
view_book
(
$book
->
id
,
0
);
$this
->
fail
(
'Exception expected due to not enrolled user.'
);
}
catch
(
moodle_exception
$e
)
{
$this
->
assertEquals
(
'requireloginerror'
,
$e
->
errorcode
);
}
// Test user with full capabilities.
$studentrole
=
$DB
->
get_record
(
'role'
,
array
(
'shortname'
=>
'student'
));
$this
->
getDataGenerator
()
->
enrol_user
(
$user
->
id
,
$course
->
id
,
$studentrole
->
id
);
// Trigger and capture the event.
$sink
=
$this
->
redirectEvents
();
$result
=
mod_book_external
::
view_book
(
$book
->
id
,
0
);
$result
=
external_api
::
clean_returnvalue
(
mod_book_external
::
view_book_returns
(),
$result
);
$events
=
$sink
->
get_events
();
$this
->
assertCount
(
2
,
$events
);
$event
=
array_shift
(
$events
);
// Checking that the event contains the expected values.
$this
->
assertInstanceOf
(
'\mod_book\event\course_module_viewed'
,
$event
);
$this
->
assertEquals
(
$context
,
$event
->
get_context
());
$moodleurl
=
new
\
moodle_url
(
'/mod/book/view.php'
,
array
(
'id'
=>
$cm
->
id
));
$this
->
assertEquals
(
$moodleurl
,
$event
->
get_url
());
$this
->
assertEventContextNotUsed
(
$event
);
$this
->
assertNotEmpty
(
$event
->
get_name
());
$event
=
array_shift
(
$events
);
$this
->
assertInstanceOf
(
'\mod_book\event\chapter_viewed'
,
$event
);
$this
->
assertEquals
(
$chapter
->
id
,
$event
->
objectid
);
$result
=
mod_book_external
::
view_book
(
$book
->
id
,
$chapter
->
id
);
$result
=
external_api
::
clean_returnvalue
(
mod_book_external
::
view_book_returns
(),
$result
);
$events
=
$sink
->
get_events
();
// We expect a total of 3 events.
$this
->
assertCount
(
3
,
$events
);
// Try to view a hidden chapter.
try
{
mod_book_external
::
view_book
(
$book
->
id
,
$chapterhidden
->
id
);
$this
->
fail
(
'Exception expected due to missing capability.'
);
}
catch
(
moodle_exception
$e
)
{
$this
->
assertEquals
(
'errorchapter'
,
$e
->
errorcode
);
}
// Test user with no capabilities.
// We need a explicit prohibit since this capability is only defined in authenticated user and guest roles.
assign_capability
(
'mod/book:read'
,
CAP_PROHIBIT
,
$studentrole
->
id
,
$context
->
id
);
accesslib_clear_all_caches_for_unit_testing
();
try
{
mod_book_external
::
view_book
(
$book
->
id
,
0
);
$this
->
fail
(
'Exception expected due to missing capability.'
);
}
catch
(
moodle_exception
$e
)
{
$this
->
assertEquals
(
'nopermissions'
,
$e
->
errorcode
);
}
}
}
mod/book/version.php
View file @
6c9b2bb5
...
...
@@ -25,6 +25,6 @@
defined
(
'MOODLE_INTERNAL'
)
||
die
;
$plugin
->
component
=
'mod_book'
;
// Full name of the plugin (used for diagnostics)
$plugin
->
version
=
201505110
0
;
// The current module version (Date: YYYYMMDDXX)
$plugin
->
version
=
201505110
1
;
// The current module version (Date: YYYYMMDDXX)
$plugin
->
requires
=
2015050500
;
// Requires this Moodle version
$plugin
->
cron
=
0
;
// Period for cron to check this module (secs)
version.php
View file @
6c9b2bb5
...
...
@@ -29,7 +29,7 @@
defined
(
'MOODLE_INTERNAL'
)
||
die
();
$version
=
2015090300.0
0
;
// YYYYMMDD = weekly release date of this DEV branch.
$version
=
2015090300.0
1
;
// YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment