Skip to content
This repository was archived by the owner on Feb 4, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from 13 commits
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
625482a
:sparkles: Initial commit for importer models
evict Jan 11, 2019
3db638d
:art: Using newly created models and basic log
evict Jan 11, 2019
fc20123
:sparkles: Added basic security logger
evict Jan 11, 2019
cf3e487
:sparkles: Added ImporterFriend models
evict Jan 26, 2019
f5d169b
:white_check_mark: Adding tests for importer model
evict Jan 26, 2019
d9d3bc2
:sparkles: Added importer models to view
evict Jan 26, 2019
fd81a2a
:rocket: Migrations...
evict Jan 26, 2019
61a237d
:white_check_mark: Archive for importer test
evict Jan 26, 2019
a0c9843
:sparkles: Added deletion of archives
evict Feb 2, 2019
64b562b
:sparkles: Deleting archives using user model
evict Feb 2, 2019
04d86d2
:rocket: Migrations added
evict Feb 8, 2019
34d6624
:white_check_mark: Adding import deleted test
evict Feb 8, 2019
50a1fbe
:wrench: Changing security log -> syslog
evict Feb 8, 2019
b00bb95
:bug: Fixing serializer bug
evict Feb 8, 2019
3ebb620
:sparkles: Changes to parser, serializers, tests and views
evict Feb 8, 2019
1a0c798
:sparkles: Added image processing 'imagekit'
evict Feb 9, 2019
eefb3f2
:sparkles: Working with UUID for public usage
evict Feb 9, 2019
0ea5ef8
:white_check_mark: Tests for new ImportedItem(s) view and UUIDs
evict Feb 9, 2019
46d74a7
:package: Added imagekit
evict Feb 9, 2019
b58a397
:sparkles: Get posts property added
evict Feb 9, 2019
be5e82d
:card_file_box: Adding migrations
evict Feb 9, 2019
cf48fe1
:wheelchair: Using validated data for zipfile
evict Feb 9, 2019
2f97590
:wheelchair: Using ApiMessageResponse
evict Feb 9, 2019
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
13 changes: 12 additions & 1 deletion openbook/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,19 @@
'console': {
# exact format is not important, this is the minimum information
'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
}
},
'security': {
'format': '%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'formatter': 'console',
},
'file': {
'class': 'logging.StreamHandler',
'formatter': 'console',
}
},
'loggers': {
Expand All @@ -44,6 +51,10 @@
'level': 'INFO',
'handlers': ['console'],
},
'security': {
'level': 'INFO',
'handlers': ['console'],
},
},
})

Expand Down
6 changes: 4 additions & 2 deletions openbook/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
from openbook_posts.views.post.views import PostComments, PostCommentItem, PostItem, PostReactions, PostReactionItem, \
PostReactionsEmojiCount, PostReactionEmojiGroups
from openbook_posts.views.posts.views import Posts, TrendingPosts
from openbook_importer.views import ImportItem
from openbook_importer.views import ImportItem, ImportedItem, ImportedItems

auth_patterns = [
path('register/', Register.as_view(), name='register-user'),
Expand Down Expand Up @@ -88,7 +88,9 @@
]

importer_patterns = [
path('upload/', ImportItem.as_view(), name='uploads')
path('upload/', ImportItem.as_view(), name='uploads'),
path('archives/', ImportedItems.as_view(), name='imported-archives'),
path('archives/<int:archive_id>', ImportedItem.as_view(), name='imported-archive'),
]

