Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
e5b8cde
html comment fixed
May 25, 2023
b46ba69
repeated competitions in competitions api fixed
May 25, 2023
1c6e387
uploading a submission, show asterick with required only answers
May 25, 2023
706dd61
Merge pull request #891 from codalab/repeated_competitions
Didayolo May 25, 2023
47dde49
Merge pull request #892 from codalab/factsheet_required_fields
Didayolo May 25, 2023
a1e7923
do not show make private/public button to users who are not owner of …
May 25, 2023
d6b8f54
Remove console calls
Didayolo May 25, 2023
85bb4f7
Merge pull request #893 from codalab/delete_someones_datasets
Didayolo May 25, 2023
e60934b
Resources -> Datasets : fiel sizes added in readable format
May 26, 2023
baf083c
console log removed
May 26, 2023
b90f1a1
Update management.tag
Didayolo May 26, 2023
3ccbdb1
pagination fixed
May 26, 2023
a403128
Merge branch 'resource_interface_dataset_size' of https://github.com/…
May 26, 2023
61830da
Merge pull request #895 from codalab/resource_interface_dataset_size
Didayolo May 26, 2023
b522bed
Show competition name in Resources -> Datasets
May 27, 2023
ddd6566
filename added in request, test updated
May 27, 2023
60bf0c9
Dataset detail tile changed to file name
May 27, 2023
8fb185e
Use title and url of benchmark in job status page
Didayolo May 27, 2023
07a6edd
competition name is now a clickable link
May 27, 2023
f1ee291
competition name clickable in dataset detail
May 27, 2023
4727824
Merge pull request #896 from codalab/resource_interface_submission_be…
Didayolo May 27, 2023
1a656f2
Update management.tag
Didayolo May 27, 2023
ab9a0b1
Update management.tag
Didayolo May 27, 2023
818e72d
Merge pull request #897 from codalab/url-in-job-status
Didayolo May 27, 2023
021c87b
Merge pull request #898 from codalab/rename-datasets
Didayolo May 27, 2023
c75e058
separate tab for submissions
May 28, 2023
57fd675
Add Dataset changed to Add Dataset/Program
May 28, 2023
4d48e49
Add submission modal added
May 28, 2023
69bf79b
After login redirect to `next` page (#900)
ihsaan-ullah May 30, 2023
3955566
benchmark title instead of id in datasets detail
May 30, 2023
ac7801a
Tasks tab: benchmark is now clickable link
May 30, 2023
07aeb0a
Merge pull request #899 from codalab/resource_interface_separate_subm…
Didayolo May 30, 2023
ce98a1f
milliseconds -> seconds
Didayolo May 30, 2023
0e6f0a9
add option to show/hide public submissions/datasets
Jun 1, 2023
609e630
new filters added to show/hide public submissions and datasets/programs
Jun 1, 2023
3d90c2a
default filter added
Jun 1, 2023
96514bd
unused function removed
ihsaan-ullah Jun 1, 2023
a9b9cf4
delete button is now shown for own submissions and datasets/programs …
ihsaan-ullah Jun 1, 2023
f631cfa
Merge pull request #906 from codalab/resource_interface_public_submis…
Didayolo Jun 1, 2023
1ce4c53
Save leaderboard during manual creation of benchmark (#908)
Didayolo Jun 1, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions src/apps/api/serializers/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@ class Meta:
'created_by',
'data_file',
'was_created_by_competition',
'competition',
'file_name',
)
read_only_fields = (
'key',
Expand Down Expand Up @@ -71,6 +73,7 @@ class Meta:

class DataDetailSerializer(serializers.ModelSerializer):
created_by = serializers.CharField(source='created_by.username')
competition = serializers.SerializerMethodField()

class Meta:
model = Data
Expand All @@ -86,8 +89,20 @@ class Meta:
'was_created_by_competition',
'in_use',
'file_size',
'competition',
'file_name',
)

def get_competition(self, obj):

# return competition dict with id and title if available
if obj.competition:
return {
"id": obj.competition.id,
"title": obj.competition.title,
}
return None


class DataGroupSerializer(serializers.ModelSerializer):
class Meta:
Expand Down
8 changes: 7 additions & 1 deletion src/apps/api/serializers/tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from competitions.models import PhaseTaskInstance, Phase
from datasets.models import Data
from tasks.models import Task, Solution
from competitions.models import Competition


class SolutionSerializer(WritableNestedModelSerializer):
Expand Down Expand Up @@ -138,7 +139,12 @@ class Meta:
)

def get_competitions(self, instance):
return self.context['task_titles'][instance.pk]

