Commit 8ea454ec15882261abe70dae99d53bff0ac4af0f

Authored by Zambom
1 parent f145286e

Adding subject chat

amadeus/static/js/chat.js
... ... @@ -437,7 +437,7 @@ $('.chat-collapse').on('shown.bs.collapse', function(e) {
437 437 if($(this).is(e.target)){
438 438 var li = $(".breadcrumb").find('li:last-child');
439 439 var li_text = $(li).html();
440   - var url = $(".cat_url").val();
  440 + var url = $(".item_url").val();
441 441 var new_li = $(li).clone();
442 442  
443 443 new_li.html($(this).parent().find('.panel-title .item_name').text());
... ...
amadeus/static/js/socket.js
... ... @@ -283,8 +283,8 @@ function messageReceived(content) {
283 283 var item = $("#" + content.space);
284 284  
285 285 if (typeof(item) != "undefined") {
286   - var span = item.parent().find('span:not(.item_name)'),
287   - actual = span.text();
  286 + var span = item.parent().find('span.item_badge'),
  287 + actual = span.text();
288 288  
289 289 actual = parseInt(actual, 10) + 1;
290 290  
... ...
chat/templates/chat/list.html
... ... @@ -16,7 +16,7 @@
16 16 <ul class="core-subjects-options chat-tabs">
17 17 <a href="{% url 'chat:manage_general' %}"><li data-chat="general" class="active">{% trans "General" %} (<span>{{ totals.general }}</span>)</li></a>
18 18 <a href="{% url 'chat:manage_category' %}"><li data-chat="category">{% trans "Per Category" %} (<span>{{ totals.category }}</span>)</li></a>
19   - <a href=""><li data-chat="subject">{% trans "Per Subject" %} (<span>{{ totals.subject }}</span>)</li></a>
  19 + <a href="{% url 'chat:manage_subject' %}"><li data-chat="subject">{% trans "Per Subject" %} (<span>{{ totals.subject }}</span>)</li></a>
20 20 </ul>
21 21 </div>
22 22  
... ...
chat/templates/chat/list_category.html
... ... @@ -12,13 +12,13 @@
12 12 {% endblock %}
13 13  
14 14 {% block content %}
15   - <input type="hidden" value="{% url 'chat:manage_category' %}" class="cat_url">
  15 + <input type="hidden" value="{% url 'chat:manage_category' %}" class="item_url">
16 16  
17 17 <div id="core-subjects-options-div">
18 18 <ul class="core-subjects-options chat-tabs">
19 19 <a href="{% url 'chat:manage_general' %}"><li data-chat="general">{% trans "General" %} (<span>{{ totals.general }}</span>)</li></a>
20 20 <a href="{% url 'chat:manage_category' %}"><li data-chat="category" class="active">{% trans "Per Category" %} (<span>{{ totals.category }}</span>)</li></a>
21   - <a href=""><li data-chat="subject">{% trans "Per Subject" %} (<span>{{ totals.subject }}</span>)</li></a>
  21 + <a href="{% url 'chat:manage_subject' %}"><li data-chat="subject">{% trans "Per Subject" %} (<span>{{ totals.subject }}</span>)</li></a>
22 22 </ul>
23 23 </div>
24 24  
... ... @@ -41,7 +41,7 @@
41 41 <div class="col-md-12 category-header">
42 42 <h4 class="panel-title">
43 43 <a class="category-course-link pull-left" data-parent="#accordion" data-toggle="collapse" href="#{{category.slug}}">
44   - <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> <span class="item_name">{{ category.name }}</span> (<span style="margin-left:0px">{{ category|notifies_category:request.user }}</span>)
  44 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> <span class="item_name">{{ category.name }}</span> (<span class="item_badge" style="margin-left:0px">{{ category|notifies_category:request.user }}</span>)
45 45  
46 46 </a>
47 47 </h4>
... ...
chat/templates/chat/list_subject.html 0 → 100644
... ... @@ -0,0 +1,111 @@
  1 +{% extends 'base.html' %}
  2 +
  3 +{% load static i18n pagination permissions_tags chat_tags %}
  4 +{% load django_bootstrap_breadcrumbs %}
  5 +
  6 +{% block breadcrumbs %}
  7 + {{ block.super }}
  8 +
  9 + {% trans 'Messages per Subject' as subject %}
  10 +
  11 + {% breadcrumb subject 'chat:manage_category' %}
  12 +{% endblock %}
  13 +
  14 +{% block content %}
  15 + <input type="hidden" value="{% url 'chat:manage_subject' %}" class="item_url">
  16 +
  17 + <div id="core-subjects-options-div">
  18 + <ul class="core-subjects-options chat-tabs">
  19 + <a href="{% url 'chat:manage_general' %}"><li data-chat="general">{% trans "General" %} (<span>{{ totals.general }}</span>)</li></a>
  20 + <a href="{% url 'chat:manage_category' %}"><li data-chat="category">{% trans "Per Category" %} (<span>{{ totals.category }}</span>)</li></a>
  21 + <a href="{% url 'chat:manage_subject' %}"><li data-chat="subject" class="active">{% trans "Per Subject" %} (<span>{{ totals.subject }}</span>)</li></a>
  22 + </ul>
  23 + </div>
  24 +
  25 + <div class="col-md-12 cards-content">
  26 + {% if subjects.count > 0 %}
  27 + <div class="panel-group" id="accordion" role="tablist" aria-multiselectable="true">
  28 + {% for subject in subjects %}
  29 + {% subject_permissions request.user subject as has_subject_permissions %}
  30 +
  31 + {% if subject.visible or has_subject_permissions %}
  32 + {% if subject.visible %}
  33 + <div class="panel panel-info subject-panel chat-panel">
  34 + <div class="panel-heading">
  35 + {% elif has_subject_permissions %}
  36 + <div class="panel panel-info subject-panel-invisible chat-panel">
  37 + <div class="panel-heading panel-invisible">
  38 + {% endif %}
  39 + <div class="row">
  40 + <div class="col-md-12 category-header">
  41 + <h4 class="panel-title">
  42 + <a class="category-course-link pull-left" data-parent="#accordion" data-toggle="collapse" href="#{{subject.slug}}">
  43 + <button class="btn btn-default btn-xs text-center cat-selector"><i class="fa fa-angle-right fa-2x" aria-hidden="true"></i></button> <span class="item_name">{{ subject }}</span>
  44 +
  45 + (<span class="item_badge" style="margin-left:0px">{{ subject|notifies_subject:request.user }}</span>)
  46 + </a>
  47 + </h4>
  48 +
  49 + <div class="col-md-5 pull-right category-card-items">
  50 + {% if has_subject_permissions %}
  51 + <a href="" id="moreActions" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
  52 + <i class="fa fa-ellipsis-v" aria-hidden="true"></i>
  53 + </a>
  54 + <ul class="dropdown-menu pull-right" aria-labelledby="moreActions">
  55 + {% if request.user not in subject.professor.all %}
  56 + <li><a href="{% url 'subjects:replicate' subject.slug %}"><i class="fa fa-files-o fa-fw" aria-hidden="true"></i>{% trans 'Replicate' %}</a></li>
  57 + {% endif %}
  58 + <li><a href="{% url 'subjects:update' subject.slug %}"><i class="fa fa-pencil fa-fw" aria-hidden="true"></i>{% trans 'Edit' %}</a></li>
  59 + <li><a href="{% url 'groups:index' subject.slug %}"><i class="fa fa-group fa-fw" aria-hidden="true"></i>{% trans 'Groups' %}</a></li>
  60 + <li><a href="javascript:delete_subject.get('{% url 'subjects:delete' subject.slug %}?view=index','#subject','#modal_subject')"><i class="fa fa-trash fa-fw" aria-hidden="true"></i>&nbsp;{% trans 'Remove' %}</a></li>
  61 + </ul>
  62 + {% endif %}
  63 + </div>
  64 + </div>
  65 + </div>
  66 + </div>
  67 + <div id="{{subject.slug}}" class="panel-collapse panel-body collapse chat-collapse"data-url="{% url 'chat:subject_talks' subject.id %}" data-breadurl="{% url 'subjects:view' subject.slug %}" data-breadtext="{% trans 'Participants' %}">
  68 + <div class="panel panel-default">
  69 + <div class="panel-body">
  70 + <div class="col-md-8">
  71 + <form id="search-participants" action="{% url 'chat:participants_subject' subject.id %}" method="GET" class="form-horizontal">
  72 + <div class="form-group">
  73 + <div class="col-md-11 col-sm-11 col-xs-11">
  74 + <input type="text" class="form-control" name="search" value="{{ search }}" placeholder="{% trans 'Search...' %}" />
  75 + </div>
  76 + <div class="col-md-1 col-sm-1 col-xs-1">
  77 + <button type="submit" class="btn btn-fab btn-fab-mini">
  78 + <i class="fa fa-search"></i>
  79 + </button>
  80 + </div>
  81 + </div>
  82 + </form>
  83 + </div>
  84 + <div class="col-md-4">
  85 + <a href="{% url 'chat:participants_subject' subject.id %}" onclick="getParticipants($(this)); return false;" class="pull-right btn btn-default btn-raised btn-md">{% trans 'List all participants' %}</a>
  86 + </div>
  87 + </div>
  88 + </div>
  89 +
  90 + <div class="content">
  91 + </div>
  92 + </div>
  93 + </div>
  94 + {% endif %}
  95 + {% endfor %}
  96 +
  97 + {% pagination request paginator page_obj %}
  98 + </div>
  99 + {% endif %}
  100 + </div>
  101 +
  102 + <div id="modal_subject"></div>
  103 +
  104 + <div class="modal fade" id="chat-modal-info" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"></div>
  105 +
  106 + <div class="modal fade" id="chat-modal-form" tabindex="-1" role="dialog" aria-labelledby="myModalLabel"></div>
  107 +
  108 + <script type="text/javascript" src="{% static 'js/category.js' %}"></script>
  109 + <script type="text/javascript" src="{% static 'js/chat.js' %}"></script>
  110 + <script type="text/javascript" src="{% static 'subjects/js/modal_subject.js' %}"></script>
  111 +{% endblock %}
0 112 \ No newline at end of file
... ...
chat/templatetags/chat_tags.py
... ... @@ -82,4 +82,10 @@ def fav_class(message, user):
82 82 def notifies_category(category, user):
83 83 total = ChatVisualizations.objects.filter(message__talk__categorytalk__space = category, user = user, viewed = False).count()
84 84  
  85 + return total
  86 +
  87 +@register.filter(name = 'notifies_subject')
  88 +def notifies_subject(subject, user):
  89 + total = ChatVisualizations.objects.filter(message__talk__subjecttalk__space = subject, user = user, viewed = False).count()
  90 +
85 91 return total
86 92 \ No newline at end of file
... ...
chat/urls.py
... ... @@ -3,10 +3,13 @@ from . import views
3 3  
4 4 urlpatterns = [
5 5 url(r'^$', views.GeneralIndex.as_view(), name='manage_general'),
6   - url(r'^participants/$', views.GeneralParticipants.as_view(), name='participants_general'),
7 6 url(r'^categories/$', views.CategoryIndex.as_view(), name='manage_category'),
  7 + url(r'^subjects/$', views.SubjectIndex.as_view(), name='manage_subject'),
  8 + url(r'^participants/$', views.GeneralParticipants.as_view(), name='participants_general'),
8 9 url(r'^category/talks/(?P<category>[\w_-]+)/$', views.CategoryTalks.as_view(), name='category_talks'),
9 10 url(r'^category/participants/(?P<category>[\w_-]+)/$', views.CategoryParticipants.as_view(), name='participants_category'),
  11 + url(r'^subject/talks/(?P<subject>[\w_-]+)/$', views.SubjectTalks.as_view(), name='subject_talks'),
  12 + url(r'^subject/participants/(?P<subject>[\w_-]+)/$', views.SubjectParticipants.as_view(), name='participants_subject'),
10 13 url(r'^render_message/([\w_-]+)/([\w_-]+)/([\w_-]+)/([\w_-]+)/([\w.%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4})/$', views.render_message, name='render_message'),
11 14 url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'),
12 15 url(r'^load_messages/([\w_-]+)/$', views.load_messages, name='load_messages'),
... ...
chat/views.py
... ... @@ -135,8 +135,6 @@ class CategoryTalks(LoginRequiredMixin, generic.ListView):
135 135  
136 136 conversations = CategoryTalk.objects.filter((Q(user_one = user) | Q(user_two = user)) & Q(space__id = cat))
137 137  
138   - print(cat)
139   -
140 138 return conversations
141 139  
142 140 def get_context_data(self, **kwargs):
... ... @@ -159,8 +157,6 @@ class CategoryParticipants(LoginRequiredMixin, generic.ListView):
159 157 cat = self.kwargs.get('category', 0)
160 158 search = self.request.GET.get('search', '')
161 159  
162   - print(search)
163   -
164 160 users = User.objects.filter((Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)) & (Q(is_staff = True) | Q(subject_student__category__id = cat) | Q(professors__category__id = cat) | Q(coordinators__id = cat))).distinct().order_by('social_name','username').exclude(email = user.email)
165 161  
166 162 return users
... ... @@ -173,6 +169,87 @@ class CategoryParticipants(LoginRequiredMixin, generic.ListView):
173 169  
174 170 return context
175 171  
  172 +class SubjectIndex(LoginRequiredMixin, generic.ListView):
  173 + login_url = reverse_lazy("users:login")
  174 + redirect_field_name = 'next'
  175 +
  176 + template_name = 'chat/list_subject.html'
  177 + context_object_name = "subjects"
  178 + paginate_by = 10
  179 +
  180 + totals = {}
  181 +
  182 + def get_queryset(self):
  183 + user = self.request.user
  184 + page = self.request.GET.get('page', False)
  185 +
  186 + if user.is_staff:
  187 + subjects = Subject.objects.all()
  188 + else:
  189 + subjects = Subject.objects.filter(Q(professor__pk = user.pk) | Q(students__pk = user.pk, visible = True) | Q(category__coordinators__pk = user.pk)).distinct()
  190 +
  191 + self.totals['general'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__generaltalk__isnull = False).count()
  192 + self.totals['category'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__categorytalk__isnull = False).count()
  193 + self.totals['subject'] = ChatVisualizations.objects.filter(user = user, viewed = False, message__talk__subjecttalk__isnull = False).count()
  194 +
  195 + return subjects
  196 +
  197 + def get_context_data(self, **kwargs):
  198 + context = super(SubjectIndex, self).get_context_data(**kwargs)
  199 +
  200 + context['title'] = _('Messages per Subject')
  201 + context['totals'] = self.totals
  202 + context['chat_menu_active'] = 'subjects_menu_active'
  203 +
  204 + return context
  205 +
  206 +class SubjectTalks(LoginRequiredMixin, generic.ListView):
  207 + login_url = reverse_lazy("users:login")
  208 + redirect_field_name = 'next'
  209 +
  210 + template_name = 'chat/_talks_list.html'
  211 + context_object_name = "conversations"
  212 +
  213 + def get_queryset(self):
  214 + user = self.request.user
  215 + sub = self.kwargs.get('subject', 0)
  216 +
  217 + conversations = SubjectTalk.objects.filter((Q(user_one = user) | Q(user_two = user)) & Q(space__id = sub))
  218 +
  219 + return conversations
  220 +
  221 + def get_context_data(self, **kwargs):
  222 + context = super(SubjectTalks, self).get_context_data(**kwargs)
  223 +
  224 + context['space'] = self.kwargs.get('subject', 0)
  225 + context['space_type'] = 'subject'
  226 +
  227 + return context
  228 +
  229 +class SubjectParticipants(LoginRequiredMixin, generic.ListView):
  230 + login_url = reverse_lazy("users:login")
  231 + redirect_field_name = 'next'
  232 +
  233 + template_name = 'chat/_participants.html'
  234 + context_object_name = "participants"
  235 +
  236 + def get_queryset(self):
  237 + user = self.request.user
  238 + sub = self.kwargs.get('subject', 0)
  239 + search = self.request.GET.get('search', '')
  240 +
  241 + users = User.objects.filter((Q(username__icontains = search) | Q(last_name__icontains = search) | Q(social_name__icontains = search) | Q(email__icontains = search)) & (Q(is_staff = True) | Q(subject_student__id = sub) | Q(professors__id = sub) | Q(coordinators__subject_category__id = sub))).distinct().order_by('social_name','username').exclude(email = user.email)
  242 +
  243 + return users
  244 +
  245 + def get_context_data(self, **kwargs):
  246 + context = super(SubjectParticipants, self).get_context_data(**kwargs)
  247 +
  248 + context['space'] = self.kwargs.get('subject', 0)
  249 + context['space_type'] = 'subject'
  250 +
  251 + return context
  252 +
176 253 class ParticipantProfile(LoginRequiredMixin, generic.DetailView):
177 254 login_url = reverse_lazy("users:login")
178 255 redirect_field_name = 'next'
... ...