Skip to content

Commit f508da4

Browse files
Quota Cleanup - Updates to remove unused starting kits and bundles and exclude starting kit and public data from unused datasets (#2313)
* quota cleanup updated to allow users to remove unused starting kits and competition bundles. Starting kit and public data are not included in unused datasets anymore * Merge conflicts * Merge conflict --------- Co-authored-by: didayolo <adrien.pavao@gmail.com>
1 parent 5e076a2 commit f508da4

File tree

5 files changed

+195
-6
lines changed

5 files changed

+195
-6
lines changed

src/apps/api/tests/test_cleanup.py

Lines changed: 45 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,19 @@ def setUp(self):
5656
DataFactory(created_by=user, type=Data.INGESTION_PROGRAM),
5757
DataFactory(created_by=user, type=Data.SCORING_PROGRAM),
5858
DataFactory(created_by=user, type=Data.INPUT_DATA),
59-
DataFactory(created_by=user, type=Data.REFERENCE_DATA),
60-
DataFactory(created_by=user, type=Data.PUBLIC_DATA)
59+
DataFactory(created_by=user, type=Data.REFERENCE_DATA)
60+
]
61+
62+
# Create unused starting kits
63+
self.unused_starting_kits = [
64+
DataFactory(created_by=user, type=Data.STARTING_KIT),
65+
DataFactory(created_by=user, type=Data.STARTING_KIT)
66+
]
67+
68+
# Create unused competition bundles
69+
self.unused_competition_bundles = [
70+
DataFactory(created_by=user, type=Data.COMPETITION_BUNDLE),
71+
DataFactory(created_by=user, type=Data.COMPETITION_BUNDLE)
6172
]
6273

6374
self.client.login(username='test_user', password='test_user')
@@ -72,6 +83,8 @@ def test_cleanup_stats(self):
7283
assert content["unused_datasets_programs"] == len(self.unused_datasets_programs)
7384
assert content["unused_submissions"] == len(self.unused_submissions)
7485
assert content["failed_submissions"] == len(self.failed_submissions)
86+
assert content["unused_starting_kits"] == len(self.unused_starting_kits)
87+
assert content["unused_competition_bundles"] == len(self.unused_competition_bundles)
7588

7689
def test_delete_unused_tasks(self):
7790

@@ -132,3 +145,33 @@ def test_delete_failed_submissions(self):
132145
assert resp.status_code == 200
133146
content = json.loads(resp.content)
134147
assert content["failed_submissions"] == 0
148+
149+
def test_delete_unused_starting_kits(self):
150+
151+
url = reverse('delete_unused_starting_kits')
152+
resp = self.client.delete(url)
153+
assert resp.status_code == 200
154+
content = json.loads(resp.content)
155+
assert content["success"]
156+
assert content["message"] == "Unused starting kits deleted successfully"
157+
158+
url = reverse('user_quota_cleanup')
159+
resp = self.client.get(url)
160+
assert resp.status_code == 200
161+
content = json.loads(resp.content)
162+
assert content["unused_starting_kits"] == 0
163+
164+
def test_delete_unused_competition_bundles(self):
165+
166+
url = reverse('delete_unused_competition_bundles')
167+
resp = self.client.delete(url)
168+
assert resp.status_code == 200
169+
content = json.loads(resp.content)
170+
assert content["success"]
171+
assert content["message"] == "Unused competition bundles deleted successfully"
172+
173+
url = reverse('user_quota_cleanup')
174+
resp = self.client.get(url)
175+
assert resp.status_code == 200
176+
content = json.loads(resp.content)
177+
assert content["unused_competition_bundles"] == 0

src/apps/api/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@
5454
path('delete_unused_datasets/', quota.delete_unused_datasets, name="delete_unused_datasets"),
5555
path('delete_unused_submissions/', quota.delete_unused_submissions, name="delete_unused_submissions"),
5656
path('delete_failed_submissions/', quota.delete_failed_submissions, name="delete_failed_submissions"),
57+
path('delete_unused_starting_kits/', quota.delete_unused_starting_kits, name="delete_unused_starting_kits"),
58+
path('delete_unused_competition_bundles/', quota.delete_unused_competition_bundles, name="delete_unused_competition_bundles"),
5759

5860
# User account
5961
path('delete_account/', profiles.delete_account, name="delete_account"),

src/apps/api/views/quota.py

