From 78fc91e9c3c568ea3bedcf4a93eb59796c0d0778 Mon Sep 17 00:00:00 2001 From: Zambom Date: Fri, 3 Feb 2017 17:18:53 -0200 Subject: [PATCH] Adding mural app and models --- amadeus/asgi.py | 5 +++++ amadeus/routing.py | 6 ++++++ amadeus/settings.py | 9 +++++++++ categories/migrations/0013_auto_20170203_1618.py | 21 +++++++++++++++++++++ mural/__init__.py | 0 mural/admin.py | 3 +++ mural/apps.py | 5 +++++ mural/consumers.py | 18 ++++++++++++++++++ mural/forms.py | 0 mural/migrations/0001_initial.py | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ mural/migrations/__init__.py | 0 mural/models.py | 42 ++++++++++++++++++++++++++++++++++++++++++ mural/tests.py | 3 +++ mural/urls.py | 0 mural/views.py | 3 +++ 15 files changed, 212 insertions(+), 0 deletions(-) create mode 100644 amadeus/asgi.py create mode 100644 amadeus/routing.py create mode 100644 categories/migrations/0013_auto_20170203_1618.py create mode 100644 mural/__init__.py create mode 100644 mural/admin.py create mode 100644 mural/apps.py create mode 100644 mural/consumers.py create mode 100644 mural/forms.py create mode 100644 mural/migrations/0001_initial.py create mode 100644 mural/migrations/__init__.py create mode 100644 mural/models.py create mode 100644 mural/tests.py create mode 100644 mural/urls.py create mode 100644 mural/views.py diff --git a/amadeus/asgi.py b/amadeus/asgi.py new file mode 100644 index 0000000..a85b588 --- /dev/null +++ b/amadeus/asgi.py @@ -0,0 +1,5 @@ +import os +import channels.asgi + +os.environ.setdefault("DJANGO_SETTINGS_MODULE", "amadeus.settings") +channel_layer = channels.asgi.get_channel_layer() \ No newline at end of file diff --git a/amadeus/routing.py b/amadeus/routing.py new file mode 100644 index 0000000..4512d74 --- /dev/null +++ b/amadeus/routing.py @@ -0,0 +1,6 @@ +from channels.routing import route +from mural.consumers import ws_message + +channel_routing = [ + route("websocket.receive", ws_message), +] \ No newline at end of file diff --git a/amadeus/settings.py b/amadeus/settings.py index 9d5153e..0167493 100644 --- a/amadeus/settings.py +++ b/amadeus/settings.py @@ -54,6 +54,7 @@ INSTALLED_APPS = [ 'session_security', 'django_crontab', 'django_cron', + #'channels', 'amadeus', 'users', @@ -64,6 +65,7 @@ INSTALLED_APPS = [ 'students_group', 'topics', 'pendencies', + 'mural', 'file_link', 'links', 'webpage', @@ -182,6 +184,13 @@ CRONJOBS = [ ('1 */12 * * *', 'notifications.cron.notification_cron') ] +CHANNEL_LAYERS = { + "default": { + "BACKEND": "asgiref.inmemory.ChannelLayer", + "ROUTING": "amadeus.routing.channel_routing", + }, +} + #SECURITY SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO','https') diff --git a/categories/migrations/0013_auto_20170203_1618.py b/categories/migrations/0013_auto_20170203_1618.py new file mode 100644 index 0000000..6a79c96 --- /dev/null +++ b/categories/migrations/0013_auto_20170203_1618.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-03 19:18 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('categories', '0012_auto_20170201_2010'), + ] + + operations = [ + migrations.AlterField( + model_name='category', + name='coordinators', + field=models.ManyToManyField(blank=True, related_name='Coordenadores', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/mural/__init__.py b/mural/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/mural/__init__.py diff --git a/mural/admin.py b/mural/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/mural/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/mural/apps.py b/mural/apps.py new file mode 100644 index 0000000..7fca45d --- /dev/null +++ b/mural/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class MuralConfig(AppConfig): + name = 'mural' diff --git a/mural/consumers.py b/mural/consumers.py new file mode 100644 index 0000000..d19ff3a --- /dev/null +++ b/mural/consumers.py @@ -0,0 +1,18 @@ +from channels import Group +from channels.sessions import channel_session +from django.http import HttpResponse +from channels.handler import AsgiHandler + +def http_consumer(message): + # Make standard HTTP response - access ASGI path attribute directly + response = HttpResponse("Hello world! You asked for %s" % message.content['path']) + # Encode that response into message format (ASGI) + for chunk in AsgiHandler.encode_response(response): + message.reply_channel.send(chunk) + +def ws_message(message): + # ASGI WebSocket packet-received and send-packet message types + # both have a "text" key for their textual data. + message.reply_channel.send({ + "text": message.content['text'], + }) \ No newline at end of file diff --git a/mural/forms.py b/mural/forms.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/mural/forms.py diff --git a/mural/migrations/0001_initial.py b/mural/migrations/0001_initial.py new file mode 100644 index 0000000..37c504f --- /dev/null +++ b/mural/migrations/0001_initial.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.10 on 2017-02-03 19:18 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import mural.models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('topics', '0007_auto_20170123_1911'), + ('categories', '0013_auto_20170203_1618'), + ('subjects', '0014_auto_20170130_1828'), + ] + + operations = [ + migrations.CreateModel( + name='Comment', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('comment', models.TextField(blank=True, verbose_name='Comment')), + ('image', models.ImageField(blank=True, null=True, upload_to='posts/comments/', validators=[mural.models.validate_img_extension], verbose_name='Image')), + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), + ('last_update', models.DateTimeField(auto_now=True, verbose_name='Last Update')), + ], + ), + migrations.CreateModel( + name='Mural', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('_my_subclass', models.CharField(max_length=200)), + ('action', models.CharField(blank=True, choices=[('comment', 'Comment'), ('help', 'Ask for Help')], max_length=100, verbose_name='Action')), + ('post', models.TextField(blank=True, verbose_name='Post')), + ('image', models.ImageField(blank=True, null=True, upload_to='posts/', validators=[mural.models.validate_img_extension], verbose_name='Image')), + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')), + ('last_update', models.DateTimeField(auto_now=True, verbose_name='Last Update')), + ], + options={ + 'abstract': False, + }, + ), + migrations.CreateModel( + name='CategoryPost', + fields=[ + ('mural_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mural.Mural')), + ('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='post_category', to='categories.Category', verbose_name='Category')), + ], + options={ + 'abstract': False, + }, + bases=('mural.mural',), + ), + migrations.CreateModel( + name='GeneralPost', + fields=[ + ('mural_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mural.Mural')), + ('space', models.IntegerField(blank=True, default=0, verbose_name='Space')), + ], + options={ + 'abstract': False, + }, + bases=('mural.mural',), + ), + migrations.CreateModel( + name='SubjectPost', + fields=[ + ('mural_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='mural.Mural')), + ('resource', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='post_resource', to='topics.Resource', verbose_name='Resource')), + ('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='post_subject', to='subjects.Subject', verbose_name='Subject')), + ], + options={ + 'abstract': False, + }, + bases=('mural.mural',), + ), + migrations.AddField( + model_name='mural', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='post_user', to=settings.AUTH_USER_MODEL, verbose_name='User'), + ), + migrations.AddField( + model_name='comment', + name='post', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='comment_post', to='mural.Mural', verbose_name='Post'), + ), + migrations.AddField( + model_name='comment', + name='user', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='comment_user', to=settings.AUTH_USER_MODEL, verbose_name='User'), + ), + ] diff --git a/mural/migrations/__init__.py b/mural/migrations/__init__.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/mural/migrations/__init__.py diff --git a/mural/models.py b/mural/models.py new file mode 100644 index 0000000..c522159 --- /dev/null +++ b/mural/models.py @@ -0,0 +1,42 @@ +from django.db import models +from django.core import validators +from django.core.exceptions import ValidationError +from django.utils.translation import ugettext_lazy as _ + +from categories.models import Category +from subjects.models import Subject +from topics.models import KnowsChild, Resource +from users.models import User + +def validate_img_extension(value): + valid_formats = ['image/jpeg','image/x-citrix-jpeg','image/png','image/x-citrix-png','image/x-png'] + + if hasattr(value.file, 'content_type'): + if not value.file.content_type in valid_formats: + raise ValidationError(_('File not supported.')) + +class Mural(KnowsChild): + action = models.CharField(_('Action'), max_length = 100, choices = (("comment", _("Comment")), ("help", _("Ask for Help"))), blank = True) + post = models.TextField(_('Post'), blank = True) + image = models.ImageField(verbose_name = _('Image'), null=True, blank = True, upload_to = 'posts/', validators = [validate_img_extension]) + user = models.ForeignKey(User, verbose_name = _('User'), related_name = "post_user", null = True) + create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) + last_update = models.DateTimeField(_('Last Update'), auto_now = True) + +class GeneralPost(Mural): + space = models.IntegerField(_('Space'), default = 0, blank = True) + +class CategoryPost(Mural): + space = models.ForeignKey(Category, verbose_name = ('Category'), related_name = 'post_category') + +class SubjectPost(Mural): + space = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name = 'post_subject') + resource = models.ForeignKey(Resource, verbose_name = _('Resource'), related_name = 'post_resource', null = True) + +class Comment(models.Model): + comment = models.TextField(_('Comment'), blank = True) + image = models.ImageField(verbose_name = _('Image'), null=True, blank = True, upload_to = 'posts/comments/', validators = [validate_img_extension]) + post = models.ForeignKey(Mural, verbose_name = _('Post'), related_name = 'comment_post') + user = models.ForeignKey(User, verbose_name = _('User'), related_name = "comment_user", null = True) + create_date = models.DateTimeField(_('Create Date'), auto_now_add = True) + last_update = models.DateTimeField(_('Last Update'), auto_now = True) \ No newline at end of file diff --git a/mural/tests.py b/mural/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/mural/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/mural/urls.py b/mural/urls.py new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/mural/urls.py diff --git a/mural/views.py b/mural/views.py new file mode 100644 index 0000000..91ea44a --- /dev/null +++ b/mural/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here. -- libgit2 0.21.2