# Fech competitions which hase phases with this task
# competitions = Phase.objects.filter(tasks__in=[instance.pk]).values('competition')
competitions = Competition.objects.filter(phases__tasks__in=[instance.pk]).values("id", "title").distinct()

return competitions

def get_shared_with(self, instance):
return self.context['shared_with'][instance.pk]
Expand Down
1 change: 1 addition & 0 deletions src/apps/api/tests/test_datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ def test_dataset_api_checks_duplicate_names_for_same_user(self):
'name': 'Test!',
'type': Data.COMPETITION_BUNDLE,
'request_sassy_file_name': faker.file_name(),
'file_name': faker.file_name(),
})

assert resp.status_code == 400
Expand Down
20 changes: 19 additions & 1 deletion src/apps/api/views/competitions.py
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,8 @@ def get_queryset(self):
qs = Competition.objects.filter(
(Q(created_by=self.request.user)) |
(Q(collaborators__in=[self.request.user]))
)
).distinct()

participating_in = self.request.query_params.get('participating_in', None)
if participating_in:
qs = qs.filter(participants__user=self.request.user, participants__status="approved")
Expand Down Expand Up @@ -155,6 +156,23 @@ def create(self, request, *args, **kwargs):
for index in range(len(phase['tasks'])):
phase['tasks'][index] = phase['tasks'][index]['task']

# TODO - This is Temporary. Need to change Leaderboard to Phase connect to M2M and handle this correctly.
# save leaderboard individually, then pass pk to each phase
print(f"{request.data['leaderboards']}")
data = request.data
if 'leaderboards' in data:
leaderboard_data = data['leaderboards'][0]
if(leaderboard_data['id']):
leaderboard_instance = Leaderboard.objects.get(id=leaderboard_data['id'])
leaderboard = LeaderboardSerializer(leaderboard_instance, data=data['leaderboards'][0])
else:
leaderboard = LeaderboardSerializer(data=data['leaderboards'][0])
leaderboard.is_valid()
leaderboard.save()
leaderboard_id = leaderboard["id"].value
for phase in data['phases']:
phase['leaderboard'] = leaderboard_id

serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
Expand Down
44 changes: 41 additions & 3 deletions src/apps/api/views/datasets.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,14 +20,51 @@
class DataViewSet(ModelViewSet):
queryset = Data.objects.all()
filter_backends = (DjangoFilterBackend, SearchFilter)
filter_fields = ('type', 'name', 'key', 'was_created_by_competition')
filter_fields = ('type', 'name', 'key', 'was_created_by_competition', 'is_public')
search_fields = ('name', 'description', 'key',)
pagination_class = BasicPagination

def get_queryset(self):
filters = Q(is_public=True) | Q(created_by=self.request.user)

qs = Data.objects.filter(filters)
if self.request.method == 'GET':

# new filters
# -----------

# _public = true if want to show public datasets/submissions
is_public = self.request.query_params.get('_public', 'false') == 'true'

# _type = submission if called from submissions tab to filter only submissions
is_submission = self.request.query_params.get('_type', '') == 'submission'

# _type = dataset if called from datasets and programs tab to filter datasets and programs
is_dataset = self.request.query_params.get('_type', '') == 'dataset'

# get queryset
qs = self.queryset

# filter submissions
if is_submission:
qs = qs.filter(Q(type=Data.SUBMISSION))

# filter datasets and programs
if is_dataset:
qs = qs.filter(~Q(type=Data.SUBMISSION))

# public filter check
if is_public:
qs = qs.filter(Q(created_by=self.request.user) | Q(is_public=True))
else:
qs = qs.filter(Q(created_by=self.request.user))

# if GET is called but provided no filters, fall back to default behaviour
if (not is_submission) and (not is_dataset) and (not is_public):
qs = self.queryset
qs = qs.filter(Q(is_public=True) | Q(created_by=self.request.user))

else:
qs = self.queryset
qs = qs.filter(Q(is_public=True) | Q(created_by=self.request.user))

qs = qs.exclude(Q(type=Data.COMPETITION_BUNDLE) | Q(name__isnull=True))

Expand All @@ -42,6 +79,7 @@ def get_serializer_class(self):
return serializers.DataSerializer

def create(self, request, *args, **kwargs):

serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
new_dataset = serializer.save() # request_sassy_file_name is temporarily set via this serializer
Expand Down
25 changes: 25 additions & 0 deletions src/apps/datasets/migrations/0005_auto_20230527_0837.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 2.2.17 on 2023-05-27 08:37

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('competitions', '0032_submission_worker_hostname'),
('datasets', '0004_data_deleted'),
]