Lines changed: 69 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@ def user_quota_cleanup(request):
2121
unused_datasets_programs = Data.objects.filter(
2222
Q(created_by=request.user) &
2323
~Q(type=Data.SUBMISSION) &
24-
~Q(type=Data.COMPETITION_BUNDLE)
24+
~Q(type=Data.COMPETITION_BUNDLE) &
25+
~Q(type=Data.PUBLIC_DATA) &
26+
~Q(type=Data.STARTING_KIT)
2527
).exclude(
2628
Q(task_ingestion_programs__isnull=False) |
2729
Q(task_input_datas__isnull=False) |
@@ -42,11 +44,29 @@ def user_quota_cleanup(request):
4244
Q(status=Submission.FAILED)
4345
).count()
4446

47+
# Get unused starting kits count
48+
unused_starting_kits = Data.objects.filter(
49+
Q(created_by=request.user) &
50+
Q(type=Data.STARTING_KIT) &
51+
Q(competition__isnull=True) &
52+
Q(phase_starting_kit__isnull=True)
53+
).count()
54+
55+
# Get unused competition bundles
56+
unused_competition_bundles = Data.objects.filter(
57+
Q(created_by=request.user) &
58+
Q(type=Data.COMPETITION_BUNDLE) &
59+
Q(competition__isnull=True) &
60+
Q(competition_bundles__isnull=True)
61+
).count()
62+
4563
return Response({
4664
"unused_tasks": unused_tasks,
4765
"unused_datasets_programs": unused_datasets_programs,
4866
"unused_submissions": unused_submissions,
49-
"failed_submissions": failed_submissions
67+
"failed_submissions": failed_submissions,
68+
"unused_starting_kits": unused_starting_kits,
69+
"unused_competition_bundles": unused_competition_bundles
5070
})
5171

5272

@@ -84,7 +104,9 @@ def delete_unused_datasets(request):
84104
Data.objects.filter(
85105
Q(created_by=request.user) &
86106
~Q(type=Data.SUBMISSION) &
87-
~Q(type=Data.COMPETITION_BUNDLE)
107+
~Q(type=Data.COMPETITION_BUNDLE) &
108+
~Q(type=Data.PUBLIC_DATA) &
109+
~Q(type=Data.STARTING_KIT)
88110
).exclude(
89111
Q(task_ingestion_programs__isnull=False) |
90112
Q(task_input_datas__isnull=False) |
@@ -144,3 +166,47 @@ def delete_failed_submissions(request):
144166
"success": False,
145167
"message": f"{e}"
146168
})
169+
170+
171+
@api_view(['DELETE'])
172+
def delete_unused_starting_kits(request):
173+
try:
174+
Data.objects.filter(
175+
Q(created_by=request.user) &
176+
Q(type=Data.STARTING_KIT) &
177+
Q(competition__isnull=True) &
178+
Q(phase_starting_kit__isnull=True)
179+
).delete()
180+
181+
return Response({
182+
"success": True,
183+
"message": "Unused starting kits deleted successfully"
184+
})
185+
except Exception as e:
186+
logger.error(f"UNUSED STARTING KITS DELETION --- {e}")
187+
return Response({
188+
"success": False,
189+
"message": f"{e}"
190+
})
191+
192+
193+
@api_view(['DELETE'])
194+
def delete_unused_competition_bundles(request):
195+
try:
196+
Data.objects.filter(
197+
Q(created_by=request.user) &
198+
Q(type=Data.COMPETITION_BUNDLE) &
199+
Q(competition__isnull=True) &
200+
Q(competition_bundles__isnull=True)
201+
).delete()
202+
203+
return Response({
204+
"success": True,
205+
"message": "Unused competition bundles deleted successfully"
206+
})
207+
except Exception as e:
208+
logger.error(f"UNUSED COMPETITION BUNDLES DELETION --- {e}")
209+
return Response({
210+
"success": False,
211+
"message": f"{e}"
212+
})

