Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
4,225 changes: 1,444 additions & 2,781 deletions gateway/package-lock.json

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
# Generated by Django 4.2.26 on 2025-11-25 20:50
Copy link

Copilot AI Feb 2, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The migration timestamp indicates a future date: "2025-11-25 20:50". This appears to be incorrect as the current date context indicates it's February 2, 2026. Migration timestamps should reflect when they were actually generated. This should be updated to the correct date when the migration was created.

Suggested change
# Generated by Django 4.2.26 on 2025-11-25 20:50
# Generated by Django 4.2.26

Copilot uses AI. Check for mistakes.

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

def convert_version_to_integer(apps, schema_editor):
"""Convert empty string versions to 1 before changing field type."""
Dataset = apps.get_model('api_methods', 'Dataset')
# Update all datasets with empty or invalid version strings to default value of 1
for dataset in Dataset.objects.all():
if not dataset.version or dataset.version.strip() == '':
dataset.version = '1'
dataset.save(update_fields=['version'])

class Migration(migrations.Migration):

dependencies = [
('api_methods', '0019_capture_datasets_file_captures_file_datasets_and_more'),
]

operations = [
migrations.AddField(
model_name='dataset',
name='previous_version',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='next_version', to='api_methods.dataset'),
),
migrations.RunPython(convert_version_to_integer, migrations.RunPython.noop),
migrations.AlterField(
model_name='dataset',
name='version',
field=models.IntegerField(default=1),
),
]
Original file line number Diff line number Diff line change
@@ -1 +1 @@
0019_capture_datasets_file_captures_file_datasets_and_more
0020_dataset_previous_version_alter_dataset_version
20 changes: 19 additions & 1 deletion gateway/sds_gateway/api_methods/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -683,7 +683,14 @@ class Dataset(BaseModel):
institutions = models.TextField(blank=True)
release_date = models.DateTimeField(blank=True, null=True)
repository = models.URLField(blank=True)
version = models.CharField(max_length=255, blank=True)
version = models.IntegerField(default=1)
previous_version = models.ForeignKey(
"self",
on_delete=models.PROTECT,
blank=True,
null=True,
related_name="next_version",
)
website = models.URLField(blank=True)
provenance = models.JSONField(blank=True, null=True)
citation = models.JSONField(blank=True, null=True)
Expand Down Expand Up @@ -1087,6 +1094,17 @@ def user_can_share(cls, user: "User", item_uuid: uuid.UUID, item_type: str) -> b
PermissionLevel.CO_OWNER,
]

@classmethod
def user_can_advance_version(
cls, user: "User", item_uuid: uuid.UUID, item_type: str
) -> bool:
"""Check if user can advance the version of the item."""
permission_level = cls.get_user_permission_level(user, item_uuid, item_type)
return permission_level in [
PermissionLevel.OWNER,
PermissionLevel.CO_OWNER,
]


class DEPRECATEDPostProcessedData(BaseModel):
"""
Expand Down
25 changes: 25 additions & 0 deletions gateway/sds_gateway/api_methods/serializers/dataset_serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ class DatasetGetSerializer(serializers.ModelSerializer[Dataset]):
owner_email = serializers.SerializerMethodField()
permission_level = serializers.SerializerMethodField()
can_edit = serializers.SerializerMethodField()
can_advance_version = serializers.SerializerMethodField()

def get_authors(self, obj):
"""Return the full authors list using the model's get_authors_display method."""
Expand Down Expand Up @@ -162,6 +163,30 @@ def get_can_edit(self, obj):

return False

def get_can_advance_version(self, obj):
"""Check if the current user can advance the version of the dataset."""
request = self.context.get("request")
if not request or not hasattr(request, "user"):
return False

# Check if user is the owner
if obj.owner == request.user:
return True

# Check for shared permissions that allow advancing the version
permission = UserSharePermission.objects.filter(
shared_with=request.user,
item_type=ItemType.DATASET,
item_uuid=obj.uuid,
is_enabled=True,
is_deleted=False,
).first()

if permission:
return permission.permission_level in ["co-owner"]

return False

class Meta:
model = Dataset
fields = "__all__"
Loading
Loading