Commit 76b917b968de46436b498e263ff07301e90fbc90
1 parent
94ff89ba
Exists in
master
and in
3 other branches
Adding chat app with initial general participants list
Showing
22 changed files
with
537 additions
and
9 deletions
Show diff stats
amadeus/settings.py
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,4 +1227,46 @@ div.dataTables_wrapper div.dataTables_paginate { | ||
1227 | display: inline; | 1227 | display: inline; |
1228 | margin-right: 30px; | 1228 | margin-right: 30px; |
1229 | } | 1229 | } |
1230 | -/* End Reports */ | ||
1231 | \ No newline at end of file | 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 | \ No newline at end of file | 1274 | \ No newline at end of file |
amadeus/static/css/themes/green.css
@@ -471,6 +471,16 @@ a.add-row { | @@ -471,6 +471,16 @@ a.add-row { | ||
471 | .goal_divider { | 471 | .goal_divider { |
472 | border-top-color: #888; } | 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 | @media(max-width: 768px) { | 484 | @media(max-width: 768px) { |
475 | .navbar .navbar-nav .dropdown .dropdown-menu li > a { | 485 | .navbar .navbar-nav .dropdown .dropdown-menu li > a { |
476 | color: #333333 !important; } | 486 | color: #333333 !important; } |
amadeus/static/css/themes/green.css.map
1 | { | 1 | { |
2 | "version": 3, | 2 | "version": 3, |
3 | -"mappings": "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", | 3 | +"mappings": "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", |
4 | "sources": ["green.sass"], | 4 | "sources": ["green.sass"], |
5 | "names": [], | 5 | "names": [], |
6 | "file": "green.css" | 6 | "file": "green.css" |
amadeus/static/css/themes/green.sass
@@ -642,6 +642,16 @@ a.add-row | @@ -642,6 +642,16 @@ a.add-row | ||
642 | .goal_divider | 642 | .goal_divider |
643 | border-top-color: #888 | 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 | @media(max-width: 768px) | 655 | @media(max-width: 768px) |
646 | .navbar .navbar-nav .dropdown .dropdown-menu li > a | 656 | .navbar .navbar-nav .dropdown .dropdown-menu li > a |
647 | color: #333333 !important | 657 | color: #333333 !important |
amadeus/templates/base.html
@@ -205,10 +205,12 @@ | @@ -205,10 +205,12 @@ | ||
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> | 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 | </a> | 206 | </a> |
207 | </li> | 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 | </li> | 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 | <a href="{% url 'notifications:manage' %}"> | 214 | <a href="{% url 'notifications:manage' %}"> |
213 | <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | 215 | <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> |
214 | {% if notifications_count > 0 %} | 216 | {% if notifications_count > 0 %} |
@@ -252,15 +254,17 @@ | @@ -252,15 +254,17 @@ | ||
252 | </a> | 254 | </a> |
253 | </li> | 255 | </li> |
254 | <li class="item {{ mural_menu_active }} action_icon" data-toggle="tooltip" data-placement="top" title="{% trans "Mural" %}"> | 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 | <i class="fa fa-list" aria-hidden="true" ></i> | 258 | <i class="fa fa-list" aria-hidden="true" ></i> |
257 | <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> | 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 | </a> | 260 | </a> |
259 | </li> | 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 | </li> | 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 | <a href="{% url 'notifications:manage' %}"> | 268 | <a href="{% url 'notifications:manage' %}"> |
265 | <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> | 269 | <i class="fa fa-exclamation-triangle" aria-hidden="true"></i> |
266 | {% if notifications_count > 0 %} | 270 | {% if notifications_count > 0 %} |
amadeus/urls.py
@@ -30,6 +30,7 @@ urlpatterns = [ | @@ -30,6 +30,7 @@ urlpatterns = [ | ||
30 | url(r'^subjects/', include('subjects.urls', namespace = 'subjects')), | 30 | url(r'^subjects/', include('subjects.urls', namespace = 'subjects')), |
31 | url(r'^groups/', include('students_group.urls', namespace = 'groups')), | 31 | url(r'^groups/', include('students_group.urls', namespace = 'groups')), |
32 | url(r'^topics/', include('topics.urls', namespace = 'topics')), | 32 | url(r'^topics/', include('topics.urls', namespace = 'topics')), |
33 | + url(r'^chat/', include('chat.urls', namespace = 'chat')), | ||
33 | url(r'^mural/', include('mural.urls', namespace = 'mural')), | 34 | url(r'^mural/', include('mural.urls', namespace = 'mural')), |
34 | url(r'^webpages/', include('webpage.urls', namespace = 'webpages')), | 35 | url(r'^webpages/', include('webpage.urls', namespace = 'webpages')), |
35 | url(r'^ytvideo/', include('youtube_video.urls', namespace = 'youtube')), | 36 | url(r'^ytvideo/', include('youtube_video.urls', namespace = 'youtube')), |
@@ -0,0 +1,128 @@ | @@ -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 | + ] |
@@ -0,0 +1,56 @@ | @@ -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 | \ No newline at end of file | 57 | \ No newline at end of file |
@@ -0,0 +1,14 @@ | @@ -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> |
@@ -0,0 +1,67 @@ | @@ -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 | \ No newline at end of file | 68 | \ No newline at end of file |
@@ -0,0 +1,75 @@ | @@ -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 | \ No newline at end of file | 76 | \ No newline at end of file |
@@ -0,0 +1,26 @@ | @@ -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 | \ No newline at end of file | 27 | \ No newline at end of file |
@@ -0,0 +1,7 @@ | @@ -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 | \ No newline at end of file | 8 | \ No newline at end of file |
@@ -0,0 +1,76 @@ | @@ -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 | \ No newline at end of file | 77 | \ No newline at end of file |