Skip to content

Commit 066ca59

Browse files
committed
Modify user file quotas
1 parent 4a2bea2 commit 066ca59

File tree

10 files changed

+360
-64
lines changed

10 files changed

+360
-64
lines changed

src/cloud-client/CMakeLists.txt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,14 @@
1+
find_package(Qt6 REQUIRED COMPONENTS Core)
2+
find_package(Qt6 REQUIRED COMPONENTS Widgets)
3+
14
qt_add_executable(cloud-client
25
src/action.cpp
36
src/application.cpp
47
src/central_widget.cpp
58
src/cloud_actions_tree.cpp
69
src/cloud_auth_token_manager_dialog.cpp
710
src/cloud_auth_token_manager_widget.cpp
11+
src/cloud_file_quota_dialog.cpp
812
src/cloud_group_add_dialog.cpp
913
src/cloud_groups_tree.cpp
1014
src/cloud_processes_tree.cpp
@@ -27,6 +31,7 @@ qt_add_executable(cloud-client
2731
src/cloud_actions_tree.h
2832
src/cloud_auth_token_manager_dialog.h
2933
src/cloud_auth_token_manager_widget.h
34+
src/cloud_file_quota_dialog.h
3035
src/cloud_group_add_dialog.h
3136
src/cloud_groups_tree.h
3237
src/cloud_processes_tree.h
@@ -50,6 +55,8 @@ target_link_libraries(cloud-client
5055
range-gui-lib
5156
common_defines
5257
)
58+
target_link_libraries(cloud-client PRIVATE Qt6::Core)
59+
target_link_libraries(cloud-client PRIVATE Qt6::Widgets)
5360

5461
set_target_properties(cloud-client
5562
PROPERTIES
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
#include <QVBoxLayout>
2+
#include <QFormLayout>
3+
#include <QSpinBox>
4+
#include <QPushButton>
5+
#include <QDialogButtonBox>
6+
7+
#include "cloud_file_quota_dialog.h"
8+
9+
CloudFileQuotaDialog::CloudFileQuotaDialog(const RFileQuota &fileQuota, QWidget *parent)
10+
: QDialog{parent}
11+
, fileQuota{fileQuota}
12+
{
13+
QIcon cancelIcon(":/icons/action/pixmaps/range-cancel.svg");
14+
QIcon okIcon(":/icons/action/pixmaps/range-ok.svg");
15+
16+
this->setWindowTitle(tr("Edit file quotas"));
17+
18+
QVBoxLayout *mainLayout = new QVBoxLayout;
19+
this->setLayout(mainLayout);
20+
21+
QFormLayout *formLayout = new QFormLayout;
22+
mainLayout->addLayout(formLayout);
23+
24+
QSpinBox *storeSizeSpin = new QSpinBox;
25+
storeSizeSpin->setMinimum(-1);
26+
storeSizeSpin->setMaximum(INT_MAX);
27+
storeSizeSpin->setSuffix(" [MB]");
28+
storeSizeSpin->setValue(CloudFileQuotaDialog::b2mb(fileQuota.getStoreSize()));
29+
formLayout->addRow(tr("Store size"),storeSizeSpin);
30+
31+
QSpinBox *fileSizeSpin = new QSpinBox;
32+
fileSizeSpin->setMinimum(-1);
33+
fileSizeSpin->setMaximum(INT_MAX);
34+
fileSizeSpin->setSuffix(" [MB]");
35+
fileSizeSpin->setValue(CloudFileQuotaDialog::b2mb(fileQuota.getFileSize()));
36+
formLayout->addRow(tr("File size"),fileSizeSpin);
37+
38+
QSpinBox *fileCountSpin = new QSpinBox;
39+
fileCountSpin->setMinimum(-1);
40+
fileCountSpin->setMaximum(INT_MAX);
41+
fileCountSpin->setValue(fileQuota.getFileCount());
42+
formLayout->addRow(tr("File count"),fileCountSpin);
43+
44+
QObject::connect(storeSizeSpin,&QSpinBox::valueChanged,this,&CloudFileQuotaDialog::onStoreSizeChanged);
45+
QObject::connect(fileSizeSpin,&QSpinBox::valueChanged,this,&CloudFileQuotaDialog::onFileSizeChanged);
46+
QObject::connect(fileCountSpin,&QSpinBox::valueChanged,this,&CloudFileQuotaDialog::onFileCountChanged);
47+
48+
QDialogButtonBox *buttonBox = new QDialogButtonBox;
49+
mainLayout->addWidget(buttonBox);
50+
51+
QPushButton *cancelButton = new QPushButton(cancelIcon, tr("Cancel"));
52+
buttonBox->addButton(cancelButton,QDialogButtonBox::RejectRole);
53+
54+
QPushButton *okButton = new QPushButton(okIcon, tr("OK"));
55+
buttonBox->addButton(okButton,QDialogButtonBox::AcceptRole);
56+
57+
QObject::connect(buttonBox,&QDialogButtonBox::rejected,this,&QDialog::reject);
58+
QObject::connect(buttonBox,&QDialogButtonBox::accepted,this,&QDialog::accept);
59+
}
60+
61+
const RFileQuota &CloudFileQuotaDialog::getFileQuota() const
62+
{
63+
return this->fileQuota;
64+
}
65+
66+
int CloudFileQuotaDialog::b2mb(qint64 b)
67+
{
68+
return int(std::ceil(double(b)/double(1048576)));
69+
}
70+
71+
qint64 CloudFileQuotaDialog::mb2b(int mb)
72+
{
73+
return qint64(mb)*1048576;
74+
}
75+
76+
void CloudFileQuotaDialog::onStoreSizeChanged(int value)
77+
{
78+
this->fileQuota.setStoreSize(CloudFileQuotaDialog::mb2b(value));
79+
}
80+
81+
void CloudFileQuotaDialog::onFileSizeChanged(int value)
82+
{
83+
this->fileQuota.setFileSize(CloudFileQuotaDialog::mb2b(value));
84+
}
85+
86+
void CloudFileQuotaDialog::onFileCountChanged(int value)
87+
{
88+
this->fileQuota.setFileCount(value);
89+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#ifndef CLOUD_FILE_QUOTA_DIALOG_H
2+
#define CLOUD_FILE_QUOTA_DIALOG_H
3+
4+
#include <QDialog>
5+
6+
#include <rcl_file_quota.h>
7+
8+
class CloudFileQuotaDialog : public QDialog
9+
{
10+
Q_OBJECT
11+
12+
//! File quota.
13+
RFileQuota fileQuota;
14+
15+
public:
16+
17+
//! Constructor.
18+
explicit CloudFileQuotaDialog(const RFileQuota &fileQuota, QWidget *parent = nullptr);
19+
20+
//! Return const reference to file quota.
21+
const RFileQuota &getFileQuota() const;;
22+
23+
private:
24+
25+
static int b2mb(qint64 b);
26+
static qint64 mb2b(int mb);
27+
28+
protected slots:
29+
30+
void onStoreSizeChanged(int value);
31+
void onFileSizeChanged(int value);
32+
void onFileCountChanged(int value);
33+
34+
};
35+
36+
#endif // CLOUD_FILE_QUOTA_DIALOG_H

src/cloud-client/src/cloud_users_tree.cpp

Lines changed: 51 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
#include "application.h"
1111
#include "cloud_auth_token_manager_dialog.h"
12+
#include "cloud_file_quota_dialog.h"
1213
#include "cloud_user_add_dialog.h"
1314
#include "cloud_user_groups_dialog.h"
1415
#include "cloud_users_tree.h"
@@ -59,6 +60,9 @@ CloudUsersTree::CloudUsersTree(QWidget *parent)
5960
QAction *editGroupsAction = new QAction(tr("Edit groups"));
6061
editMenu->addAction(editGroupsAction);
6162

63+
QAction *editFileQuotasAction = new QAction(tr("Edit file quotas"));
64+
editMenu->addAction(editFileQuotasAction);
65+
6266
QAction *editTokensAction = new QAction(tr("Edit tokens"));
6367
editMenu->addAction(editTokensAction);
6468

@@ -88,6 +92,7 @@ CloudUsersTree::CloudUsersTree(QWidget *parent)
8892
QObject::connect(this->refreshButton,&QPushButton::clicked,this,&CloudUsersTree::onRefreshButtonClicked);
8993

9094
QObject::connect(editGroupsAction,&QAction::triggered,this,&CloudUsersTree::onEditGroupsButtonTriggered);
95+
QObject::connect(editFileQuotasAction,&QAction::triggered,this,&CloudUsersTree::onEditFileQuotasButtonTriggered);
9196
QObject::connect(editTokensAction,&QAction::triggered,this,&CloudUsersTree::onEditTokensButtonTriggered);
9297

9398
const RApplicationSettings *applicationSettings = qobject_cast<Application*>(Application::instance())->getApplicationSettings();
@@ -134,15 +139,21 @@ void CloudUsersTree::updateTreeItem(QTreeWidgetItem *listItem, const RUserInfo &
134139
{
135140
listItem->setText(ColumnName,userInfo.getName());
136141
listItem->setText(ColumnGroups,userInfo.getGroupNames().join(','));
142+
listItem->setData(ColumnStoreSizeQuota,Qt::DisplayRole,userInfo.getFileQuota().getStoreSize());
143+
listItem->setData(ColumnFileSizeQuota,Qt::DisplayRole,userInfo.getFileQuota().getFileSize());
144+
listItem->setData(ColumnFileCountQuota,Qt::DisplayRole,userInfo.getFileQuota().getFileCount());
137145
}
138146

139147
QString CloudUsersTree::getColumnName(ColumnType columnType)
140148
{
141149
switch (columnType)
142150
{
143-
case ColumnName: return tr("Name");
144-
case ColumnGroups: return tr("Groups");
145-
default: return QString();
151+
case ColumnName: return tr("Name");
152+
case ColumnGroups: return tr("Groups");
153+
case ColumnStoreSizeQuota: return tr("Store size");
154+
case ColumnFileSizeQuota: return tr("File size");
155+
case ColumnFileCountQuota: return tr("File count");
156+
default: return QString();
146157
}
147158
}
148159

@@ -266,6 +277,11 @@ void CloudUsersTree::onEditGroupsButtonTriggered()
266277
RUserInfo userInfo;
267278
userInfo.setName(selectedItem->text(ColumnName));
268279
userInfo.setGroupNames(selectedItem->text(ColumnGroups).split(','));
280+
RFileQuota fileQuota;
281+
fileQuota.setStoreSize(selectedItem->data(ColumnStoreSizeQuota,Qt::DisplayRole).toLongLong());
282+
fileQuota.setFileSize(selectedItem->data(ColumnFileSizeQuota,Qt::DisplayRole).toLongLong());
283+
fileQuota.setFileCount(selectedItem->data(ColumnFileCountQuota,Qt::DisplayRole).toLongLong());
284+
userInfo.setFileQuota(fileQuota);
269285

270286
CloudUserGroupsDialog userGroupsDialog(userInfo,this->groupInfoList,this);
271287

@@ -285,6 +301,38 @@ void CloudUsersTree::onEditGroupsButtonTriggered()
285301
}
286302
}
287303

304+
void CloudUsersTree::onEditFileQuotasButtonTriggered()
305+
{
306+
QList<QTreeWidgetItem*> selectedItems = this->usersTree->selectedItems();
307+
for (QTreeWidgetItem *selectedItem : std::as_const(selectedItems))
308+
{
309+
RUserInfo userInfo;
310+
userInfo.setName(selectedItem->text(ColumnName));
311+
userInfo.setGroupNames(selectedItem->text(ColumnGroups).split(','));
312+
RFileQuota fileQuota;
313+
fileQuota.setStoreSize(selectedItem->data(ColumnStoreSizeQuota,Qt::DisplayRole).toLongLong());
314+
fileQuota.setFileSize(selectedItem->data(ColumnFileSizeQuota,Qt::DisplayRole).toLongLong());
315+
fileQuota.setFileCount(selectedItem->data(ColumnFileCountQuota,Qt::DisplayRole).toLongLong());
316+
userInfo.setFileQuota(fileQuota);
317+
318+
CloudFileQuotaDialog dialog(fileQuota,this);
319+
320+
if (dialog.exec() == RMessageBox::Accepted)
321+
{
322+
try
323+
{
324+
userInfo.setFileQuota(dialog.getFileQuota());
325+
this->cloudClient->requestUserUpdate(userInfo.getName(),userInfo);
326+
}
327+
catch (const RError &rError)
328+
{
329+
RLogger::error("Failed to request to update user on Cloud. %s\n",rError.getMessage().toUtf8().constData());
330+
RMessageBox::critical(this,tr("Updating user failed"),tr("Updating user on Cloud has failed."));
331+
}
332+
}
333+
}
334+
}
335+
288336
void CloudUsersTree::onEditTokensButtonTriggered()
289337
{
290338
QList<QTreeWidgetItem*> selectedItems = this->usersTree->selectedItems();

src/cloud-client/src/cloud_users_tree.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ class CloudUsersTree : public QWidget
1616
{
1717
ColumnName = 0,
1818
ColumnGroups,
19+
ColumnStoreSizeQuota,
20+
ColumnFileSizeQuota,
21+
ColumnFileCountQuota,
1922
NunberOfColumns
2023
};
2124

@@ -89,6 +92,9 @@ class CloudUsersTree : public QWidget
8992
//! Edit groups triggered.
9093
void onEditGroupsButtonTriggered();
9194

95+
//! Edit file quotas triggered.
96+
void onEditFileQuotasButtonTriggered();
97+
9298
//! Edit tokens triggered.
9399
void onEditTokensButtonTriggered();
94100

0 commit comments

Comments
 (0)