Skip to content

Commit 4b8263e

Browse files
committed
Add a folder property to feeds
1 parent 754dc36 commit 4b8263e

File tree

4 files changed

+49
-9
lines changed

4 files changed

+49
-9
lines changed
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 4.2.5 on 2024-03-28 19:29
2+
3+
from django.db import migrations, models
4+
import django.db.models.deletion
5+
6+
7+
class Migration(migrations.Migration):
8+
9+
dependencies = [
10+
('core', '0006_remove_chrislinkfile_is_folder_and_more'),
11+
('feeds', '0011_feed_public'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='feed',
17+
name='folder',
18+
field=models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='feed', to='core.chrisfolder'),
19+
),
20+
]

chris_backend/feeds/models.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11

22
from django.db import models
3+
from django.db.models.signals import post_delete
4+
from django.dispatch import receiver
35

46
import django_filters
57
from django_filters.rest_framework import FilterSet
68

9+
from core.models import ChrisFolder
710
from userfiles.models import UserFile
811

912

@@ -12,6 +15,8 @@ class Feed(models.Model):
1215
modification_date = models.DateTimeField(auto_now_add=True)
1316
name = models.CharField(max_length=200, blank=True, db_index=True)
1417
public = models.BooleanField(blank=True, default=False, db_index=True)
18+
folder = models.OneToOneField(ChrisFolder, on_delete=models.CASCADE, null=True,
19+
related_name='feed')
1520
owner = models.ManyToManyField('auth.User', related_name='feed')
1621

1722
class Meta:
@@ -51,6 +56,11 @@ def get_plugin_instances_status_count(self, status):
5156
return self.plugin_instances.filter(status=status).count()
5257

5358

59+
@receiver(post_delete, sender=Feed)
60+
def auto_delete_folder_with_feed(sender, instance, **kwargs):
61+
instance.folder.delete()
62+
63+
5464
class FeedFilter(FilterSet):
5565
min_id = django_filters.NumberFilter(field_name="id", lookup_expr='gte')
5666
max_id = django_filters.NumberFilter(field_name="id", lookup_expr='lte')
@@ -83,7 +93,7 @@ def filter_by_fname_icontains(self, queryset, name, value):
8393
qs_l = []
8494

8595
for feed in queryset:
86-
qs = UserFile.objects.filter(fname__contains=f'/feeds/feed_{feed.id}/')
96+
qs = UserFile.objects.filter(fname__startswith=feed.folder.path)
8797
for val in value_l:
8898
qs = qs.filter(fname__icontains=val)
8999
qs_l.append(qs)
@@ -94,9 +104,8 @@ def filter_by_fname_icontains(self, queryset, name, value):
94104
for f in files_qs:
95105
path = f.fname.name
96106
path_tokens = path.split('/', 4)
97-
if path_tokens[2] == 'feeds':
98-
feed_id = int(path_tokens[3].split('_')[1])
99-
feed_ids.add(feed_id)
107+
feed_id = int(path_tokens[3].split('_')[1])
108+
feed_ids.add(feed_id)
100109

101110
return queryset.filter(pk__in=list(feed_ids))
102111

chris_backend/feeds/serializers.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ def validate_feed(self, feed_id):
9292

9393
class FeedSerializer(serializers.HyperlinkedModelSerializer):
9494
creator_username = serializers.SerializerMethodField()
95+
folder_path = serializers.ReadOnlyField(source='folder.path')
9596
created_jobs = serializers.SerializerMethodField()
9697
waiting_jobs = serializers.SerializerMethodField()
9798
scheduled_jobs = serializers.SerializerMethodField()
@@ -100,6 +101,8 @@ class FeedSerializer(serializers.HyperlinkedModelSerializer):
100101
finished_jobs = serializers.SerializerMethodField()
101102
errored_jobs = serializers.SerializerMethodField()
102103
cancelled_jobs = serializers.SerializerMethodField()
104+
folder = serializers.HyperlinkedRelatedField(view_name='chrisfolder-detail',
105+
read_only=True)
103106
note = serializers.HyperlinkedRelatedField(view_name='note-detail', read_only=True)
104107
tags = serializers.HyperlinkedIdentityField(view_name='feed-tag-list')
105108
taggings = serializers.HyperlinkedIdentityField(view_name='feed-tagging-list')
@@ -112,10 +115,10 @@ class FeedSerializer(serializers.HyperlinkedModelSerializer):
112115
class Meta:
113116
model = Feed
114117
fields = ('url', 'id', 'creation_date', 'modification_date', 'name', 'public',
115-
'creator_username', 'created_jobs', 'waiting_jobs', 'scheduled_jobs',
116-
'started_jobs', 'registering_jobs', 'finished_jobs', 'errored_jobs',
117-
'cancelled_jobs', 'owner', 'note', 'tags', 'taggings', 'comments',
118-
'plugin_instances')
118+
'creator_username', 'folder_path', 'created_jobs', 'waiting_jobs',
119+
'scheduled_jobs', 'started_jobs', 'registering_jobs',
120+
'finished_jobs', 'errored_jobs', 'cancelled_jobs', 'folder', 'note',
121+
'tags', 'taggings', 'comments', 'plugin_instances', 'owner')
119122

120123
def validate_name(self, name):
121124
"""

chris_backend/plugininstances/models.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,13 @@ def _save_feed(self):
9999
feed = Feed()
100100
feed.name = self.title or self.plugin.meta.name
101101
feed.save()
102+
103+
# feed's folder path: SWIFT_CONTAINER_NAME/home/<username>/feeds/feed_<id>
104+
feed_folder_path = f'home/{self.owner.username}/feeds/feed_{feed.id}'
105+
folder = ChrisFolder(path=feed_folder_path, owner=self.owner)
106+
folder.save()
107+
108+
feed.folder = folder
102109
feed.owner.set([self.owner])
103110
feed.save()
104111
return feed
@@ -187,7 +194,8 @@ def get_output_path(self):
187194

188195
@receiver(post_delete, sender=PluginInstance)
189196
def auto_delete_output_folder_with_plugin_instance(sender, instance, **kwargs):
190-
instance.output_folder.delete()
197+
if instance.output_folder:
198+
instance.output_folder.delete()
191199

192200

193201
class PluginInstanceFilter(FilterSet):

0 commit comments

Comments
 (0)