FOSSology  4.7.1
Open Source License Compliance by Open Source Software
admin-folder-size.php
1 <?php
2 /*
3  SPDX-FileCopyrightText: © 2023 Siemens AG
4 
5  SPDX-License-Identifier: GPL-2.0-only
6 */
7 
10 
11 define("TITLE_SIZE_DASHBOARD", _("Folder and upload dashboard"));
12 
14 {
15 
17  private $dbManager;
18 
22  private $uploadDao;
23 
24  function __construct()
25  {
26  $this->Name = "size_dashboard";
27  $this->Title = TITLE_SIZE_DASHBOARD;
28  $this->MenuList = "Admin::Dashboards::Folder/Upload Proportions";
29  $this->Dependency = array();
30  $this->DBaccess = PLUGIN_DB_WRITE;
31  parent::__construct();
32  $this->dbManager = $GLOBALS['container']->get('db.manager');
33  $this->uploadDao = $GLOBALS['container']->get('dao.upload');
34  }
35 
41  function getFolderAndUploadSize($folderId)
42  {
43  $sql = 'INNER JOIN upload ON upload.pfile_fk=pfile.pfile_pk '.
44  'INNER JOIN foldercontents ON upload.upload_pk=foldercontents.child_id '.
45  'INNER JOIN upload_clearing ON upload.upload_pk=upload_clearing.upload_fk '.
46  'WHERE parent_fk=$1';
47  $statementName = __METHOD__."GetFolderSize";
48  $folderSizesql = 'SELECT SUM(pfile_size) FROM pfile '.$sql;
49  $row = $this->dbManager->getSingleRow($folderSizesql,array($folderId),$statementName);
50  $folderSize = HumanSize($row['sum']);
51 
52  $dispSql = "SELECT DISTINCT ON (upload.upload_pk) upload_pk, upload_filename, pfile_size, " .
53  "to_char(upload_ts, 'YYYY-MM-DD HH24:MI:SS') AS upload_ts, status_fk FROM pfile " . $sql . " ORDER BY upload.upload_pk";
54  $statementNameDisp = __METHOD__ . "GetEachUploadSize";
55  $results = $this->dbManager->getRows($dispSql, [$folderId], $statementNameDisp);
56 
57  $uploadIds = array_column($results, 'upload_pk');
58  $durationBatch = $this->uploadDao->getClearingDurationsBatch($uploadIds);
59 
60  $var = '';
61  foreach ($results as $result) {
62  $clearingDuration = $durationBatch[$result["upload_pk"]] ?? ['NA', 0];
63  $var .= "<tr><td align='left'>" . $result['upload_pk'] .
64  "</td><td align='left'>" . $result['upload_filename'] .
65  "</td><td align='left' data-order='{$result['pfile_size']}'>" .
66  HumanSize($result['pfile_size']) .
67  "</td><td align='left' data-order='{$clearingDuration[1]}'>$clearingDuration[0]</td>
68  <td align='left'>{$result['upload_ts']}</td><td align='left'>" . $this->ConvertStatusToString($result['status_fk']) .
69  "</td></tr>";
70  }
71  return [$var, $folderSize];
72  }
73 
79  private function generateExportData($folderId, $format)
80  {
81  $results = $this->dbManager->getRows(
82  "SELECT DISTINCT ON (upload.upload_pk) upload_pk, upload_filename, pfile_size, to_char(upload_ts, 'YYYY-MM-DD HH24:MI:SS') AS upload_ts, status_fk " .
83  "FROM pfile " .
84  "INNER JOIN upload ON upload.pfile_fk=pfile.pfile_pk " .
85  "INNER JOIN foldercontents ON upload.upload_pk=foldercontents.child_id " .
86  "INNER JOIN upload_clearing ON upload.upload_pk=upload_clearing.upload_fk " .
87  "WHERE parent_fk=$1 ORDER BY upload.upload_pk",
88  [$folderId],
89  __METHOD__ . "ExportData"
90  );
91 
92  $uploadIds = array_column($results, 'upload_pk');
93  $durationBatch = $this->uploadDao->getClearingDurationsBatch($uploadIds);
94 
95  $data = [];
96  foreach ($results as $row) {
97  $clearingDuration = $durationBatch[$row["upload_pk"]] ?? ['NA', 0];
98  $data[] = [
99  'uploadid' => $row['upload_pk'],
100  'name' => $row['upload_filename'],
101  'size' => $row['pfile_size'],
102  'duration' => $clearingDuration[1],
103  'date' => $row['upload_ts'],
104  'status' => $this->ConvertStatusToString($row['status_fk'])
105  ];
106  }
107 
108  switch ($format) {
109  case 'csv':
110  $this->outputCSV($data);
111  break;
112  case 'json':
113  $this->outputJSON($data);
114  break;
115  }
116  }
117 
122  private function ConvertStatusToString($status)
123  {
124  $statusString = 'Open';
125  if ($status == 2) {
126  $statusString = 'In progress';
127  } else if ($status == 3) {
128  $statusString = 'Closed';
129  } else if ($status == 4) {
130  $statusString = 'Rejected';
131  }
132 
133  return $statusString;
134  }
135 
140  private function outputCSV($data)
141  {
142  header('Content-Type: text/csv');
143  header('Content-Disposition: attachment; filename="folder_export.csv"');
144 
145  $output = fopen('php://output', 'w');
146  fputcsv($output, ['Upload id', 'Upload name', 'Size (bytes)', 'Clearing duration (seconds)', 'Upload date', 'Upload status']);
147 
148  foreach ($data as $row) {
149  fputcsv($output, [
150  $row['uploadid'],
151  $row['name'],
152  $row['size'],
153  $row['duration'],
154  $row['date'],
155  $row['status']
156  ]);
157  }
158  fclose($output);
159  exit;
160  }
161 
166  private function outputJSON($data)
167  {
168  header('Content-Type: application/json');
169  header('Content-Disposition: attachment; filename="folder_export.json"');
170  echo json_encode($data, JSON_PRETTY_PRINT);
171  exit;
172  }
173 
177  public function Output()
178  {
179  $exportFormat = GetParm('export', PARM_STRING);
180  if (!empty($exportFormat) && in_array($exportFormat, ['csv', 'json'])) {
181  $folderId = GetParm('folder', PARM_INTEGER);
182  $this->generateExportData($folderId, $exportFormat);
183  }
184  /* If this is a POST, then process the request. */
185  $folderId = GetParm('selectfolderid', PARM_INTEGER);
186  if (empty($folderId)) {
187  $folderId = FolderGetTop();
188  }
189  list($tableVars, $wholeFolderSize) = $this->getFolderAndUploadSize($folderId);
190 
191  /* Display the form */
192  $formVars["onchangeURI"] = Traceback_uri() . "?mod=" . $this->Name . "&selectfolderid=";
193  $formVars["folderListOption"] = FolderListOption(-1, 0, 1, $folderId);
194  $formVars["tableVars"] = $tableVars;
195  $formVars["wholeFolderSize"] = $wholeFolderSize;
196  $formVars["currentFolderId"] = $folderId;
197  $formVars["pluginName"] = $this->Name;
198  return $this->renderString("admin-folder-size-form.html.twig", $formVars);
199  }
200 }
201 $NewPlugin = new size_dashboard;
This is the Plugin class. All plugins should:
Definition: FO_Plugin.php:57
renderString($templateName, $vars=null)
Definition: FO_Plugin.php:414
getFolderAndUploadSize($folderId)
Given a folder's ID function will get size of the folder and uploads under it.
__construct()
base constructor. Most plugins will just use this
Output()
Generate the text for this plugin.
outputJSON($data)
Outputs data in JSON format.
ConvertStatusToString($status)
convert numaric status into string.
generateExportData($folderId, $format)
Generate export data in CSV or JSON format for a given folder ID.
outputCSV($data)
Outputs data in CSV format.
FolderListOption($ParentFolder, $Depth, $IncludeTop=1, $SelectId=-1, $linkParent=false, $OldParent=0)
Create the folder tree, using OPTION tags.
FolderGetTop()
DEPRECATED! Find the top-of-tree folder_pk for the current user.
Traceback_uri()
Get the URI without query to this location.
Definition: common-parm.php:97
const PARM_INTEGER
Definition: common-parm.php:14
const PARM_STRING
Definition: common-parm.php:18
GetParm($parameterName, $parameterType)
This function will retrieve the variables and check data types.
Definition: common-parm.php:46
HumanSize( $bytes)
Translate a byte number to a proper type, xxx bytes to xxx B/KB/MB/GB/TB/PB.
Definition: common-ui.php:100
#define PLUGIN_DB_WRITE
Plugin requires write permission on DB.
Definition: libfossology.h:38
fo_dbManager * dbManager
fo_dbManager object
Definition: process.c:16