initial check-in of "Assignment Dropbox" module.
authorcindy li <cli@ocad.ca>
Wed, 21 Jul 2010 19:52:49 +0000 (19:52 -0000)
committercindy li <cli@ocad.ca>
Wed, 21 Jul 2010 19:52:49 +0000 (19:52 -0000)
13 files changed:
mods/assignment_dropbox/README [new file with mode: 0644]
mods/assignment_dropbox/assignment_dropbox.inc.php [new file with mode: 0644]
mods/assignment_dropbox/assignment_dropbox.png [new file with mode: 0644]
mods/assignment_dropbox/assignment_dropbox_sm.png [new file with mode: 0644]
mods/assignment_dropbox/flag.png [new file with mode: 0644]
mods/assignment_dropbox/index.php [new file with mode: 0644]
mods/assignment_dropbox/module.css [new file with mode: 0644]
mods/assignment_dropbox/module.php [new file with mode: 0644]
mods/assignment_dropbox/module.sql [new file with mode: 0644]
mods/assignment_dropbox/module.xml [new file with mode: 0644]
mods/assignment_dropbox/module_install.php [new file with mode: 0644]
mods/assignment_dropbox/module_uninstall.php [new file with mode: 0644]
mods/assignment_dropbox/sublinks.php [new file with mode: 0644]

