Skip to content

Commit

Permalink
Include deleted_by field to the attachments models
Browse files Browse the repository at this point in the history
Make changes as requested from revies
Update failing tests
  • Loading branch information
WinnyTroy committed Feb 12, 2020
1 parent 9668dc0 commit a745a4d
Show file tree
Hide file tree
Showing 5 changed files with 39 additions and 12 deletions.
10 changes: 7 additions & 3 deletions onadata/apps/api/tests/viewsets/test_attachment_viewset.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,8 @@ def test_list_view_surfaces_current_attachment(self):
self.assertEqual(len(response.data), 5)

# test when the attachment is soft deleted
self.attachment.soft_delete(user=self.user)
Attachment.soft_delete(
Attachment.objects.filter(pk=self.attachment.pk), user=self.user)

request = self.factory.get('/', **self.extra)
response = self.list_view(request)
Expand All @@ -244,10 +245,13 @@ def test_soft_delete_action_returns_correct_user(self):
self.assertEqual(len(response.data), 1)

# test when the attachment is soft deleted
self.attachment.soft_delete(user=self.user)
Attachment.soft_delete(
Attachment.objects.filter(pk=self.attachment.pk), user=self.user)

self.attachment.refresh_from_db()

# Test that deleted_by field captures the right user
self.assertTrue(self.attachment.deleted_by, self.user)
self.assertEqual(self.attachment.deleted_by, self.user)

request = self.factory.get('/', **self.extra)
response = self.list_view(request)
Expand Down
21 changes: 21 additions & 0 deletions onadata/apps/logger/migrations/0059_attachment_deleted_by.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 2.1.7 on 2020-02-12 08:35

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


class Migration(migrations.Migration):

dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('logger', '0058_auto_20191211_0900'),
]

operations = [
migrations.AddField(
model_name='attachment',
name='deleted_by',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='deleted_attachments', to=settings.AUTH_USER_MODEL),
),
]
13 changes: 8 additions & 5 deletions onadata/apps/logger/models/attachment.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

from django.db import models
from django.utils import timezone
from django.contrib.auth.models import User


def get_original_filename(filename):
Expand Down Expand Up @@ -53,6 +54,8 @@ class Attachment(models.Model):
deleted_at = models.DateTimeField(null=True, default=None)
file_size = models.PositiveIntegerField(default=0)
name = models.CharField(max_length=100, null=True, blank=True)
deleted_by = models.ForeignKey(User, related_name='deleted_attachments',
null=True, on_delete=models.SET_NULL)

class Meta:
app_label = 'logger'
Expand Down Expand Up @@ -88,11 +91,11 @@ def filename(self):
if self.media_file:
return os.path.basename(self.media_file.name)

def soft_delete(self, user=None):
@classmethod
def soft_delete(cls, queryset, user=None):
"""
Soft deletes an attachment by adding a deleted_at timestamp.
"""
self.deleted_at = timezone.now()
if user is not None:
self.deleted_by = user
self.save()
queryset.update(deleted_at=timezone.now())
if user:
queryset.update(deleted_by=user)
2 changes: 1 addition & 1 deletion onadata/apps/logger/models/instance.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@ def _get_attachments_from_instance(instance):
attachment['id'] = a.id
attachments.append(attachment)

if isinstance(a.deleted_at, datetime):
if a.deleted_at:
attachment['deleted_at'] = a.deleted_at.strftime(MONGO_STRFTIME)

return attachments
Expand Down
5 changes: 2 additions & 3 deletions onadata/libs/utils/logger_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -243,9 +243,8 @@ def save_attachments(xform, instance, media_files):
mimetype=content_type,
name=filename,
extension=extension)
Attachment.objects.filter(instance=instance).filter(
~Q(name__in=instance.get_expected_media())).update(
deleted_at=timezone.now())
Attachment.soft_delete(Attachment.objects.filter(instance=instance).filter(
~Q(name__in=instance.get_expected_media())))

update_attachment_tracking(instance)

Expand Down

0 comments on commit a745a4d

Please sign in to comment.