src/static/js/ours/client.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,12 @@ CODALAB.api = {
392392
delete_failed_submissions: () => {
393393
return CODALAB.api.request('DELETE', `${URLS.API}delete_failed_submissions/`)
394394
},
395+
delete_unused_starting_kits: () => {
396+
return CODALAB.api.request('DELETE', `${URLS.API}delete_unused_starting_kits/`)
397+
},
398+
delete_unused_competition_bundles: () => {
399+
return CODALAB.api.request('DELETE', `${URLS.API}delete_unused_competition_bundles/`)
400+
},
395401
/*---------------------------------------------------------------------
396402
User Account
397403
---------------------------------------------------------------------*/

src/static/riot/quota_management.tag

Lines changed: 73 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,26 @@
5454
</button>
5555
</td>
5656
</tr>
57+
<!-- Unused Starting Kits -->
58+
<tr>
59+
<td>Unused Starting Kits <span show="{unused_starting_kits > 0}">(<b>{unused_starting_kits}</b>)</span></td>
60+
<td>
61+
<button class="ui red right floated labeled icon button {disabled: unused_starting_kits === 0}" onclick="{delete_unused_starting_kits}">
62+
<i class="icon trash"></i>
63+
Delete unused starting kits
64+
</button>
65+
</td>
66+
</tr>
67+
<!-- Unused Competition Bundles -->
68+
<tr>
69+
<td>Unused Competition Bundles <span show="{unused_competition_bundles > 0}">(<b>{unused_competition_bundles}</b>)</span></td>
70+
<td>
71+
<button class="ui red right floated labeled icon button {disabled: unused_competition_bundles === 0}" onclick="{delete_unused_competition_bundles}">
72+
<i class="icon trash"></i>
73+
Delete unused competition bundles
74+
</button>
75+
</td>
76+
</tr>
5777
</tbody>
5878

5979
</table>
@@ -66,6 +86,8 @@
6686
self.unused_datasets_programs = 0
6787
self.unused_submissions = 0
6888
self.failed_submissions = 0
89+
self.unused_starting_kits = 0
90+
self.unused_competition_bundles = 0
6991
self.quota = 0
7092
self.storage_used = 0
7193

@@ -84,6 +106,8 @@
84106
self.unused_datasets_programs = data.unused_datasets_programs
85107
self.unused_submissions = data.unused_submissions
86108
self.failed_submissions = data.failed_submissions
109+
self.unused_starting_kits = data.unused_starting_kits
110+
self.unused_competition_bundles = data.unused_competition_bundles
87111
self.update()
88112
})
89113
.fail(function (response) {
@@ -119,7 +143,7 @@
119143
self.update()
120144
CODALAB.events.trigger('reload_tasks')
121145
CODALAB.events.trigger('reload_datasets')
122-
self.get_cleanup()
146+
CODALAB.events.trigger('reload_quota_cleanup')
123147
}else{
124148
toastr.error(data.message)
125149
}
@@ -141,6 +165,7 @@
141165
toastr.success(data.message)
142166
self.update()
143167
CODALAB.events.trigger('reload_datasets')
168+
CODALAB.events.trigger('reload_quota_cleanup')
144169
}else{
145170
toastr.error(data.message)
146171
}
@@ -162,6 +187,7 @@
162187
toastr.success(data.message)
163188
self.update()
164189
CODALAB.events.trigger('reload_submissions')
190+
CODALAB.events.trigger('reload_quota_cleanup')
165191
}else{
166192
toastr.error(data.message)
167193
}
@@ -183,6 +209,7 @@
183209
toastr.success(data.message)
184210
self.update()
185211
CODALAB.events.trigger('reload_submissions')
212+
CODALAB.events.trigger('reload_quota_cleanup')
186213
}else{
187214
toastr.error(data.message)
188215
}
@@ -193,6 +220,51 @@
193220
}
194221
}
195222

223+
// Delete unused starting kits
224+
self.delete_unused_starting_kits = function(){
225+
if (confirm(`Are you sure you want to permanently delete all unused starting kits?`)) {
226+
227+
CODALAB.api.delete_unused_starting_kits()
228+
.done(function (data) {
229+
if(data.success){
230+
self.unused_starting_kits = 0
231+
toastr.success(data.message)
232+
self.update()
233+
CODALAB.events.trigger('reload_datasets')
234+
CODALAB.events.trigger('reload_quota_cleanup')
235+
}else{
236+
toastr.error(data.message)
237+
}
238+
})
239+
.fail(function (response) {
240+
toastr.error("Unused starting kits deletion failed!")
241+
})
242+
}
243+
}
244+
245+
// Delete unused competition bundles
246+
self.delete_unused_competition_bundles = function(){
247+
if (confirm(`Are you sure you want to permanently delete all unused competition bundles?`)) {
248+
249+
CODALAB.api.delete_unused_competition_bundles()
250+
.done(function (data) {
251+
if(data.success){
252+
self.unused_competition_bundles = 0
253+
toastr.success(data.message)
254+
self.update()
255+
CODALAB.events.trigger('reload_competition_bundles')
256+
CODALAB.events.trigger('reload_quota_cleanup')
257+
}else{
258+
toastr.error(data.message)
259+
}
260+
})
261+
.fail(function (response) {
262+
toastr.error("Unused starting kits deletion failed!")
263+
})
264+
}
265+
}
266+
267+
196268
CODALAB.events.on('reload_quota_cleanup', self.get_cleanup)
197269

198270
</script>

0 commit comments

Comments
 (0)