Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #29 from mbegel/app_chat
App chat
- Loading branch information
Showing
28 changed files
with
1,540 additions
and
192 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
from django.contrib import admin | ||
|
||
# Register your models here. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,5 @@ | ||
from django.apps import AppConfig | ||
|
||
|
||
class SigmaChatConfig(AppConfig): | ||
name = 'sigma_chat' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
# -*- coding: utf-8 -*- | ||
# Generated by Django 1.9 on 2016-10-04 09:37 | ||
from __future__ import unicode_literals | ||
|
||
from django.conf import settings | ||
from django.db import migrations, models | ||
import django.db.models.deletion | ||
import sigma_chat.models.message | ||
|
||
|
||
class Migration(migrations.Migration): | ||
|
||
initial = True | ||
|
||
dependencies = [ | ||
migrations.swappable_dependency(settings.AUTH_USER_MODEL), | ||
] | ||
|
||
operations = [ | ||
migrations.CreateModel( | ||
name='Chat', | ||
fields=[ | ||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('name', models.CharField(max_length=50)), | ||
], | ||
), | ||
migrations.CreateModel( | ||
name='ChatMember', | ||
fields=[ | ||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('is_creator', models.BooleanField()), | ||
('is_admin', models.BooleanField()), | ||
('is_member', models.BooleanField(default=True)), | ||
('is_banned', models.BooleanField(default=False)), | ||
('chat', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chatmember', to='sigma_chat.Chat')), | ||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='user_chatmember', to=settings.AUTH_USER_MODEL)), | ||
], | ||
), | ||
migrations.CreateModel( | ||
name='Message', | ||
fields=[ | ||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), | ||
('text', models.TextField(blank=True)), | ||
('date', models.DateTimeField(auto_now=True)), | ||
('attachment', models.FileField(blank=True, upload_to=sigma_chat.models.message.chat_directory_path)), | ||
('chat_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='message', to='sigma_chat.Chat')), | ||
('chatmember_id', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='chatmember_message', to='sigma_chat.ChatMember')), | ||
], | ||
), | ||
] |
Empty file.
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
# -*- coding: utf-8 -*- | ||
from django.db import models | ||
|
||
|
||
class Chat(models.Model): | ||
name = models.CharField(max_length=50) | ||
|
||
# Related fields : | ||
# - chatmember (model ChatMember.chat) | ||
# - message (model Message.chat) | ||
|
||
################################################################ | ||
# PERMISSIONS # | ||
################################################################ | ||
|
||
@staticmethod | ||
def has_read_permission(request): | ||
return True | ||
|
||
def has_object_read_permission(self, request): | ||
return request.user.is_chat_member(self) | ||
|
||
@staticmethod | ||
def has_write_permission(request): | ||
return True | ||
|
||
def has_object_write_permission(self, request): | ||
return request.user.is_chat_admin(self) | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# -*- coding: utf-8 -*- | ||
from django.db import models | ||
|
||
from sigma_chat.models.chat import Chat | ||
|
||
|
||
class ChatMember(models.Model): | ||
is_creator = models.BooleanField() | ||
is_admin = models.BooleanField() | ||
is_member = models.BooleanField(default=True) | ||
is_banned = models.BooleanField(default=False) | ||
user = models.ForeignKey('sigma_core.User', related_name='user_chatmember') | ||
chat = models.ForeignKey(Chat, related_name='chatmember') | ||
|
||
# Related fields : | ||
# - member_message (model Message.member) | ||
|
||
################################################################ | ||
# PERMISSIONS # | ||
################################################################ | ||
|
||
@staticmethod | ||
def has_read_permission(request): | ||
return True | ||
|
||
def has_object_read_permission(self, request): | ||
# Return True if user is the one of this ChatMember or if user is admin on the related chat | ||
return request.user.is_chat_member(self.chat) | ||
|
||
@staticmethod | ||
def has_write_permission(request): | ||
return True | ||
|
||
def has_object_write_permission(self, request): | ||
# Return True if user is the one of this ChatMember or if user is admin on the related chat | ||
return (not self.is_creator) and (request.user == self.user or request.user.is_chat_admin(self.chat)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# -*- coding: utf-8 -*- | ||
from django.db import models | ||
|
||
from sigma_chat.models.chat_member import ChatMember | ||
from sigma_chat.models.chat import Chat | ||
|
||
|
||
def chat_directory_path(instance, filename): | ||
# file will be uploaded to MEDIA_ROOT/user_<id>/<filename> | ||
return 'uploads/chats/{0}/{1}'.format(instance.chat_id.id, filename) | ||
|
||
|
||
class Message(models.Model): | ||
text = models.TextField(blank=True) | ||
chatmember_id = models.ForeignKey(ChatMember, related_name='chatmember_message') | ||
chat_id = models.ForeignKey(Chat, related_name='message') | ||
date = models.DateTimeField(auto_now=True) | ||
attachment = models.FileField(upload_to=chat_directory_path, blank=True) | ||
|
||
################################################################ | ||
# PERMISSIONS # | ||
################################################################ | ||
|
||
@staticmethod | ||
def has_read_permission(request): | ||
return True | ||
|
||
def has_object_read_permission(self, request): | ||
return request.user.is_member(self.chat) | ||
|
||
@staticmethod | ||
def has_write_permission(request): | ||
return True | ||
|
||
def has_object_write_permission(self, request): | ||
return request.user == self.chatmember.user and self.chatmember.is_member |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,28 @@ | ||
# -*- coding: utf-8 -*- | ||
from rest_framework import serializers | ||
|
||
from sigma_chat.models.chat import Chat | ||
from sigma_chat.models.chat_member import ChatMember | ||
from sigma_core.models.user import User | ||
|
||
class ChatSerializer(serializers.ModelSerializer): | ||
""" | ||
Serialize ChatMember model. | ||
""" | ||
class Meta: | ||
model = Chat | ||
|
||
def create(self, data): | ||
chat = Chat(**data) | ||
if 'user' in self.initial_data: | ||
try: | ||
user = User.objects.get(pk=self.initial_data['user']) | ||
chat.save() | ||
creator = ChatMember(user=user, is_creator=True, is_admin=True, chat=chat) | ||
creator.save() | ||
chat.chatmember.add(creator) | ||
chat.save() | ||
return chat | ||
except User.DoesNotExist: | ||
return None | ||
return None |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# -*- coding: utf-8 -*- | ||
from rest_framework import serializers | ||
|
||
from sigma_chat.models.chat_member import ChatMember | ||
|
||
class ChatMemberSerializer(serializers.ModelSerializer): | ||
""" | ||
Serialize ChatMember model. | ||
""" | ||
class Meta: | ||
model = ChatMember | ||
exclude = ('user', 'chat') | ||
|
||
user_id = serializers.PrimaryKeyRelatedField(read_only=True, source="user") | ||
chat_id = serializers.PrimaryKeyRelatedField(read_only=True, source="chat") | ||
chatmember_message_id = serializers.PrimaryKeyRelatedField(read_only=True, many=True, source="chatmember_message") |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
# -*- coding: utf-8 -*- | ||
from rest_framework import serializers | ||
|
||
from sigma_chat.models.chat import Chat | ||
from sigma_chat.models.message import Message | ||
from sigma_core.models.user import User | ||
from rest_framework.serializers import ValidationError | ||
|
||
import requests | ||
import json | ||
|
||
class MessageSerializer(serializers.ModelSerializer): | ||
""" | ||
Serialize Message model. | ||
""" | ||
class Meta: | ||
model = Message | ||
|
||
def validate(self, data): | ||
if "chatmember_id" not in data: | ||
raise ValidationError("No user given.") | ||
if "chat_id" not in data: | ||
raise ValidationError("No chat given.") | ||
if data['chat_id'].id != data['chatmember_id'].chat.id: | ||
raise ValidationError("ChatMember not allowed to publish on this chat.") | ||
if (not "text" in data or data['text'] is None or data['text'] == "") and (not 'attachment' in data or data['attachment'] is None): | ||
raise ValidationError("You must send either a text or a file.") | ||
|
||
return data | ||
|
||
################################################################ | ||
# CHAT # | ||
################################################################ | ||
|
||
def save(self, *args, **kwargs): | ||
super(MessageSerializer, self).save(*args, **kwargs) | ||
""" | ||
NO_PROXY = { | ||
'no': 'pass', | ||
} | ||
message = {'message': json.dumps({ | ||
'chat':{'id': self.data['chat_id']}, | ||
'chatmember':{'id': self.data['chatmember_id']}, | ||
'text': self.data['text'], | ||
'attachment': self.data['attachment'], | ||
'date': self.data['date'] | ||
}) | ||
} | ||
requests.post('http://localhost:8000/tornado/chat/?secret_key=', data=message, proxies=NO_PROXY) | ||
""" |
Empty file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
import factory | ||
from faker import Factory as FakerFactory | ||
|
||
from sigma_core.tests.factories import UserFactory | ||
|
||
from sigma_chat.models.chat import Chat | ||
from sigma_chat.models.chat_member import ChatMember | ||
from sigma_chat.models.message import Message | ||
|
||
faker = FakerFactory.create('fr_FR') | ||
|
||
class ChatFactory(factory.django.DjangoModelFactory): | ||
class Meta: | ||
model = Chat | ||
|
||
name = factory.LazyAttribute(lambda obj: faker.name()) | ||
|
||
|
||
class ChatMemberFactory(factory.django.DjangoModelFactory): | ||
class Meta: | ||
model = ChatMember | ||
|
||
is_creator = False | ||
is_admin = False | ||
user = factory.SubFactory(UserFactory) | ||
chat = factory.SubFactory(ChatFactory) | ||
|
||
|
||
class MessageFactory(factory.django.DjangoModelFactory): | ||
class Meta: | ||
model = Message | ||
|
||
text = factory.LazyAttribute(lambda obj: faker.text()) | ||
chatmember_id = factory.SubFactory(ChatMemberFactory) | ||
chat_id = factory.SubFactory(ChatFactory) | ||
date = factory.LazyAttribute(lambda obj: faker.date()) | ||
attachment = "" |
Oops, something went wrong.