Merge branch 'MDL-47466-master' of https://github.com/tehanuyor/moodle
authorDan Poltawski <dan@moodle.com>
Wed, 5 Nov 2014 16:24:14 +0000 (16:24 +0000)
committerDan Poltawski <dan@moodle.com>
Wed, 5 Nov 2014 16:24:14 +0000 (16:24 +0000)
1  2 
calendar/lib.php

diff --combined calendar/lib.php
@@@ -318,9 -318,9 +318,9 @@@ function calendar_get_mini($courses, $g
      }
  
      // Now display all the calendar
 -    $daytime = $display->tstart - DAYSECS;
 +    $daytime = strtotime('-1 day', $display->tstart);
      for($day = 1; $day <= $display->maxdays; ++$day, ++$dayweek) {
 -        $daytime += DAYSECS;
 +        $daytime = strtotime('+1 day', $daytime);
          if($dayweek > $display->maxwday) {
              // We need to change week (table row)
              $content .= '</tr><tr>';
@@@ -683,19 -683,18 +683,18 @@@ function calendar_get_events($tstart, $
      global $DB;
  
      $whereclause = '';
+     $params = array();
      // Quick test
      if(is_bool($users) && is_bool($groups) && is_bool($courses)) {
          return array();
      }
  
-     if(is_array($users) && !empty($users)) {
+     if ((is_array($users) && !empty($users)) or is_numeric($users)) {
          // Events from a number of users
          if(!empty($whereclause)) $whereclause .= ' OR';
-         $whereclause .= ' (userid IN ('.implode(',', $users).') AND courseid = 0 AND groupid = 0)';
-     } else if(is_numeric($users)) {
-         // Events from one user
-         if(!empty($whereclause)) $whereclause .= ' OR';
-         $whereclause .= ' (userid = '.$users.' AND courseid = 0 AND groupid = 0)';
+         list($insqlusers, $inparamsusers) = $DB->get_in_or_equal($users, SQL_PARAMS_NAMED);
+         $whereclause .= " (userid $insqlusers AND courseid = 0 AND groupid = 0)";
+         $params = array_merge($params, $inparamsusers);
      } else if($users === true) {
          // Events from ALL users
          if(!empty($whereclause)) $whereclause .= ' OR';
          // No user at all, do nothing
      }
  
-     if(is_array($groups) && !empty($groups)) {
+     if ((is_array($groups) && !empty($groups)) or is_numeric($groups)) {
          // Events from a number of groups
          if(!empty($whereclause)) $whereclause .= ' OR';
-         $whereclause .= ' groupid IN ('.implode(',', $groups).')';
-     } else if(is_numeric($groups)) {
-         // Events from one group
-         if(!empty($whereclause)) $whereclause .= ' OR ';
-         $whereclause .= ' groupid = '.$groups;
+         list($insqlgroups, $inparamsgroups) = $DB->get_in_or_equal($groups, SQL_PARAMS_NAMED);
+         $whereclause .= " groupid $insqlgroups ";
+         $params = array_merge($params, $inparamsgroups);
      } else if($groups === true) {
          // Events from ALL groups
          if(!empty($whereclause)) $whereclause .= ' OR ';
      }
      // boolean false (no groups at all): we don't need to do anything
  
-     if(is_array($courses) && !empty($courses)) {
-         if(!empty($whereclause)) {
-             $whereclause .= ' OR';
-         }
-         $whereclause .= ' (groupid = 0 AND courseid IN ('.implode(',', $courses).'))';
-     } else if(is_numeric($courses)) {
-         // One course
+     if ((is_array($courses) && !empty($courses)) or is_numeric($courses)) {
          if(!empty($whereclause)) $whereclause .= ' OR';
-         $whereclause .= ' (groupid = 0 AND courseid = '.$courses.')';
+         list($insqlcourses, $inparamscourses) = $DB->get_in_or_equal($courses, SQL_PARAMS_NAMED);
+         $whereclause .= " (groupid = 0 AND courseid $insqlcourses)";
+         $params = array_merge($params, $inparamscourses);
      } else if ($courses === true) {
          // Events from ALL courses
          if(!empty($whereclause)) $whereclause .= ' OR';
          $whereclause .= ' AND visible = 1';
      }
  
-     $events = $DB->get_records_select('event', $whereclause, null, 'timestart');
+     $events = $DB->get_records_select('event', $whereclause, $params, 'timestart');
      if ($events === false) {
          $events = array();
      }
@@@ -932,8 -925,8 +925,8 @@@ function calendar_top_controls($type, $
          case 'day':
              $days = calendar_get_days();
  
 -            $prevtimestamp = $time - DAYSECS;
 -            $nexttimestamp = $time + DAYSECS;
 +            $prevtimestamp = strtotime('-1 day', $time);
 +            $nexttimestamp = strtotime('+1 day', $time);
  
              $prevdate = $calendartype->timestamp_to_date_array($prevtimestamp);
              $nextdate = $calendartype->timestamp_to_date_array($nexttimestamp);
@@@ -1679,7 -1672,7 +1672,7 @@@ function calendar_format_event_time($ev
              $timeend = calendar_time_representation($event->timestart + $event->timeduration);
  
              // Set printable representation.
 -            if ($now >= $usermidnightstart && $now < ($usermidnightstart + DAYSECS)) {
 +            if ($now >= $usermidnightstart && $now < strtotime('+1 day', $usermidnightstart)) {
                  $url = calendar_get_link_href(new moodle_url(CALENDAR_URL . 'view.php', $linkparams), 0, 0, 0, $endtime);
                  $eventtime = $timestart . ' <strong>&raquo;</strong> ' . html_writer::link($url, $dayend) . $timeend;
              } else {
@@@ -2775,7 -2768,7 +2768,7 @@@ class calendar_information 
       * @return int tomorrow timestamp
       */
      public function timestamp_tomorrow() {
 -        return $this->time + DAYSECS;
 +        return strtotime('+1 day', $this->time);
      }
      /**
       * Adds the pretend blocks for the calendar
@@@ -2888,11 -2881,10 +2881,11 @@@ function calendar_add_subscription($sub
   * @param stdClass $event The RFC-2445 iCalendar event
   * @param int $courseid The course ID
   * @param int $subscriptionid The iCalendar subscription ID
 + * @param string $timezone The X-WR-TIMEZONE iCalendar property if provided
   * @throws dml_exception A DML specific exception is thrown for invalid subscriptionids.
   * @return int Code: CALENDAR_IMPORT_EVENT_UPDATED = updated,  CALENDAR_IMPORT_EVENT_INSERTED = inserted, 0 = error
   */
 -function calendar_add_icalendar_event($event, $courseid, $subscriptionid) {
 +function calendar_add_icalendar_event($event, $courseid, $subscriptionid, $timezone='UTC') {
      global $DB;
  
      // Probably an unsupported X-MICROSOFT-CDO-BUSYSTATUS event.
  
      $defaulttz = date_default_timezone_get();
      $tz = isset($event->properties['DTSTART'][0]->parameters['TZID']) ? $event->properties['DTSTART'][0]->parameters['TZID'] :
 -            'UTC';
 +            $timezone;
      $eventrecord->timestart = strtotime($event->properties['DTSTART'][0]->value . ' ' . $tz);
      if (empty($event->properties['DTEND'])) {
 -        $eventrecord->timeduration = 3600; // one hour if no end time specified
 +        $eventrecord->timeduration = 0; // no duration if no end time specified
      } else {
          $endtz = isset($event->properties['DTEND'][0]->parameters['TZID']) ? $event->properties['DTEND'][0]->parameters['TZID'] :
 -                'UTC';
 +                $timezone;
          $eventrecord->timeduration = strtotime($event->properties['DTEND'][0]->value . ' ' . $endtz) - $eventrecord->timestart;
      }
 +
 +    // Check to see if it should be treated as an all day event.
 +    if ($eventrecord->timeduration == DAYSECS) {
 +        // Check to see if the event started at Midnight on the imported calendar.
 +        date_default_timezone_set($timezone);
 +        if (date('H:i:s', $eventrecord->timestart) === "00:00:00") {
 +            // This event should be an all day event.
 +            $eventrecord->timeduration = 0;
 +        }
 +        date_default_timezone_set($defaulttz);
 +    }
 +
      $eventrecord->uuid = $event->properties['UID'][0]->value;
      $eventrecord->timemodified = time();
  
@@@ -3079,14 -3059,8 +3072,14 @@@ function calendar_import_icalendar_even
          $sql = "UPDATE {event} SET timemodified = :time WHERE subscriptionid = :id";
          $DB->execute($sql, array('time' => 0, 'id' => $subscriptionid));
      }
 +    // Grab the timezone from the iCalendar file to be used later.
 +    if (isset($ical->properties['X-WR-TIMEZONE'][0]->value)) {
 +        $timezone = $ical->properties['X-WR-TIMEZONE'][0]->value;
 +    } else {
 +        $timezone = 'UTC';
 +    }
      foreach ($ical->components['VEVENT'] as $event) {
 -        $res = calendar_add_icalendar_event($event, $courseid, $subscriptionid);
 +        $res = calendar_add_icalendar_event($event, $courseid, $subscriptionid, $timezone);
          switch ($res) {
            case CALENDAR_IMPORT_EVENT_UPDATED:
              $updatecount++;