Commit 76b917b968de46436b498e263ff07301e90fbc90

Authored by Zambom
1 parent 94ff89ba

Adding chat app with initial general participants list

amadeus/settings.py
... ... @@ -68,6 +68,7 @@ INSTALLED_APPS = [
68 68 'topics',
69 69 'pendencies',
70 70 'mural',
  71 + 'chat',
71 72 'file_link',
72 73 'goals',
73 74 'pdf_file',
... ...
amadeus/static/css/.sass-cache/a7f87b90919294b62ab4f8079e31dcda8f485534/green.sassc
No preview for this file type
amadeus/static/css/base/amadeus.css
... ... @@ -1227,4 +1227,46 @@ div.dataTables_wrapper div.dataTables_paginate {
1227 1227 display: inline;
1228 1228 margin-right: 30px;
1229 1229 }
1230   -/* End Reports */
1231 1230 \ No newline at end of file
  1231 +/* End Reports */
  1232 +
  1233 +/* Chat */
  1234 +.participants-group {
  1235 + margin-left: 40px;
  1236 +}
  1237 +
  1238 +.participant {
  1239 + margin-bottom: 10px;
  1240 + border-width: 1px;
  1241 + border-style: solid;
  1242 + padding-right: 10px;
  1243 +}
  1244 +
  1245 +.participant .user-img {
  1246 + padding: 5px 0px;
  1247 +}
  1248 +
  1249 +.participant .user-info {
  1250 + padding: 20px 15px;
  1251 +}
  1252 +.participant .user-info .status {
  1253 + width: 20px;
  1254 + height: 20px;
  1255 + border-width: 1px;
  1256 + border-style: solid;
  1257 + border-radius: 10px;
  1258 + margin-right: 10px;
  1259 + position: relative;
  1260 + top: 3px;
  1261 + display: inline-block;
  1262 + border-spacing: 0;
  1263 + border-collapse: collapse;
  1264 +}
  1265 +.participant .user-info h4 {
  1266 + font-weight: 700;
  1267 + line-height: 2.0;
  1268 +}
  1269 +
  1270 +.participant .buttons {
  1271 + padding: 20px 0px;
  1272 +}
  1273 +/* End Chat */
1232 1274 \ No newline at end of file
... ...
amadeus/static/css/themes/green.css
... ... @@ -471,6 +471,16 @@ a.add-row {
471 471 .goal_divider {
472 472 border-top-color: #888; }
473 473  
  474 +.participant {
  475 + border-color: #888; }
  476 +
  477 +.participant .user-info .status {
  478 + border-color: #888;
  479 + background-color: #F5F5F5; }
  480 +
  481 +.participant .user-info .status.active {
  482 + background-color: #009688; }
  483 +
474 484 @media(max-width: 768px) {
475 485 .navbar .navbar-nav .dropdown .dropdown-menu li > a {
476 486 color: #333333 !important; }
... ...
amadeus/static/css/themes/green.css.map
1 1 {
2 2 "version": 3,
3   -"mappings": "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",
  3 +"mappings": "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",
4 4 "sources": ["green.sass"],
5 5 "names": [],
6 6 "file": "green.css"
... ...
amadeus/static/css/themes/green.sass
... ... @@ -642,6 +642,16 @@ a.add-row
642 642 .goal_divider
643 643 border-top-color: #888
644 644  
  645 +.participant
  646 + border-color: #888
  647 +
  648 +.participant .user-info .status
  649 + border-color: #888
  650 + background-color: $default-white
  651 +
  652 +.participant .user-info .status.active
  653 + background-color: $primary-color
  654 +
645 655 @media(max-width: 768px)
646 656 .navbar .navbar-nav .dropdown .dropdown-menu li > a
647 657 color: #333333 !important
... ...
amadeus/templates/base.html
... ... @@ -205,10 +205,12 @@
205 205 <span class="badge notify_badge mural_badge" {% if mural_notifications_count == 0 %} style="display:none" {% endif %}>{% if mural_notifications_count > 99 %} +99 {% else %} {{ mural_notifications_count }} {% endif %}</span>
206 206 </a>
207 207 </li>
208   - <li class="item" data-toggle="tooltip" data-placement="right" title="{% trans "Messages" %}">
209   - <i class="fa fa-envelope-o" aria-hidden="true"></i>
  208 + <li class="item {{ chat_menu_active }} action_icon" data-toggle="tooltip" data-placement="right" title="{% trans "Messages" %}">
  209 + <a href="{% url 'chat:manage_general' %}">
  210 + <i class="fa fa-envelope-o" aria-hidden="true"></i>
  211 + </a>
210 212 </li>
211   - <li class="item {{ pendencies_menu_active }} action_icon" data-toggle="tooltip" data-placement="right" title="{% trans "Pendencias" %}">
  213 + <li class="item {{ pendencies_menu_active }} action_icon" data-toggle="tooltip" data-placement="right" title="{% trans "Pendencies" %}">
212 214 <a href="{% url 'notifications:manage' %}">
213 215 <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
214 216 {% if notifications_count > 0 %}
... ... @@ -252,15 +254,17 @@
252 254 </a>
253 255 </li>
254 256 <li class="item {{ mural_menu_active }} action_icon" data-toggle="tooltip" data-placement="top" title="{% trans "Mural" %}">
255   - <a href="{% url 'mural:manage_general' %}"
  257 + <a href="{% url 'mural:manage_general' %}">
256 258 <i class="fa fa-list" aria-hidden="true" ></i>
257 259 <span class="badge notify_badge mural_badge" {% if mural_notifications_count == 0 %} style="display:none" {% endif %}>{% if mural_notifications_count > 99 %} +99 {% else %} {{ mural_notifications_count }} {% endif %}</span>
258 260 </a>
259 261 </li>
260   - <li class="item" data-toggle="tooltip" data-placement="top" title="{% trans "Messages" %}">
261   - <i class="fa fa-envelope-o" aria-hidden="true"></i>
  262 + <li class="item {{ chat_menu_active }} action_icon" data-toggle="tooltip" data-placement="top" title="{% trans "Messages" %}">
  263 + <a href="{% url 'chat:manage_general' %}">
  264 + <i class="fa fa-envelope-o" aria-hidden="true"></i>
  265 + </a>
262 266 </li>
263   - <li class="item {{ pendencies_menu_active }} action_icon" data-toggle="tooltip" data-placement="top" title="{% trans "Pendencias" %}">
  267 + <li class="item {{ pendencies_menu_active }} action_icon" data-toggle="tooltip" data-placement="top" title="{% trans "Pendencies" %}">
264 268 <a href="{% url 'notifications:manage' %}">
265 269 <i class="fa fa-exclamation-triangle" aria-hidden="true"></i>
266 270 {% if notifications_count > 0 %}
... ...
amadeus/urls.py
... ... @@ -30,6 +30,7 @@ urlpatterns = [
30 30 url(r'^subjects/', include('subjects.urls', namespace = 'subjects')),
31 31 url(r'^groups/', include('students_group.urls', namespace = 'groups')),
32 32 url(r'^topics/', include('topics.urls', namespace = 'topics')),
  33 + url(r'^chat/', include('chat.urls', namespace = 'chat')),
33 34 url(r'^mural/', include('mural.urls', namespace = 'mural')),
34 35 url(r'^webpages/', include('webpage.urls', namespace = 'webpages')),
35 36 url(r'^ytvideo/', include('youtube_video.urls', namespace = 'youtube')),
... ...
chat/__init__.py 0 → 100644
chat/admin.py 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +from django.contrib import admin
  2 +
  3 +# Register your models here.
... ...
chat/apps.py 0 → 100644
... ... @@ -0,0 +1,5 @@
  1 +from django.apps import AppConfig
  2 +
  3 +
  4 +class ChatConfig(AppConfig):
  5 + name = 'chat'
... ...
chat/migrations/0001_initial.py 0 → 100644
... ... @@ -0,0 +1,128 @@
  1 +# -*- coding: utf-8 -*-
  2 +# Generated by Django 1.10.4 on 2017-03-10 22:13
  3 +from __future__ import unicode_literals
  4 +
  5 +import chat.models
  6 +from django.conf import settings
  7 +from django.db import migrations, models
  8 +import django.db.models.deletion
  9 +
  10 +
  11 +class Migration(migrations.Migration):
  12 +
  13 + initial = True
  14 +
  15 + dependencies = [
  16 + ('subjects', '0014_auto_20170130_1828'),
  17 + migrations.swappable_dependency(settings.AUTH_USER_MODEL),
  18 + ('categories', '0014_auto_20170224_0023'),
  19 + ]
  20 +
  21 + operations = [
  22 + migrations.CreateModel(
  23 + name='ChatFavorites',
  24 + fields=[
  25 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  26 + ],
  27 + ),
  28 + migrations.CreateModel(
  29 + name='ChatVisualizations',
  30 + fields=[
  31 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  32 + ('viewed', models.BooleanField(default=False, verbose_name='Viewed')),
  33 + ('date_viewed', models.DateTimeField(blank=True, null=True, verbose_name='Date/Time Viewed')),
  34 + ],
  35 + ),
  36 + migrations.CreateModel(
  37 + name='Conversation',
  38 + fields=[
  39 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  40 + ('_my_subclass', models.CharField(max_length=200)),
  41 + ],
  42 + options={
  43 + 'abstract': False,
  44 + },
  45 + ),
  46 + migrations.CreateModel(
  47 + name='TalkMessages',
  48 + fields=[
  49 + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
  50 + ('text', models.TextField(blank=True, verbose_name='Comment')),
  51 + ('image', models.ImageField(blank=True, null=True, upload_to=chat.models.upload_filename, validators=[chat.models.validate_img_extension], verbose_name='Image')),
  52 + ('create_date', models.DateTimeField(auto_now_add=True, verbose_name='Create Date')),
  53 + ],
  54 + ),
  55 + migrations.CreateModel(
  56 + name='CategoryTalk',
  57 + fields=[
  58 + ('conversation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='chat.Conversation')),
  59 + ('space', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='talk_category', to='categories.Category', verbose_name='Category')),
  60 + ],
  61 + options={
  62 + 'abstract': False,
  63 + },
  64 + bases=('chat.conversation',),
  65 + ),
  66 + migrations.CreateModel(
  67 + name='GeneralTalk',
  68 + fields=[
  69 + ('conversation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='chat.Conversation')),
  70 + ('space', models.IntegerField(blank=True, default=0, verbose_name='Space')),
  71 + ],
  72 + options={
  73 + 'abstract': False,
  74 + },
  75 + bases=('chat.conversation',),
  76 + ),
  77 + migrations.CreateModel(
  78 + name='SubjectTalk',
  79 + fields=[
  80 + ('conversation_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='chat.Conversation')),
  81 + ('space', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='talk_subject', to='subjects.Subject', verbose_name='Subject')),
  82 + ],
  83 + options={
  84 + 'abstract': False,
  85 + },
  86 + bases=('chat.conversation',),
  87 + ),
  88 + migrations.AddField(
  89 + model_name='talkmessages',
  90 + name='talk',
  91 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='message_talk', to='chat.Conversation', verbose_name='Conversation'),
  92 + ),
  93 + migrations.AddField(
  94 + model_name='talkmessages',
  95 + name='user',
  96 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='message_user', to=settings.AUTH_USER_MODEL, verbose_name='User'),
  97 + ),
  98 + migrations.AddField(
  99 + model_name='conversation',
  100 + name='user_one',
  101 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='talk_user_start', to=settings.AUTH_USER_MODEL, verbose_name='User One'),
  102 + ),
  103 + migrations.AddField(
  104 + model_name='conversation',
  105 + name='user_two',
  106 + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='talk_user_end', to=settings.AUTH_USER_MODEL, verbose_name='User Two'),
  107 + ),
  108 + migrations.AddField(
  109 + model_name='chatvisualizations',
  110 + name='message',
  111 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chat_visualization_message', to='chat.TalkMessages', verbose_name='Message'),
  112 + ),
  113 + migrations.AddField(
  114 + model_name='chatvisualizations',
  115 + name='user',
  116 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chat_visualization_user', to=settings.AUTH_USER_MODEL, verbose_name='User'),
  117 + ),
  118 + migrations.AddField(
  119 + model_name='chatfavorites',
  120 + name='message',
  121 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chat_favorites_message', to='chat.TalkMessages', verbose_name='Message'),
  122 + ),
  123 + migrations.AddField(
  124 + model_name='chatfavorites',
  125 + name='user',
  126 + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='chat_favorites_user', to=settings.AUTH_USER_MODEL, verbose_name='User'),
  127 + ),
  128 + ]
... ...
chat/migrations/__init__.py 0 → 100644
chat/models.py 0 → 100644
... ... @@ -0,0 +1,56 @@
  1 +import os
  2 +import time
  3 +from django.db import models
  4 +from django.core import validators
  5 +from django.core.exceptions import ValidationError
  6 +from django.utils.translation import ugettext_lazy as _
  7 +
  8 +from topics.decorators import always_as_child
  9 +
  10 +from categories.models import Category
  11 +from subjects.models import Subject
  12 +from topics.models import KnowsChild
  13 +from users.models import User
  14 +
  15 +def validate_img_extension(value):
  16 + valid_formats = ['image/jpeg','image/x-citrix-jpeg','image/png','image/x-citrix-png','image/x-png','image/gif']
  17 +
  18 + if hasattr(value.file, 'content_type'):
  19 + if not value.file.content_type in valid_formats:
  20 + raise ValidationError(_('File not supported.'))
  21 +
  22 +def upload_filename(instance, filename):
  23 + path = "chat/"
  24 + filename = str(int(time.time())) + "_" + filename
  25 +
  26 + return os.path.join(path, filename)
  27 +
  28 +class Conversation(KnowsChild):
  29 + user_one = models.ForeignKey(User, verbose_name = _('User One'), related_name = 'talk_user_start')
  30 + user_two = models.ForeignKey(User, verbose_name = _('User Two'), related_name = 'talk_user_end')
  31 +
  32 +class GeneralTalk(Conversation):
  33 + space = models.IntegerField(_('Space'), default = 0, blank = True)
  34 +
  35 +class CategoryTalk(Conversation):
  36 + space = models.ForeignKey(Category, verbose_name = ('Category'), related_name = 'talk_category', null = True)
  37 +
  38 +class SubjectTalk(Conversation):
  39 + space = models.ForeignKey(Subject, verbose_name = _('Subject'), related_name = 'talk_subject')
  40 +
  41 +class TalkMessages(models.Model):
  42 + text = models.TextField(_('Comment'), blank = True)
  43 + image = models.ImageField(verbose_name = _('Image'), null=True, blank = True, upload_to = upload_filename, validators = [validate_img_extension])
  44 + talk = models.ForeignKey(Conversation, verbose_name = _('Conversation'), related_name = 'message_talk')
  45 + user = models.ForeignKey(User, verbose_name = _('User'), related_name = 'message_user')
  46 + create_date = models.DateTimeField(_('Create Date'), auto_now_add = True)
  47 +
  48 +class ChatVisualizations(models.Model):
  49 + viewed = models.BooleanField(_('Viewed'), default = False)
  50 + message = models.ForeignKey(TalkMessages, verbose_name = _('Message'), related_name = 'chat_visualization_message', null = True)
  51 + user = models.ForeignKey(User, verbose_name = _('User'), related_name = "chat_visualization_user", null = True)
  52 + date_viewed = models.DateTimeField(_('Date/Time Viewed'), null = True, blank = True)
  53 +
  54 +class ChatFavorites(models.Model):
  55 + message = models.ForeignKey(TalkMessages, verbose_name = _('Message'), related_name = 'chat_favorites_message', null = True)
  56 + user = models.ForeignKey(User, verbose_name = _('User'), related_name = "chat_favorites_user", null = True)
0 57 \ No newline at end of file
... ...
chat/templates/chat/_view_participant.html 0 → 100644
... ... @@ -0,0 +1,14 @@
  1 +{% load i18n chat_tags %}
  2 +
  3 +<div class="col-md-12 participant panel">
  4 + <div class="col-md-1 user-img">
  5 + <img src="{{ participant.image_url }}" class="img-responsive" />
  6 + </div>
  7 + <div class="col-md-6 user-info">
  8 + <h4><div class="status {{ participant|is_online:online_users }}"></div> {{ participant }}</h4>
  9 + </div>
  10 + <div class="col-md-4 buttons pull-right text-center">
  11 + <a href="" class="btn btn-raised btn-default">{% trans 'See Profile' %}</a>
  12 + <a href="" class="btn btn-raised btn-success">{% trans 'Send Message' %}</a>
  13 + </div>
  14 +</div>
... ...
chat/templates/chat/list.html 0 → 100644
... ... @@ -0,0 +1,67 @@
  1 +{% extends 'base.html' %}
  2 +
  3 +{% load static i18n pagination %}
  4 +{% load django_bootstrap_breadcrumbs %}
  5 +
  6 +{% block breadcrumbs %}
  7 + {{ block.super }}
  8 +
  9 + {% trans 'Messages General' as general %}
  10 +
  11 + {% breadcrumb general 'chat:manage_general' %}
  12 +{% endblock %}
  13 +
  14 +{% block content %}
  15 + <div id="core-subjects-options-div">
  16 + <ul class="core-subjects-options mural-tabs">
  17 + <a href="{% url 'chat:manage_general' %}"><li data-chat="general" class="active">{% trans "General" %} (<span>{{ totals.general }}</span>)</li></a>
  18 + <a href=""><li data-chat="categories">{% trans "Per Category" %} (<span>{{ totals.category }}</span>)</li></a>
  19 + <a href=""><li data-chat="subjects">{% trans "Per Subject" %} (<span>{{ totals.subject }}</span>)</li></a>
  20 + </ul>
  21 + </div>
  22 +
  23 + <div class="col-md-12 cards-content">
  24 + <div class="row">
  25 + <div class="col-md-12 col-sm-12 col-xs-12">
  26 + <div class="panel panel-default">
  27 + <div class="panel-body">
  28 + <div class="col-md-8">
  29 + <form action="" method="GET" class="form-horizontal">
  30 + <div class="form-group">
  31 + <div class="col-md-11 col-sm-11 col-xs-11">
  32 + <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" />
  33 + </div>
  34 + <div class="col-md-1 col-sm-1 col-xs-1">
  35 + <button type="submit" class="btn btn-fab btn-fab-mini">
  36 + <i class="fa fa-search"></i>
  37 + </button>
  38 + </div>
  39 + </div>
  40 + </form>
  41 + </div>
  42 + <div class="col-md-4">
  43 + <a href="{% url 'chat:participants_general' %}" class="pull-right btn btn-default btn-raised btn-md">{% trans 'List all participants' %}</a>
  44 + </div>
  45 + </div>
  46 + </div>
  47 +
  48 + {% if conversations.count > 0 %}
  49 + <div class="panel panel-info panel-body">
  50 + <h2 class="my-subjects-title"><b>{% trans 'Conversations' %}</b></h2>
  51 +
  52 + {% for chat in conversations %}
  53 + {% include 'chat/_view.html' %}
  54 + {% endfor %}
  55 + </div>
  56 + {% else %}
  57 + <div class="text-center no-subjects">
  58 + <i class="fa fa-envelope-o"></i>
  59 + <h4>{% trans 'You do not posses messages in this space yet.' %}</h4>
  60 + </div>
  61 + {% endif %}
  62 + </div>
  63 + </div>
  64 + </div>
  65 +
  66 + <div class="modal fade" id="post-modal-form" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"></div>
  67 + {% endblock %}
0 68 \ No newline at end of file
... ...
chat/templates/chat/list_participants.html 0 → 100644
... ... @@ -0,0 +1,75 @@
  1 +{% extends 'base.html' %}
  2 +
  3 +{% load static i18n pagination chat_tags %}
  4 +{% load django_bootstrap_breadcrumbs %}
  5 +
  6 +{% block breadcrumbs %}
  7 + {{ block.super }}
  8 +
  9 + {% trans 'Messages General' as general %}
  10 + {% trans 'Participants' as participants_bread %}
  11 +
  12 + {% breadcrumb general 'chat:manage_general' %}
  13 + {% breadcrumb participants_bread 'chat:participants_general' %}
  14 +{% endblock %}
  15 +
  16 +{% block content %}
  17 + {% users_online as online_users %}
  18 +
  19 + <div id="core-subjects-options-div">
  20 + <ul class="core-subjects-options mural-tabs">
  21 + <a href="{% url 'chat:manage_general' %}"><li data-chat="general" class="active">{% trans "General" %} (<span>{{ totals.general }}</span>)</li></a>
  22 + <a href=""><li data-chat="categories">{% trans "Per Category" %} (<span>{{ totals.category }}</span>)</li></a>
  23 + <a href=""><li data-chat="subjects">{% trans "Per Subject" %} (<span>{{ totals.subject }}</span>)</li></a>
  24 + </ul>
  25 + </div>
  26 +
  27 + <div class="col-md-12 cards-content">
  28 + <div class="row">
  29 + <div class="col-md-12 col-sm-12 col-xs-12">
  30 + <div class="panel panel-default">
  31 + <div class="panel-body">
  32 + <div class="col-md-8">
  33 + <form action="" method="GET" class="form-horizontal">
  34 + <div class="form-group">
  35 + <div class="col-md-11 col-sm-11 col-xs-11">
  36 + <input type="text" class="form-control" name="search" placeholder="{% trans 'Search...' %}" />
  37 + </div>
  38 + <div class="col-md-1 col-sm-1 col-xs-1">
  39 + <button type="submit" class="btn btn-fab btn-fab-mini">
  40 + <i class="fa fa-search"></i>
  41 + </button>
  42 + </div>
  43 + </div>
  44 + </form>
  45 + </div>
  46 + <div class="col-md-4">
  47 + <a href="{% url 'chat:participants_general' %}" class="pull-right btn btn-default btn-raised btn-md">{% trans 'List all participants' %}</a>
  48 + </div>
  49 + </div>
  50 + </div>
  51 +
  52 + {% if participants.count > 0 %}
  53 + <div class="panel category-panel-content panel-body">
  54 + <h2 class="my-subjects-title"><b>{% trans 'Participants' %}</b></h2>
  55 +
  56 + <div class="participants-group">
  57 + {% for participant in participants %}
  58 + {% include 'chat/_view_participant.html' %}
  59 + {% endfor %}
  60 + </div>
  61 +
  62 + {% pagination request paginator page_obj %}
  63 + </div>
  64 + {% else %}
  65 + <div class="text-center no-subjects">
  66 + <i class="fa fa-envelope-o"></i>
  67 + <h4>{% trans 'There is no other participants in this space yet.' %}</h4>
  68 + </div>
  69 + {% endif %}
  70 + </div>
  71 + </div>
  72 + </div>
  73 +
  74 + <div class="modal fade" id="post-modal-form" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"></div>
  75 + {% endblock %}
0 76 \ No newline at end of file
... ...
chat/templatetags/__init__.py 0 → 100644
chat/templatetags/chat_tags.py 0 → 100644
... ... @@ -0,0 +1,26 @@
  1 +from django import template
  2 +from django.utils import timezone
  3 +from django.contrib.sessions.models import Session
  4 +
  5 +register = template.Library()
  6 +
  7 +@register.assignment_tag
  8 +def users_online():
  9 + sessions = Session.objects.filter(expire_date__gte = timezone.now())
  10 +
  11 + uid_list = []
  12 +
  13 + # Build a list of user ids from that query
  14 + for session in sessions:
  15 + data = session.get_decoded()
  16 + uid_list.append(data.get('_auth_user_id', None))
  17 +
  18 + return uid_list
  19 +
  20 +@register.filter(name = 'is_online')
  21 +def is_online(user, online_list):
  22 + if str(user.id) in online_list:
  23 + print(str(user.id) in online_list)
  24 + return "active"
  25 +
  26 + return ""
0 27 \ No newline at end of file
... ...
chat/tests.py 0 → 100644
... ... @@ -0,0 +1,3 @@
  1 +from django.test import TestCase
  2 +
  3 +# Create your tests here.
... ...
chat/urls.py 0 → 100644
... ... @@ -0,0 +1,7 @@
  1 +from django.conf.urls import url
  2 +from . import views
  3 +
  4 +urlpatterns = [
  5 + url(r'^$', views.GeneralIndex.as_view(), name='manage_general'),
  6 + url(r'^participants/$', views.GeneralParticipants.as_view(), name='participants_general'),
  7 +]
0 8 \ No newline at end of file
... ...
chat/views.py 0 → 100644
... ... @@ -0,0 +1,76 @@
  1 +from django.shortcuts import get_object_or_404, redirect, render
  2 +from django.core.paginator import Paginator, EmptyPage
  3 +from django.http import Http404
  4 +from django.views import generic
  5 +from django.contrib import messages
  6 +from django.http import JsonResponse
  7 +from django.template.loader import render_to_string
  8 +from django.core.urlresolvers import reverse, reverse_lazy
  9 +from django.utils.translation import ugettext_lazy as _
  10 +from django.contrib.auth.mixins import LoginRequiredMixin
  11 +from django.db.models import Q
  12 +
  13 +from users.models import User
  14 +
  15 +from .models import Conversation, ChatVisualizations
  16 +
  17 +class GeneralIndex(LoginRequiredMixin, generic.ListView):
  18 + login_url = reverse_lazy("users:login")
  19 + redirect_field_name = 'next'
  20 +
  21 + template_name = 'chat/list.html'
  22 + context_object_name = "conversations"
  23 + paginate_by = 10
  24 +
  25 + totals = {}
  26 +
  27 + def get_queryset(self):
  28 + user = self.request.user
  29 + page = self.request.GET.get('page', False)
  30 +
  31 + conversations = Conversation.objects.filter(Q(user_one = user) | Q(user_two = user))
  32 +
  33 + self.totals['general'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__generaltalk__isnull = False).count()
  34 + self.totals['category'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__categorytalk__isnull = False).count()
  35 + self.totals['subject'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__subjecttalk__isnull = False).count()
  36 +
  37 + return conversations
  38 +
  39 + def get_context_data(self, **kwargs):
  40 + context = super(GeneralIndex, self).get_context_data(**kwargs)
  41 +
  42 + context['title'] = _('Messages')
  43 + context['totals'] = self.totals
  44 + context['chat_menu_active'] = 'subjects_menu_active'
  45 +
  46 + return context
  47 +
  48 +class GeneralParticipants(LoginRequiredMixin, generic.ListView):
  49 + login_url = reverse_lazy("users:login")
  50 + redirect_field_name = 'next'
  51 +
  52 + template_name = 'chat/list_participants.html'
  53 + context_object_name = "participants"
  54 + paginate_by = 10
  55 +
  56 + totals = {}
  57 +
  58 + def get_queryset(self):
  59 + user = self.request.user
  60 +
  61 + users = User.objects.all().exclude(id = user.id)
  62 +
  63 + self.totals['general'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__generaltalk__isnull = False).count()
  64 + self.totals['category'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__categorytalk__isnull = False).count()
  65 + self.totals['subject'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__subjecttalk__isnull = False).count()
  66 +
  67 + return users
  68 +
  69 + def get_context_data(self, **kwargs):
  70 + context = super(GeneralParticipants, self).get_context_data(**kwargs)
  71 +
  72 + context['title'] = _('Messages - Participants')
  73 + context['totals'] = self.totals
  74 + context['chat_menu_active'] = 'subjects_menu_active'
  75 +
  76 + return context
0 77 \ No newline at end of file
... ...