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 | 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')), | ... | ... |
... | ... | @@ -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 @@ |
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 | ... | ... |
... | ... | @@ -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 @@ |
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 | ... | ... |
... | ... | @@ -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 | ... | ... |
... | ... | @@ -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 | ... | ... |
... | ... | @@ -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 | ... | ... |
... | ... | @@ -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 | ... | ... |