api_patterns = [
Expand Down
13 changes: 13 additions & 0 deletions openbook_auth/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -335,6 +335,9 @@ def has_reacted_to_post_with_id(self, post_id, emoji_id=None):
def has_commented_post_with_id(self, post_id):
return self.posts_comments.filter(post_id=post_id).count() > 0

def has_archive_with_id(self, archive_id):
return self.imports.filter(id=archive_id).exists()

def get_lists_for_follow_for_user_with_id(self, user_id):
self._check_is_following_user_with_id(user_id)
follow = self.get_follow_for_user_with_id(user_id)
Expand Down Expand Up @@ -880,6 +883,10 @@ def get_connection_for_user_with_id(self, user_id):
def get_follow_for_user_with_id(self, user_id):
return self.follows.get(followed_user_id=user_id)

def delete_archive_with_id(self, archive_id):
archive = self._check_can_delete_archive_with_id(archive_id)
return self.imports.filter(id=archive_id).delete()

def _make_get_post_with_id_query_for_user(self, user, post_id):
posts_query = self._make_get_posts_query_for_user(user)
posts_query.add(Q(id=post_id), Q.AND)
Expand Down Expand Up @@ -1218,6 +1225,12 @@ def _check_list_name_not_taken(self, list_name):
_('You already have a list with that name.'),
)

def _check_can_delete_archive_with_id(self, archive_id):
if not self.has_archive_with_id(archive_id):
raise ValidationError(
_('Can\'t delete an archive that does not belong to you.'),
)


@receiver(post_save, sender=settings.AUTH_USER_MODEL)
def create_auth_token(sender, instance=None, created=False, **kwargs):
Expand Down
31 changes: 31 additions & 0 deletions openbook_importer/migrations/0001_initial.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
# Generated by Django 2.1.5 on 2019-01-11 17:42

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


class Migration(migrations.Migration):

initial = True

dependencies = [
('openbook_posts', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='Import',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(editable=False)),
],
),
migrations.CreateModel(
name='ImportedPost',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('data_import', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='imported_posts', to='openbook_importer.Import')),
('post', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='openbook_posts.Post')),
],
),
]
25 changes: 25 additions & 0 deletions openbook_importer/migrations/0002_importedfriend.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Generated by Django 2.1.5 on 2019-01-18 19:57

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),
('openbook_importer', '0001_initial'),
]

operations = [
migrations.CreateModel(
name='ImportedFriend',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('friend_hash', models.CharField(max_length=64, unique=True)),
('data_import', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='friend_import', to='openbook_importer.Import')),
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='imported_friends', to=settings.AUTH_USER_MODEL)),
],
),
]
34 changes: 34 additions & 0 deletions openbook_importer/migrations/0003_auto_20190125_1216.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
# Generated by Django 2.1.5 on 2019-01-25 11:16

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),
('openbook_importer', '0002_importedfriend'),
]

operations = [
migrations.RemoveField(
model_name='importedfriend',
name='data_import',
),
migrations.RemoveField(
model_name='importedfriend',
name='user',
),
migrations.AddField(
model_name='importedfriend',
name='user1',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='imported_friends', to=settings.AUTH_USER_MODEL),
),
migrations.AddField(
model_name='importedfriend',
name='user2',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='connected_friend', to=settings.AUTH_USER_MODEL),
),
]
21 changes: 21 additions & 0 deletions openbook_importer/migrations/0004_import_user.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# Generated by Django 2.1.5 on 2019-02-02 12:20

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),
('openbook_importer', '0003_auto_20190125_1216'),
]

operations = [
migrations.AddField(
model_name='import',
name='user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='import_owner', to=settings.AUTH_USER_MODEL),
),
]
20 changes: 20 additions & 0 deletions openbook_importer/migrations/0005_auto_20190202_1644.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 2.1.5 on 2019-02-02 15:44

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


class Migration(migrations.Migration):

dependencies = [
('openbook_importer', '0004_import_user'),
]

operations = [
migrations.AlterField(
model_name='import',
name='user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to=settings.AUTH_USER_MODEL),
),
]
20 changes: 20 additions & 0 deletions openbook_importer/migrations/0006_auto_20190202_1647.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 2.1.5 on 2019-02-02 15:47

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


class Migration(migrations.Migration):

dependencies = [
('openbook_importer', '0005_auto_20190202_1644'),
]

operations = [
migrations.AlterField(
model_name='import',
name='user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL),
),
]
20 changes: 20 additions & 0 deletions openbook_importer/migrations/0007_auto_20190202_1848.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
# Generated by Django 2.1.5 on 2019-02-02 17:48

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


