@@ -236,7 +236,18 @@ angular.module('mm.core')
236236 "moodle_webservice_get_siteinfo" : "core_webservice_get_site_info" ,
237237 } ;
238238
239- var self = { } ;
239+ var self = { } ,
240+ moodleReleases = {
241+ '2.4' : 2012120300 ,
242+ '2.5' : 2013051400 ,
243+ '2.6' : 2013111800 ,
244+ '2.7' : 2014051200 ,
245+ '2.8' : 2014111000 ,
246+ '2.9' : 2015051100 ,
247+ '3.0' : 2015111600 ,
248+ '3.1' : 2016052300 ,
249+ '3.2' : 2016120500
250+ } ;
240251
241252 /**
242253 * Site object to store site data.
@@ -752,7 +763,7 @@ angular.module('mm.core')
752763 */
753764 Site . prototype . uploadFile = function ( uri , options ) {
754765 if ( ! options . fileArea ) {
755- if ( parseInt ( this . infos . version , 10 ) >= 2016052300 ) {
766+ if ( this . isVersionGreaterEqualThan ( '3.1' ) ) {
756767 // From Moodle 3.1 only draft is allowed.
757768 options . fileArea = 'draft' ;
758769 } else {
@@ -1290,6 +1301,123 @@ angular.module('mm.core')
12901301 return method ;
12911302 } ;
12921303
1304+ /**
1305+ * Check if the site version is greater than one or some versions.
1306+ * This function accepts a string or an array of strings. If array, the last version must be the highest.
1307+ *
1308+ * @param {Mixed } versions Version or list of versions to check.
1309+ * @return {Boolean } True if greater or equal, false otherwise.
1310+ * @description
1311+ * If a string is supplied (e.g. '3.2.1'), it will check if the site version is greater or equal than this version.
1312+ *
1313+ * If an array of versions is supplied, it will check if the site version is greater or equal than the last version,
1314+ * or if it's higher or equal than any of the other releases supplied but lower than the next major release. The last
1315+ * version of the array must be the highest version.
1316+ * For example, if the values supplied are ['3.0.5', '3.2.3', '3.3.1'] the function will return true if the site version
1317+ * is either:
1318+ * - Greater or equal than 3.3.1.
1319+ * - Greater or equal than 3.2.3 but lower than 3.3.
1320+ * - Greater or equal than 3.0.5 but lower than 3.1.
1321+ *
1322+ * This function only accepts versions from 2.4.0 and above. If any of the versions supplied isn't found, it will assume
1323+ * it's the last released major version.
1324+ */
1325+ Site . prototype . isVersionGreaterEqualThan = function ( versions ) {
1326+ var siteVersion = parseInt ( this . getInfo ( ) . version , 10 ) ;
1327+
1328+ if ( angular . isArray ( versions ) ) {
1329+ if ( ! versions . length ) {
1330+ return false ;
1331+ }
1332+
1333+ for ( var i = 0 ; i < versions . length ; i ++ ) {
1334+ var versionNumber = getVersionNumber ( versions [ i ] ) ;
1335+ if ( i == versions . length - 1 ) {
1336+ // It's the last version, check only if site version is greater than this one.
1337+ return siteVersion >= versionNumber ;
1338+ } else {
1339+ // Check if site version if bigger than this number but lesser than next major.
1340+ if ( siteVersion >= versionNumber && siteVersion < getNextMajorVersionNumber ( versions [ i ] ) ) {
1341+ return true ;
1342+ }
1343+ }
1344+ }
1345+ } else if ( typeof versions == 'string' ) {
1346+ // Compare with this version.
1347+ return siteVersion >= getVersionNumber ( versions ) ;
1348+ }
1349+
1350+ return false ;
1351+ } ;
1352+
1353+ /**
1354+ * Get a version number from a release version.
1355+ * If release version is valid but not found in the list of Moodle releases, it will use the last released major version.
1356+ *
1357+ * @param {String } version Release version to convert to version number.
1358+ * @return {Number } Version number, 0 if invalid.
1359+ */
1360+ function getVersionNumber ( version ) {
1361+ var data = getMajorAndMinor ( version ) ;
1362+
1363+ if ( ! data ) {
1364+ // Invalid version.
1365+ return 0 ;
1366+ }
1367+
1368+ if ( typeof moodleReleases [ data . major ] == 'undefined' ) {
1369+ // Major version not found. Use the last one.
1370+ data . major = Object . keys ( moodleReleases ) . slice ( - 1 ) ;
1371+ }
1372+
1373+ return moodleReleases [ data . major ] + data . minor ;
1374+ }
1375+
1376+ /**
1377+ * Given a release version, return the major and minor versions.
1378+ *
1379+ * @param {String } version Release version (e.g. '3.1.0').
1380+ * @return {Object } Object with major and minor. Returns false if invalid version.
1381+ */
1382+ function getMajorAndMinor ( version ) {
1383+ var match = version . match ( / ( \d ) + (?: \. ( \d ) + ) ? (?: \. ( \d ) + ) ? / ) ;
1384+ if ( ! match || ! match [ 1 ] ) {
1385+ // Invalid version.
1386+ return false ;
1387+ }
1388+
1389+ return {
1390+ major : match [ 1 ] + '.' + ( match [ 2 ] || '0' ) ,
1391+ minor : parseInt ( match [ 3 ] || 0 , 10 )
1392+ } ;
1393+ }
1394+
1395+ /**
1396+ * Given a release version, return the next major version number.
1397+ *
1398+ * @param {String } version Release version (e.g. '3.1.0').
1399+ * @return {Number } Next major version number.
1400+ */
1401+ function getNextMajorVersionNumber ( version ) {
1402+ var data = getMajorAndMinor ( version ) ,
1403+ position ,
1404+ releases = Object . keys ( moodleReleases ) ;
1405+
1406+ if ( ! data ) {
1407+ // Invalid version.
1408+ return 0 ;
1409+ }
1410+
1411+ position = releases . indexOf ( data . major ) ;
1412+
1413+ if ( position == - 1 || position == releases . length - 1 ) {
1414+ // Major version not found or it's the last one. Use the last one.
1415+ return moodleReleases [ releases [ position ] ] ;
1416+ }
1417+
1418+ return moodleReleases [ releases [ position + 1 ] ] ;
1419+ }
1420+
12931421 /**
12941422 * Get cache ID.
12951423 *
0 commit comments