diff --git a/mods/assignment_dropbox/README b/mods/assignment_dropbox/README
new file mode 100644 (file)
index 0000000..52d84c2
--- /dev/null
@@ -0,0 +1,25 @@
+Assignment Dropbox ReadMe
+
+This module can be installed with ATutor for:
+1) instructors to manage students' assignment submissions.
+2) students to submit assignments.
+
+* How to install
+1. Copy the downloaded file into the ATutor mods/ directory and unzip it there. 
+
+On Windows systems use and application like WinZip the extract the file into the mods/ directory
+
+On Unix/Linux systems use the command:
+
+tar xzvf gradebook-0.1.tar.gz
+
+2. Login to ATutor as the administrator and run Install Module under the Modules tab, Select the Assignment Dropbox module, which should be listed as available to be installed when the module has been unzipped into the modes directory
+
+3. Once the module has been installed, and enabled, login as instructor, click on tab "Manage", "Assignment Dropbox" line is there. Instructors can grant access on Assignment Dropbox to students through "Course Tools". 
+
+* How to use Assignment Dropbox
+1. for instructors
+       Assignment Dropbox provides the same functionality as assignment submission in "File Storage" tool but with a more intuitive interface. As an extension of "File Storage", when instructors create an assignment for a group, this group must have "File Storage" tool enabled, otherwise, the students are not able to submit assignments via Assignment Dropbox.
+
+2. for students
+  Once the access to Assignment Dropbox is granted by the instructor, A link "Assignment Dropbox" is displayed either on students' home page or main navigation tab. This tool lists all the titles of the assignments that are assigned to the student and before the submission cut off date. The student can upload or delete assignment files at here. Note that the "Delete" button is only available before the assignment's due date. It is greyed out when the due date/time is passed. In this case, the student can only upload the assignment file.
\ No newline at end of file
diff --git a/mods/assignment_dropbox/assignment_dropbox.inc.php b/mods/assignment_dropbox/assignment_dropbox.inc.php
new file mode 100644 (file)
index 0000000..748725f
--- /dev/null
@@ -0,0 +1,81 @@
+<?php\r
+/************************************************************************/\r
+/* ATutor                                                               */\r
+/************************************************************************/\r
+/* Copyright (c) 2002-2010                                              */\r
+/* Inclusive Design Institute                                           */\r
+/* http://atutor.ca                                                     */\r
+/* This program is free software. You can redistribute it and/or        */\r
+/* modify it under the terms of the GNU General Public License          */\r
+/* as published by the Free Software Foundation.                        */\r
+/************************************************************************/\r
+\r
+/**\r
+ * The Assignment Dropbox is designed for instructors to manage assignment \r
+ * submissions and for students to submit assignments.\r
+ *\r
+ * This file contains the functions used by Assignment Dropbox.\r
+ **/\r
+\r
+if (!defined('AT_INCLUDE_PATH')) { exit; }\r
+\r
+/**\r
+ * given an owner_type and owner_id\r
+ * returns false if user cannot read or write to this workspace\r
+ * returns WORKSPACE_AUTH_READ if the user can read\r
+ * returns WORKSPACE_AUTH_WRITE if the user can write\r
+ */\r
+function ad_authenticate($owner_id) {\r
+       if (authenticate(AT_PRIV_ASSIGNMENTS, AT_PRIV_RETURN))\r
+       { \r
+               // instructors have read only access to assignments\r
+               return true;\r
+       }\r
+       else\r
+       { \r
+               // students have read access to their own assignments\r
+               global $db;\r
+               $sql = "SELECT COUNT(*) cnt FROM ".TABLE_PREFIX."files\r
+                        WHERE owner_id =".$owner_id."\r
+                   AND owner_type= ".WORKSPACE_ASSIGNMENT."\r
+                   AND member_id = ".$_SESSION['member_id'];\r
+               $result = mysql_query($sql, $db);\r
+               $row = mysql_fetch_assoc($result);\r
+               \r
+               if ($row['cnt'] > 0) RETURN true;\r
+               \r
+               // enrolled students can submit the assignments that assign to him/her\r
+               if ($_SESSION['member_id'] && $_SESSION['enroll']) {\r
+                       // assignments that are assigned to all students\r
+                       $sql = "SELECT count(*) cnt FROM ".TABLE_PREFIX."assignments \r
+                     WHERE assignment_id = ".$owner_id."\r
+                       AND assign_to=0 \r
+                       AND course_id=".$_SESSION[course_id];\r
+                       $result = mysql_query($sql, $db);\r
+                       $row = mysql_fetch_assoc($result);\r
+                       \r
+                       if ($row['cnt'] > 0) RETURN true;\r
+\r
+                       // assignments that are assigned to a group, \r
+                       // and this group has "file storage" tool available\r
+                       // and the student is in this group\r
+                       $groups_list = implode(',',$_SESSION['groups']);  // the groups that the student belongs to\r
+                       $sql = "SELECT count(*) cnt\r
+                             FROM ".TABLE_PREFIX."groups_types gt, ".TABLE_PREFIX."groups g, ".TABLE_PREFIX."assignments a\r
+                            WHERE g.group_id in (".$groups_list.")\r
+                              AND g.group_id in (SELECT group_id FROM ".TABLE_PREFIX."file_storage_groups)\r
+                              AND g.type_id = gt.type_id\r
+                              AND gt.course_id = $_SESSION[course_id]\r
+                              AND gt.type_id = a.assign_to\r
+                              AND a.assignment_id = ".$owner_id;\r
+                       $result = mysql_query($sql, $db);\r
+                       $row = mysql_fetch_assoc($result);\r
+                       \r
+                       if ($row['cnt'] > 0) RETURN true;\r
+               }\r
+       }\r
+\r
+       return false;\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/mods/assignment_dropbox/assignment_dropbox.png b/mods/assignment_dropbox/assignment_dropbox.png
new file mode 100644 (file)
index 0000000..62eb938
Binary files /dev/null and b/mods/assignment_dropbox/assignment_dropbox.png differ
diff --git a/mods/assignment_dropbox/assignment_dropbox_sm.png b/mods/assignment_dropbox/assignment_dropbox_sm.png
new file mode 100644 (file)
index 0000000..47585a4
Binary files /dev/null and b/mods/assignment_dropbox/assignment_dropbox_sm.png differ
diff --git a/mods/assignment_dropbox/flag.png b/mods/assignment_dropbox/flag.png
new file mode 100644 (file)
index 0000000..a64f456
Binary files /dev/null and b/mods/assignment_dropbox/flag.png differ
diff --git a/mods/assignment_dropbox/index.php b/mods/assignment_dropbox/index.php
new file mode 100644 (file)
index 0000000..75420c8
--- /dev/null
@@ -0,0 +1,395 @@
+<?php\r
+/************************************************************************/\r
+/* ATutor                                                                                                                              */\r
+/************************************************************************/\r
+/* Copyright (c) 2002-2010                                              */\r
+/* Inclusive Design Institute                                           */\r
+/* http://atutor.ca                                                     */\r
+/* This program is free software. You can redistribute it and/or        */\r
+/* modify it under the terms of the GNU General Public License          */\r
+/* as published by the Free Software Foundation.                        */\r
+/************************************************************************/\r
+\r
+define('AT_INCLUDE_PATH', '../../include/');\r
+require (AT_INCLUDE_PATH.'vitals.inc.php');\r
+require_once(AT_INCLUDE_PATH.'../mods/_core/file_manager/filemanager.inc.php'); // for get_human_size()\r
+require_once(AT_INCLUDE_PATH.'../mods/_standard/file_storage/file_storage.inc.php'); // for get_human_size()\r
+require('assignment_dropbox.inc.php');\r
+\r
+$owner_type = WORKSPACE_ASSIGNMENT;\r
+\r
+if (isset($_REQUEST['owner_id']) && !($has_priv = ad_authenticate($_REQUEST['owner_id']))) {\r
+       $msg->addError('ACCESS_DENIED');\r
+       header('Location: index.php');\r
+       exit;\r
+}\r
+\r
+// action - Upload\r
+if (isset($_POST['upload']) && isset($_POST['owner_id'])) {\r
+       // handle the file upload\r
+       $_POST['comments'] = trim($_POST['comments']);\r
+\r
+       $parent_folder_id = abs($_POST['folder']);\r
+       \r
+       if ($_FILES['file']['error'] == UPLOAD_ERR_INI_SIZE) {\r
+               $msg->addError(array('FILE_TOO_BIG', get_human_size(megabytes_to_bytes(substr(ini_get('upload_max_filesize'), 0, -1)))));\r
+\r
+       } else if (!isset($_FILES['file']['name']) || ($_FILES['file']['error'] == UPLOAD_ERR_NO_FILE) || ($_FILES['file']['size'] == 0)) {\r
+               $msg->addError('FILE_NOT_SELECTED');\r
+\r
+       } else if ($_FILES['file']['error'] || !is_uploaded_file($_FILES['file']['tmp_name'])) {\r
+               $msg->addError('FILE_NOT_SAVED');\r
+       }\r
+\r
+       // check that we own this folder\r
+//     if ($parent_folder_id) {\r
+//             $sql = "SELECT folder_id FROM ".TABLE_PREFIX."folders WHERE folder_id=$parent_folder_id AND owner_type=$owner_type AND owner_id=$owner_id";\r
+//             $result = mysql_query($sql, $db);\r
+//             if (!$row = mysql_fetch_assoc($result)) {\r
+//                     $msg->addError('ACCESS_DENIED');\r
+//                     header('Location: '.AT_BASE_HREF.'mods/_standard/file_storage/index.php');\r
+//                     exit;\r
+//             }\r
+//     }\r
+\r
+       if (!$msg->containsErrors()) {\r
+               $_POST['description'] = $addslashes(trim($_POST['description']));\r
+               $_FILES['file']['name'] = addslashes($_FILES['file']['name']);\r
+\r
+               if ($_POST['comments']) {\r
+                       $num_comments = 1;\r
+               } else {\r
+                       $num_comments = 0;\r
+               }\r
+\r
+               $sql = "INSERT INTO ".TABLE_PREFIX."files\r
+                              (owner_type, owner_id, member_id, folder_id, \r
+                               parent_file_id, date, num_comments, num_revisions, file_name,\r
+                               file_size, description) \r
+                       VALUES ($owner_type, $_POST[owner_id], $_SESSION[member_id], $_POST[folder_id], \r
+                               0, NOW(), $num_comments, 0, '{$_FILES['file']['name']}', \r
+                               {$_FILES['file']['size']}, '$_POST[description]')";\r
+               $result = mysql_query($sql, $db);\r
+\r
+               if ($result && ($file_id = mysql_insert_id($db))) {\r
+                       $path = fs_get_file_path($file_id);\r
+                       move_uploaded_file($_FILES['file']['tmp_name'], $path . $file_id);\r
+\r
+                       // check if this file name already exists\r
+//                     $sql = "SELECT file_id, num_revisions FROM ".TABLE_PREFIX."files WHERE owner_type=$owner_type AND owner_id=$owner_id AND folder_id=$parent_folder_id AND file_id<>$file_id AND file_name='{$_FILES['file']['name']}' AND parent_file_id=0 ORDER BY file_id DESC LIMIT 1";\r
+//                     $result = mysql_query($sql, $db);\r
+//                     if ($row = mysql_fetch_assoc($result)) {\r
+//                             if ($_config['fs_versioning']) {\r
+//                                     $sql = "UPDATE ".TABLE_PREFIX."files SET parent_file_id=$file_id, date=date WHERE file_id=$row[file_id]";\r
+//                                     $result = mysql_query($sql, $db);\r
+//\r
+//                                     $sql = "UPDATE ".TABLE_PREFIX."files SET num_revisions=$row[num_revisions]+1, date=date WHERE file_id=$file_id";\r
+//                                     $result = mysql_query($sql, $db);\r
+//                             } else {\r
+//                                     fs_delete_file($row['file_id'], $owner_type, $owner_id);\r
+//                             }\r
+//                     }\r
+\r
+                       $msg->addFeedback('ASSIGNMENT_HANDED_IN');\r
+                       header('Location: index.php');\r
+                       exit;\r
+               } else {\r
+                       $msg->addError('FILE_NOT_SAVED');\r
+               }\r
+       }\r
+       header('Location: index.php');\r
+       exit;\r
+}\r
+\r
+// action - Delete Files/Folders (pre-confirmation)\r
+$files = array();\r
+foreach ($_POST as $name => $val) {\r
+       if (substr($name, 0, 5) == 'files') $files = $val;\r
+}\r
+if ($has_priv && isset($_POST['delete']) && is_array($files)) {\r
+       $hidden_vars = array();\r
+       $hidden_vars['owner_id'] = $_REQUEST['owner_id'];\r
+       $file_list_to_print = '';\r
+       $files = implode(',', $files);\r
+       $hidden_vars['files'] = $files;\r
+       $sql = "SELECT file_name FROM ".TABLE_PREFIX."files WHERE file_id IN ($files) AND owner_type=$owner_type AND owner_id=$_REQUEST[owner_id] ORDER BY file_name";\r
+       $result = mysql_query($sql, $db);\r
+       while ($row = mysql_fetch_assoc($result)) {\r
+               $file_list_to_print .= '<li style="list-style: none; margin: 0px; padding: 0px 10px;"><img src="images/file_types/'.fs_get_file_type_icon($row['file_name']).'.gif" height="16" width="16" alt="" title="" /> '.htmlspecialchars($row['file_name']).'</li>';\r
+       }\r
+       $msg->addConfirm(array('FILE_DELETE', $file_list_to_print), $hidden_vars);\r
+               \r
+       require(AT_INCLUDE_PATH.'header.inc.php');\r
+       $msg->printConfirm();\r
+       require(AT_INCLUDE_PATH.'footer.inc.php');\r
+       exit;\r
+\r
+}\r
+// action - Confirm Delete Files/Folders\r
+else if ($has_priv && isset($_POST['submit_yes'])) {\r
+\r
+       // handle the delete\r
+       if (isset($_POST['files'])) {\r
+               $files = explode(',', $_POST['files']);\r
+       }\r
+       if (isset($files)) {\r
+               foreach ($files as $file) {\r
+                       fs_delete_file($file, $owner_type, $_REQUEST['owner_id']);\r
+               }\r
+               $msg->addFeedback('ACTION_COMPLETED_SUCCESSFULLY');\r
+       }\r
+\r
+       header('Location: index.php');\r
+       exit;\r
+}\r
+// action - Cancel Delete\r
+else if ($has_priv && isset($_POST['submit_no'])) {\r
+       $msg->addFeedback('CANCELLED');\r
+       header('Location: index.php');\r
+       exit;\r
+}\r
+\r
+// display\r
+$groups_list = implode(',',$_SESSION['groups']);\r
+\r
+$sql = '';\r
+if (authenticate(AT_PRIV_ASSIGNMENTS, AT_PRIV_RETURN)) { // instructor\r
+       $sql = "SELECT * FROM ".TABLE_PREFIX."assignments WHERE course_id=$_SESSION[course_id] ORDER BY title";\r
+} else { // students\r
+       if ($groups_list <> '') {\r
+               $sql = "(SELECT assignment_id, a.title, date_due, g.group_id\r
+                  FROM ".TABLE_PREFIX."groups_types gt, ".TABLE_PREFIX."groups g, ".TABLE_PREFIX."assignments a\r
+                 WHERE g.group_id in (".$groups_list.")\r
+                   AND g.group_id in (SELECT group_id FROM ".TABLE_PREFIX."file_storage_groups)\r
+                   AND g.type_id = gt.type_id\r
+                   AND gt.course_id = $_SESSION[course_id]\r
+                   AND gt.type_id = a.assign_to\r
+                   AND (a.date_cutoff=0 OR UNIX_TIMESTAMP(a.date_cutoff) > ".time()."))\r
+               UNION\r
+               ";\r
+       }\r
+       $sql .= "(SELECT assignment_id, title, date_due, 0\r
+                  FROM ".TABLE_PREFIX."assignments \r
+                 WHERE assign_to=0 \r
+                   AND course_id=$_SESSION[course_id] \r
+                   AND (date_cutoff=0 OR UNIX_TIMESTAMP(date_cutoff) > ".time()."))\r
+               ORDER BY title";\r
+}\r
+$assignment_list_result = mysql_query($sql, $db);\r
+\r
+$_custom_css = $_base_path . 'mods/assignment_dropbox/module.css'; // use a custom stylesheet\r
+\r
+require (AT_INCLUDE_PATH.'header.inc.php');\r
+\r
+?>\r
+<div class="input-form">\r
+<?php\r
+if (mysql_num_rows($assignment_list_result) == 0) {\r
+       echo _AT('none_found');\r
+}\r
+else {\r
+       echo _AT('flag_text', '<img src="'.AT_BASE_HREF.'mods/assignment_dropbox/flag.png" border="0" />');\r
+       while ($assignment_row = mysql_fetch_assoc($assignment_list_result)) {\r
+               $owner_id = $assignment_row['assignment_id'];\r
+               \r
+               if ($assignment_row['group_id'] == 0) {\r
+                       $folder_id = $_SESSION['member_id'];\r
+               } else {\r
+                       $folder_id = $assignment_row['group_id'];\r
+               }\r
+               \r
+               // default sql for instructor: find all submitted assignments\r
+               $sql = "SELECT * FROM ".TABLE_PREFIX."files \r
+                        WHERE owner_type=$owner_type \r
+                          AND owner_id=$owner_id \r
+                          AND parent_file_id=0";\r
+               // students: find his own submitted assignments\r
+               if (!authenticate(AT_PRIV_ASSIGNMENTS, AT_PRIV_RETURN)) {\r
+                       $sql .= " AND folder_id=$folder_id \r
+                          ORDER BY date DESC, file_name, file_size";\r
+               }\r
+               $result = mysql_query($sql, $db);\r
+?>\r
+  <div id="assignment_desc">\r
+    <h4>\r
+      <?php if (authenticate(AT_PRIV_ASSIGNMENTS, AT_PRIV_RETURN)) { // instructor ?>\r
+      <a href="javascript:window.location='<?php echo AT_BASE_HREF; ?>mods/_standard/file_storage/index.php?ot=<?php echo $owner_type.SEP; ?>oid=<?php echo $assignment_row['assignment_id'].SEP;?>folder=0';" class="floatleft">\r
+      <?php } else { // students ?>\r
+      <a href="javascript:ATutor.mods.assignment_dropbox.toggleDiv(<?php echo $assignment_row['assignment_id']; ?>)" class="floatleft">\r
+      <?php } ?>\r
+      <img id="toggleImg<?php echo $assignment_row['assignment_id']; ?>" src="<?php echo AT_BASE_HREF; ?>images/mswitch_plus.gif" border="0" />\r
+      <?php echo $assignment_row['title']; ?>\r
+      </a>\r
+      <div id="flag<?php echo $assignment_row['assignment_id']; ?>" class="flagdiv">\r
+      <?php if (mysql_num_rows($result) > 0) { ?>\r
+        <img src="<?php echo AT_BASE_HREF; ?>mods/assignment_dropbox/flag.png" border="0" />\r
+      <?php }?>    \r
+      </div>\r
+    </h4><br />\r
+    <strong><?php echo _AT('due_date');?>: <?php if ($assignment_row['date_due'] == '0000-00-00 00:00:00') echo _AT('no'); else echo $assignment_row['date_due']; ?></strong>\r
+  </div>\r
+  \r
+  <div id="assignment_detail<?php echo $assignment_row['assignment_id']; ?>" class="assignment-detail" style="display:none">\r
+    <?php echo '<small>'._AT('delete_text').'</small>';?><br /><br />\r
+    <form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" name="form<?php echo $assignment_row['assignment_id']; ?>">\r
+    <input type="hidden" id="assignment_detail<?php echo $assignment_row['assignment_id']; ?>_toggled" value="0" />\r
+    <table class="data">\r
+    <thead>\r
+    <tr>\r
+      <th scope="col" width="10"><input type="checkbox" value="<?php echo _AT('select_all'); ?>" id="all" title="<?php echo _AT('select_all'); ?>" id="selectall<?php echo $assignment_row['assignment_id']; ?>" name="selectall<?php echo $assignment_row['assignment_id']; ?>" onclick="CheckAll(<?php echo $assignment_row['assignment_id']; ?>);" /></th>\r
+      <th scope="col"><?php echo _AT('file'); ?></th>\r
+      <th scope="col"><?php echo _AT('size'); ?></th>\r
+      <th scope="col"><?php echo _AT('date'); ?></th>\r
+      <th scope="col"><?php echo _AT('comments');  ?></th>\r
+    </tr>\r
+    </thead>\r
+\r
+    <tfoot>\r
+    <tr>\r
+      <td colspan="5">\r
+        <input type="submit" name="delete" value="<?php echo _AT('delete'); ?>" class="button" \r
+          <?php \r
+          if ($assignment_row['date_due'] <> '0000-00-00 00:00:00' && strtotime("now") > strtotime($assignment_row['date_due'])) \r
+               echo 'disabled="disabled"'; ?> />\r
+      </td>\r
+    </tr>\r
+    </tfoot>\r
+  \r
+    <tbody>\r
+  <?php if (mysql_num_rows($result) == 0) { ?>\r
+      <tr>\r
+        <td colspan="5"><?php echo _AT('none_found'); ?></td>\r
+      </tr>\r
+  <?php } else { \r
+  while ($file_info = mysql_fetch_assoc($result)) {?> \r
+      <tr onmousedown="document.form<?php echo $assignment_row['assignment_id']; ?>['r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>'].checked = !document.form<?php echo $assignment_row['assignment_id']; ?>['r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>'].checked; togglerowhighlight(this, 'r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>');" id="r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>_0">\r
+        <td valign="top" width="10">\r
+          <input type="checkbox" name="files<?php echo $assignment_row['assignment_id']; ?>[]" value="<?php echo $file_info['file_id']; ?>" id="r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>" onmouseup="this.checked=!this.checked" />\r
+        </td>\r
+        <td valign="top">\r
+          <img src="images/file_types/<?php echo fs_get_file_type_icon($file_info['file_name']); ?>.gif" height="16" width="16" alt="" title="" /> <label for="r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>" onmousedown="document.form<?php echo $assignment_row['assignment_id']; ?>['r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>'].checked = !document.form<?php echo $assignment_row['assignment_id']; ?>['r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>'].checked; togglerowhighlight(this, 'r<?php echo $assignment_row['assignment_id']; ?>_<?php echo $file_info['file_id']; ?>');"><?php echo htmlspecialchars($file_info['file_name']); ?></label>\r
+                 <?php if ($file_info['description']): ?>\r
+          <p class="fm-desc"><?php echo htmlspecialchars($file_info['description']); ?></p>\r
+                 <?php endif; ?>\r
+        </td>\r
+               <!-- <td valign="top">\r
+                       <?php if ($_config['fs_versioning']): ?>\r
+                               <?php if ($file_info['num_revisions']): \r
+                                       if ($file_info['num_revisions'] == 1) {\r
+                                               $lang_var = 'fs_revision';\r
+                                       } else {\r
+                                               $lang_var = 'fs_revisions';\r
+                                       }\r
+                                       ?>\r
+                                       \r
+          <a href="<?php echo url_rewrite('mods/_standard/file_storage/revisions.php'.$owner_arg_prefix.'id='.$file_info['file_id']); ?>"><?php echo _AT($lang_var, $file_info['num_revisions']); ?></a>\r
+                               <?php else: ?>\r
+                                       -\r
+                               <?php endif; ?>\r
+                       <?php endif; ?>\r
+        </td> -->\r
+        <td align="right" valign="top"><?php echo get_human_size($file_info['file_size']); ?></td>\r
+        <td align="right" valign="top"><?php echo AT_date(_AT('filemanager_date_format'), $file_info['date'], AT_DATE_MYSQL_DATETIME); ?></td>\r
+        <td valign="top">\r
+               <?php \r
+               if ($file_info['num_comments'] == 1) {\r
+                       $lang_var = 'fs_comment';\r
+               } else {\r
+                       $lang_var = 'fs_comments';\r
+               }\r
+               ?>\r
+        <a href="<?php echo url_rewrite('mods/_standard/file_storage/comments.php?ot='.$owner_type.SEP.'oid='. $assignment_row['assignment_id'].SEP.'id='.$file_info['file_id']); ?>"><?php echo _AT($lang_var, $file_info['num_comments']); ?></a></td>\r
+         </tr>\r
+  <?php }?>\r
+  <?php } // end of while ($file_info) ?>\r
+    </tbody>\r
+  \r
+    </table>\r
+  \r
+    <input type="hidden" name="owner_id" value="<?php echo $owner_id; ?>" />\r
+    <input type="hidden" name="folder_id" value="<?php echo $folder_id; ?>" />\r
+    <div class="row">\r
+      <span class="required" title="<?php echo _AT('required_field'); ?>">*</span><label for="file"><?php echo _AT('upload_file'); ?></label><br />\r
+      <input type="file" name="file" id="file" />&nbsp;\r
+      <input type="submit" name="upload" value="<?php echo _AT('upload'); ?>"  class="button"/>\r
+    </div>\r
+    <div class="row">\r
+      <label for="description"><?php echo _AT('description'); ?></label><br />\r
+      <textarea name="description" id="description" rows="1" cols="20"></textarea>\r
+    </div>\r
+    </form>\r
+  </div><!-- end of assignment_detail -->\r
+<?php          \r
+       } // end of while (assignment list)\r
+}\r
+?>\r
+</div>\r
+\r
+<script type="text/javascript">\r
+//<![CDATA[\r
+\r
+var ATutor = ATutor || {};\r
+ATutor.mods = ATutor.mods || {};\r
+ATutor.mods.assignment_dropbox = ATutor.mods.assignment_dropbox || {};\r
+\r
+(function () {\r
+    // Toggle div of assignment details\r
+    // param: assignment_id: used to compose div id\r
+    // param: set_to_state: Optional. \r
+    //        When provided, is the open/close state for the div\r
+    //        When not given, find the current open/close state on the div and reverse the state. \r
+    ATutor.mods.assignment_dropbox.toggleDiv = function (assignment_id, set_to_state){\r
+               flag = typeof(set_to_state) != 'undefined' ? set_to_state : jQuery("#assignment_detail"+assignment_id+"_toggled").val();\r
+\r
+               if (flag==1){\r
+                       jQuery("#toggleImg"+assignment_id).attr("src", "<?php echo AT_BASE_HREF; ?>images/mswitch_plus.gif");\r
+                       jQuery('#assignment_detail'+assignment_id+'_toggled').val(0);\r
+                       ATutor.setcookie('ad'+assignment_id+'_'+<?php echo $_SESSION['member_id'];?>, '1', 1);\r
+               } else {\r
+                       jQuery('#toggleImg'+assignment_id).attr('src', '<?php echo AT_BASE_HREF; ?>images/mswitch_minus.gif');\r
+                       jQuery('#assignment_detail'+assignment_id+'_toggled').val(1);\r
+                       ATutor.setcookie('ad'+assignment_id+'_'+<?php echo $_SESSION['member_id'];?>, '0', 1);\r
+               }\r
+               jQuery('#assignment_detail'+assignment_id).toggle();            \r
+    };\r
+\r
+    //set up the open/close state of each assignment div\r
+    var initialize = function () {\r
+        <?php \r
+        if (mysql_num_rows($assignment_list_result) > 0) {\r
+               mysql_data_seek($assignment_list_result, 0);\r
+               while ($assignment_row = mysql_fetch_assoc($assignment_list_result)) {\r
+        ?>\r
+                       if (ATutor.getcookie("ad<?php echo $assignment_row['assignment_id'].'_'.$_SESSION['member_id']; ?>") == "0") {\r
+                               ATutor.mods.assignment_dropbox.toggleDiv(<?php echo $assignment_row['assignment_id']; ?>, 0);\r
+                       }\r
+        <?php } // end of while\r
+        } // end of if?>\r
+    };\r
+    \r
+    jQuery(document).ready(initialize);\r
+})();\r
+\r
+function CheckAll(assignmentID) {\r
+       len = eval("document.form"+assignmentID+".elements.length");\r
+       for (var i=0;i<len;i++) {\r
+               var e = eval("document.form"+assignmentID+".elements[i]");\r
+               if ((e.name == 'files'+assignmentID+'[]') && (e.type=='checkbox')) {\r
+                       e.checked = eval("document.form"+assignmentID+".selectall"+assignmentID+".checked");\r
+                       togglerowhighlight(document.getElementById(e.id +"_0"), e.id);\r
+               }\r
+       }\r
+}\r
+\r
+function togglerowhighlight(obj, boxid) {\r
+       if (document.getElementById(boxid).checked) {\r
+               obj.className = 'selected';\r
+       } else {\r
+               obj.className = '';\r
+       }\r
+}\r
+\r
+//]]>\r
+</script>\r
+\r
+<?php require (AT_INCLUDE_PATH.'footer.inc.php'); ?>
\ No newline at end of file
diff --git a/mods/assignment_dropbox/module.css b/mods/assignment_dropbox/module.css
new file mode 100644 (file)
index 0000000..cce95cc
--- /dev/null
@@ -0,0 +1,15 @@
+div.flagdiv {\r
+  float:left;\r
+  padding-left:0.5em;\r
+}\r
+\r
+.floatleft {\r
+  float:left;\r
+}\r
+\r
+div.assignment-detail {\r
+  -moz-border-radius:0.3em 0.3em 0.3em 0.3em;\r
+  background:none repeat scroll 0 0 #F7F7F7;\r
+  margin:1em 1em 2em 2em;\r
+  width:95%;\r
+}
\ No newline at end of file
diff --git a/mods/assignment_dropbox/module.php b/mods/assignment_dropbox/module.php
new file mode 100644 (file)
index 0000000..cade9ae
--- /dev/null
@@ -0,0 +1,44 @@
+<?php
+/*******
+ * doesn't allow this file to be loaded with a browser.
+ */
+if (!defined('AT_INCLUDE_PATH')) { exit; }
+
+/******
+ * this file must only be included within a Module obj
+ */
+if (!isset($this) || (isset($this) && (strtolower(get_class($this)) != 'module'))) { exit(__FILE__ . ' is not a Module'); }
+
+/*******
+ * if this module is to be made available to students on the Home or Main Navigation.
+ */
+$_student_tool = 'mods/assignment_dropbox/index.php';
+
+/*******
+ * create optional sublinks for module "detail view" on course home page
+ * when this line is uncommented, "mods/assignment_dropbox/sublinks.php" need to be created to return an array of content to be displayed
+ */
+$this->_list['assignment_dropbox'] = array('title_var'=>'assignment_dropbox','file'=>'mods/assignment_dropbox/sublinks.php');
+
+/*******
+ * add the admin pages when needed.
+ */
+//if (admin_authenticate(AT_ADMIN_PRIV_assignment_dropbox, TRUE) || admin_authenticate(AT_ADMIN_PRIV_ADMIN, TRUE)) {
+//     $this->_pages[AT_NAV_ADMIN] = array('mods/assignment_dropbox/index_admin.php');
+//     $this->_pages['mods/assignment_dropbox/index_admin.php']['title_var'] = 'assignment_dropbox';
+//     $this->_pages['mods/assignment_dropbox/index_admin.php']['parent']    = AT_NAV_ADMIN;
+//}
+
+/*******
+ * student page.
+ */
+$this->_pages['mods/assignment_dropbox/index.php']['title_var'] = 'assignment_dropbox';
+$this->_pages['mods/assignment_dropbox/index.php']['icon']      = 'mods/assignment_dropbox/assignment_dropbox_sm.png';
+$this->_pages['mods/assignment_dropbox/index.php']['img']       = 'mods/assignment_dropbox/assignment_dropbox.png';
+$this->_pages['mods/assignment_dropbox/index.php']['text']      = _AT('assignment_dropbox_text');
+$this->_pages['mods/assignment_dropbox/index.php']['parent']   = 'mods/_standard/assignments/index_instructor.php';
+
+$this->_pages['mods/_standard/assignments/index_instructor.php']['children'] = 
+       array_merge(is_array($this->_pages['mods/_standard/assignments/index_instructor.php']['children']) ? $this->_pages['mods/_standard/assignments/index_instructor.php']['children'] : array(), array('mods/assignment_dropbox/index.php'));
+
+?>
\ No newline at end of file
diff --git a/mods/assignment_dropbox/module.sql b/mods/assignment_dropbox/module.sql
new file mode 100644 (file)
index 0000000..69aaa78
--- /dev/null
@@ -0,0 +1,8 @@
+# sql file for assignment dropbox module\r
+\r
+INSERT INTO `language_text` VALUES ('en', '_module','assignment_dropbox','Assignment Dropbox',NOW(),'');\r
+INSERT INTO `language_text` VALUES ('en', '_module','assignment_dropbox_text','Submit assignments.',NOW(),'');\r
+INSERT INTO `language_text` VALUES ('en', '_module','flag_text','<small>%s indicates files have been handed in.</small>',NOW(),'');\r
+INSERT INTO `language_text` VALUES ('en', '_module','delete_text','Note: "Delete" button is only available before the assignment due date.',NOW(),'');\r
+\r
+UPDATE `language_text` SET TEXT='Assignments are submitted using the Assignment Dropbox or group File Storage tool. Assign to all students, or create a group and enable File Storage for that group, to add an assignment drop-box.' WHERE term='AT_INFOS_ASSIGNMENT_FS_SUBMISSIONS';\r
diff --git a/mods/assignment_dropbox/module.xml b/mods/assignment_dropbox/module.xml
new file mode 100644 (file)
index 0000000..28a35d8
--- /dev/null
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="ISO-8859-1"?> \r
+<module version="0.1"> \r
+    <name lang="en">Assignment Dropbox</name> \r
+    <description lang="en">This module provides a easy way for students to submit assignments and instructors to manage assignment submissions.</description> \r
+    <maintainers>\r
+        <maintainer> \r
+            <name>ATutor Team</name> \r
+            <email>info@atutor.ca</email> \r
+        </maintainer>\r
+    </maintainers> \r
+    <url>http://atutor.ca</url> \r
+    <license>BSD</license> \r
+       <release> \r
+        <version>0.1</version> \r
+        <date>2010-07-20</date> \r
+        <state>stable</state> \r
+        <notes></notes> \r
+    </release> \r
+</module>\r
diff --git a/mods/assignment_dropbox/module_install.php b/mods/assignment_dropbox/module_install.php
new file mode 100644 (file)
index 0000000..5c0944c
--- /dev/null
@@ -0,0 +1,52 @@
+<?php\r
+/*******\r
+ * the line below safe-guards this file from being accessed directly from\r
+ * a web browser. It will only execute if required from within an ATutor script,\r
+ * in our case the Module::install() method.\r
+ */\r
+if (!defined('AT_INCLUDE_PATH')) { exit; }\r
+\r
+/*******\r
+ * Note: the many options for these variables are used to decrease confusion.\r
+ *       TRUE | FALSE | 1 will be the convention.\r
+ *\r
+ * $_course_privilege\r
+ *     specifies the type of instructor privilege this module uses.\r
+ *     set to empty | FALSE | 0   to disable any privileges.\r
+ *     set to 1 | AT_PRIV_ADMIN   to use the instructor only privilege.\r
+ *     set to TRUE | 'new'        to create a privilege specifically for this module:\r
+ *                                will make this module available as a student privilege.\r
+ *\r
+ * $_admin_privilege\r
+ *    specifies the type of ATutor administrator privilege this module uses.\r
+ *    set to FALSE | AT_ADMIN_PRIV_ADMIN   to use the super administrator only privilege.\r
+ *    set to TRUE | 'new'                  to create a privilege specifically for this module:\r
+ *                                         will make this module available as an administrator privilege.\r
+ *\r
+ *\r
+ * $_cron_interval\r
+ *    if non-zero specifies in minutes how often the module's cron job should be run.\r
+ *    set to 0 or not set to disable.\r
+ */\r
+//$_course_privilege = TRUE; // possible values: FALSE | AT_PRIV_ADMIN | TRUE\r
+//$_admin_privilege  = TRUE; // possible values: FALSE | TRUE\r
+//$_cron_interval    = 35; // run every 30 minutes\r
+\r
+/******\r
+ * the following code checks if there are any errors (generated previously)\r
+ * then uses the SqlUtility to run any database queries it needs, ie. to create\r
+ * its own tables.\r
+ */\r
+if (!$msg->containsErrors() && file_exists(dirname(__FILE__) . '/module.sql')) {\r
+       // deal with the SQL file:\r
+       require(AT_INCLUDE_PATH . 'classes/sqlutility.class.php');\r
+       $sqlUtility =& new SqlUtility();\r
+\r
+       /*\r
+        * the SQL file could be stored anywhere, and named anything, "module.sql" is simply\r
+        * a convention we're using.\r
+        */\r
+       $sqlUtility->queryFromFile(dirname(__FILE__) . '/module.sql', TABLE_PREFIX);\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/mods/assignment_dropbox/module_uninstall.php b/mods/assignment_dropbox/module_uninstall.php
new file mode 100644 (file)
index 0000000..30a2183
--- /dev/null
@@ -0,0 +1,30 @@
+<?php\r
+/*******\r
+ * module_uninstall.php performs reversion of module_install.php\r
+ */\r
+\r
+/*******\r
+ * the line below safe-guards this file from being accessed directly from\r
+ * a web browser. It will only execute if required from within an ATutor script,\r
+ * in our case the Module::uninstall() method.\r
+ */\r
+if (!defined('AT_INCLUDE_PATH')) { exit; }\r
+\r
+/******\r
+ * the following code checks if there are any errors (generated previously)\r
+ * then uses the SqlUtility to run reverted database queries of module.sql, \r
+ * ie. "create table" statement in module.sql is run as drop according table.\r
+ */\r
+if (!$msg->containsErrors() && file_exists(dirname(__FILE__) . '/module.sql')) {\r
+       // deal with the SQL file:\r
+       require(AT_INCLUDE_PATH . 'classes/sqlutility.class.php');\r
+       $sqlUtility =& new SqlUtility();\r
+\r
+       /*\r
+        * the SQL file could be stored anywhere, and named anything, "module.sql" is simply\r
+        * a convention we're using.\r
+        */\r
+       $sqlUtility->revertQueryFromFile(dirname(__FILE__) . '/module.sql', TABLE_PREFIX);\r
+}\r
+\r
+?>
\ No newline at end of file
diff --git a/mods/assignment_dropbox/sublinks.php b/mods/assignment_dropbox/sublinks.php
new file mode 100644 (file)
index 0000000..93f0351
--- /dev/null
@@ -0,0 +1,62 @@
+<?php
+
+if (!defined('AT_INCLUDE_PATH')) { exit; }
+
+/*****
+* Free form PHP can appear here to retreive current information
+* from the module, or a text description of the module where there is
+* not current information
+*****/
+
+global $db;
+
+$link_limit = 2;               // Number of links to be displayed on "detail view" box
+
+$groups_list = implode(',',$_SESSION['groups']);
+
+$sql = '';
+if (authenticate(AT_PRIV_ASSIGNMENTS, AT_PRIV_RETURN)) { // instructor
+       $file_storage_assignments = array();
+       $sql = "SELECT * FROM ".TABLE_PREFIX."assignments WHERE course_id=$_SESSION[course_id] ORDER BY date_due DESC";
+} else { // students
+       if ($groups_list <> '') {
+               $sql = "(SELECT a.title, date_due
+                  FROM ".TABLE_PREFIX."groups_types gt, ".TABLE_PREFIX."groups g, ".TABLE_PREFIX."assignments a
+                 WHERE g.group_id in (".$groups_list.")
+                   AND g.group_id in (SELECT group_id FROM ".TABLE_PREFIX."file_storage_groups)
+                   AND g.type_id = gt.type_id
+                   AND gt.course_id = $_SESSION[course_id]
+                   AND gt.type_id = a.assign_to
+                   AND (a.date_cutoff=0 OR UNIX_TIMESTAMP(a.date_cutoff) > ".time()."))
+               UNION
+               ";
+       }
+       $sql .= "(SELECT title, date_due
+                  FROM ".TABLE_PREFIX."assignments 
+                 WHERE assign_to=0 
+                   AND course_id=$_SESSION[course_id] 
+                   AND (date_cutoff=0 OR UNIX_TIMESTAMP(date_cutoff) > ".time()."))
+               ORDER BY date_due DESC";
+}
+$sql .= " LIMIT $link_limit";
+$result = mysql_query($sql, $db);
+
+if (mysql_num_rows($result) > 0) {
+       while ($row = mysql_fetch_assoc($result)) {
+               /****
+               * SUBLINK_TEXT_LEN, VALIDATE_LENGTH_FOR_DISPLAY are defined in include/lib/constance.lib.inc
+               * SUBLINK_TEXT_LEN determins the maxium length of the string to be displayed on "detail view" box.
+               *****/
+               $title = $row['title'] . ' ('._AT("due_date").': '.$row['date_due'].')';
+               $list[] = '<a href="'.AT_BASE_HREF.'mods/assignment_dropbox/index.php">'. 
+                         $title .'</a>';
+//             $list[] = '<a href="mods/assignment_dropbox/index.php"'.
+//                       (strlen($row['value']) > SUBLINK_TEXT_LEN ? ' title="'.$row['value'].'"' : '') .'>'. 
+//                       validate_length($row['value'], SUBLINK_TEXT_LEN, VALIDATE_LENGTH_FOR_DISPLAY) .'</a>';
+       }
+       return $list;   
+} else {
+       return 0;
+}
+
+?>
\ No newline at end of file