class Migration(migrations.Migration):

dependencies = [
('openbook_importer', '0006_auto_20190202_1647'),
]

operations = [
migrations.AlterField(
model_name='import',
name='user',
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='imports', to=settings.AUTH_USER_MODEL),
),
]
Empty file.
94 changes: 94 additions & 0 deletions openbook_importer/models.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
from django.db import models
from django.utils import timezone

from openbook_auth.models import User
from openbook_posts.models import Post


class Import(models.Model):

created = models.DateTimeField(editable=False)
user = models.ForeignKey(User, on_delete=models.CASCADE,
related_name='imports', null=True)

@classmethod
def create_import(cls, user):
imported = Import.objects.create(user=user)

return imported

def save(self, *args, **kwargs):
''' On save, update timestamps '''
if not self.id and not self.created:
self.created = timezone.now()

return super(Import, self).save(*args, **kwargs)


class ImportedPost(models.Model):

data_import = models.ForeignKey(Import, on_delete=models.CASCADE,
related_name='imported_posts')
post = models.ForeignKey(Post, on_delete=models.CASCADE)

@classmethod
def create_imported_post(cls, post, data_import):
imported_post = ImportedPost.objects.create(post=post,
data_import=data_import)

return imported_post


class ImportedFriend(models.Model):

# check if both uid fields are null, delete row
friend_hash = models.CharField(max_length=64, unique=True)
user1 = models.ForeignKey(User, on_delete=models.SET_NULL,
related_name='imported_friends',
null=True)
user2 = models.ForeignKey(User, on_delete=models.SET_NULL,
related_name='connected_friend',
null=True)

@classmethod
def find_friend(cls, friend_hash, user):

friend = ImportedFriend.objects.filter(friend_hash=friend_hash)
Copy link
Member

Choose a reason for hiding this comment

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

if there's going to be multiple friends, call it friends... if not you can use ImportedFriend.objects.get to get just one then you dont have to use friend[0] .. Also the get method raises a ImportedFriend.DoesNotExist error if nothing is found,


if friend.exists():
friend = friend[0]

if friend.user1_id == user.pk and friend.user2_id:

Choose a reason for hiding this comment

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

Consider simplifying this complex logical expression.

return True

elif friend.user2_id == user.pk and friend.user1_id:
return True

elif friend.user1_id == user.pk and not friend.user2_id:
return True

elif friend.user2_id == user.pk and not friend.user1_id:
return True

elif not friend.user1_id and friend.user2_id != user.pk:
friend.user1 = user
friend.save()

return True

Choose a reason for hiding this comment

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

Avoid too many return statements within this function.


elif not friend.user2_id and friend.user1_id != user.pk:
friend.user2 = user
friend.save()

return True

Choose a reason for hiding this comment

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

Avoid too many return statements within this function.

Copy link
Member

Choose a reason for hiding this comment

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

I assume the find_friend function here is looking for diff combinations where the two were already friends on facebook and if yes it saves the relationship.. so do we really need to return anything here? Also its not clear who we are finding friends for.. the user looking through the hash, or the hash looking into the user....
maybe consider renaming to find_friend_for_user ..


else:
return False

Choose a reason for hiding this comment

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

Avoid too many return statements within this function.


@classmethod
def create_imported_friend(cls, friend_hash, user1):
imported_friend = ImportedFriend.objects.create(
friend_hash=friend_hash,
user1=user1)

return imported_friend
11 changes: 11 additions & 0 deletions openbook_importer/serializers.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,18 @@
from rest_framework import serializers
from openbook_importer.models import Import


class ZipfileSerializer(serializers.Serializer):

serializers.FileField(max_length=20, required=True,
allow_empty_file=False)


class ImportSerializer(serializers.ModelSerializer):

class Meta:
model = Import
fields = (
'id',
'created'
)
Binary file added openbook_importer/tests/facebook-jayjay6.zip
Binary file not shown.
Loading