operations = [
migrations.AddField(
model_name='data',
name='competition',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='submission', to='competitions.Competition'),
),
migrations.AddField(
model_name='data',
name='file_name',
field=models.CharField(default='', max_length=64),
),
]
19 changes: 19 additions & 0 deletions src/apps/datasets/migrations/0006_auto_20230528_0829.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 2.2.17 on 2023-05-28 08:29

from django.db import migrations, models
import django.db.models.deletion


class Migration(migrations.Migration):

dependencies = [
('datasets', '0005_auto_20230527_0837'),
]

operations = [
migrations.AlterField(
model_name='data',
name='competition',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='submission', to='competitions.Competition'),
),
]
6 changes: 5 additions & 1 deletion src/apps/datasets/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from chahub.models import ChaHubSaveMixin
from utils.data import PathWrapper
from utils.storage import BundleStorage
from competitions.models import Competition


class Data(ChaHubSaveMixin, models.Model):
Expand Down Expand Up @@ -57,6 +58,9 @@ class Data(ChaHubSaveMixin, models.Model):
# are NOT marked True, since they are not created by unpacking!
was_created_by_competition = models.BooleanField(default=False)

competition = models.ForeignKey(Competition, on_delete=models.PROTECT, null=True, related_name='submission')
file_name = models.CharField(max_length=64, default="")

def get_download_url(self):
return reverse('datasets:download', kwargs={'key': self.key})

Expand Down Expand Up @@ -84,7 +88,7 @@ def in_use(self):
Q(phases__tasks__input_data=self) |
Q(phases__tasks__reference_data=self) |
Q(phases__tasks__scoring_program=self)
).values_list('pk', flat=True).distinct()
).values('pk', 'title').distinct()
return competitions_in_use

def __str__(self):
Expand Down
12 changes: 11 additions & 1 deletion src/apps/profiles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,10 @@ def sign_up(request):

def log_in(request):

# Fectch next redirect page after login
# default : None
next = request.GET.get('next', None)

context = {}
context['chahub_signup_url'] = "{}/profiles/signup?next={}/social/login/chahub".format(
settings.SOCIAL_AUTH_CHAHUB_BASE_URL,
Expand All @@ -144,7 +148,13 @@ def log_in(request):
user = authenticate(username=username, password=password)
if user:
login(request, user)
return redirect('pages:home')

# if next is none redirect to home
# otherwise redirect to requested page
if next is None:
return redirect('pages:home')
else:
return redirect(next)
else:
messages.error(request, "Wrong Credentials!")
else:
Expand Down
1 change: 1 addition & 0 deletions src/static/js/ours/client.js
Original file line number Diff line number Diff line change
Expand Up @@ -153,6 +153,7 @@ CODALAB.api = {
create_dataset: function (metadata, data_file, progress_update_callback) {
// Pass the requested file name for the SAS url
metadata.request_sassy_file_name = data_file.name
metadata.file_name = data_file.name

// This will be set on successful dataset creation, then used to complete the dataset upload
var dataset = {}
Expand Down
7 changes: 4 additions & 3 deletions src/static/riot/competitions/detail/submission_upload.tag
Original file line number Diff line number Diff line change
Expand Up @@ -11,8 +11,8 @@
<h2>Metadata or Fact Sheet</h2>
<div class="submission-form-question" each="{ question in opts.fact_sheet }">
<span if="{ question.type === 'text' }">
<label if="{question.is_required}" class="required-answer" for="{ question.key }">{ question.title }:</label>
<label if="{!question.is_required}" for="{ question.key }">{ question.title }:</label>
<label if="{question.is_required == 'true'}" class="required-answer" for="{ question.key }">{ question.title }:</label>
<label if="{question.is_required == 'false'}" for="{ question.key }">{ question.title }:</label>
<input type="text" name="{ question.key }">
</span>
<span if="{ question.type === 'checkbox' }">
Expand Down Expand Up @@ -413,7 +413,8 @@
task_ids_to_run = [self.selected_tasks[0].id]
}
var data_file_metadata = {
type: 'submission'
type: 'submission',
competition: self.opts.competition.id
}
var data_file = self.refs.data_file.refs.file_input.files[0]
self.children = []
Expand Down
2 changes: 1 addition & 1 deletion src/static/riot/competitions/editor/_phases.tag
Original file line number Diff line number Diff line change
Expand Up @@ -112,7 +112,7 @@
<div class="three fields">
<div class="field">
<label>
Execution Time Limit <span data-tooltip="In milliseconds, 600ms default if unset"
Execution Time Limit <span data-tooltip="In seconds, 600s default if unset"
data-inverted=""
data-position="bottom center">
<i class="help icon circle"></i></span>
Expand Down
Loading