Commit 91e85324f74ba84d83fd1d7c98956e84f99ec518

Authored by Zambom
1 parent 90d4aaa1

Adding favorite post function

amadeus/static/css/base/amadeus.css
... ... @@ -1069,4 +1069,8 @@ li.item .notify_badge {
1069 1069 font-size: 14px;
1070 1070 font-style: italic;
1071 1071 cursor: text;
  1072 +}
  1073 +
  1074 +.btn:focus, .btn:active:focus, .btn.active:focus, .btn.focus, .btn:active.focus, .btn.active.focus {
  1075 + outline: none;
1072 1076 }
1073 1077 \ No newline at end of file
... ...
amadeus/static/css/themes/green.css
... ... @@ -534,6 +534,18 @@ a.add-row {
534 534 background: #FFFFFF;
535 535 }
536 536  
  537 +.btn_unfav {
  538 + color: #FF0000 !important;
  539 +}
  540 +
  541 +.btn_fav {
  542 + color: #BBBBBB !important;
  543 +}
  544 +
  545 +.btn:not(.btn-raised):not(.btn-link):focus, .btn:not(.btn-raised):not(.btn-link):hover, .input-group-btn .btn:not(.btn-raised):not(.btn-link):focus, .input-group-btn .btn:not(.btn-raised):not(.btn-link):hover {
  546 + background-color: initial;
  547 +}
  548 +
537 549 @media(max-width: 768px) {
538 550 .navbar .navbar-nav .dropdown .dropdown-menu li > a {
539 551 color: #333333 !important;
... ...
amadeus/static/js/main.js
... ... @@ -14,7 +14,9 @@ $(function () {
14 14 height: 200
15 15 });
16 16  
17   - $('[data-toggle="tooltip"]').tooltip();
  17 + $('[data-toggle="tooltip"]').tooltip({
  18 + trigger: 'hover'
  19 + });
18 20  
19 21 //Dropdown menu collapse
20 22 $('.dropdown-accordion').on('click', 'a[data-toggle="collapse"]', function (event) {
... ...
mural/templates/mural/_view.html
... ... @@ -25,7 +25,7 @@
25 25 </span>
26 26 {% endif %}
27 27 <span class="btn-group pull-right">
28   - <button class="btn btn-sm btn_menu" data-toggle="tooltip" data-placement="top" title="{{ post|fav_label:request.user }}">
  28 + <button class="btn btn-sm btn_menu {{ post|fav_class:request.user }}" onclick="favorite($(this))" data-url="{% url 'mural:favorite' post.mural_ptr_id %}" data-action="{{ post|fav_action:request.user }}" data-toggle="tooltip" data-placement="top" title="{{ post|fav_label:request.user }}">
29 29 <i class="fa fa-thumb-tack"></i>
30 30 </button>
31 31 </span>
... ...
mural/templates/mural/list.html
... ... @@ -102,5 +102,28 @@
102 102 return false;
103 103 });
104 104 }
  105 +
  106 + function favorite(btn) {
  107 + var action = btn.data('action'),
  108 + url = btn.data('url');
  109 +
  110 + $.ajax({
  111 + url: url,
  112 + data: {'action': action},
  113 + dataType: 'json',
  114 + success: function (response) {
  115 + if (action == 'favorite') {
  116 + btn.switchClass("btn_fav", "btn_unfav", 250, "easeInOutQuad");
  117 + btn.data('action', 'unfavorite');
  118 + } else {
  119 + btn.switchClass("btn_unfav", "btn_fav", 250, "easeInOutQuad");
  120 + btn.data('action', 'favorite');
  121 + }
  122 +
  123 + btn.attr('data-original-title', response.label);
  124 + }
  125 + });
  126 +
  127 + }
105 128 </script>
106 129 {% endblock %}
107 130 \ No newline at end of file
... ...
mural/templatetags/mural_filters.py
... ... @@ -19,4 +19,18 @@ def fav_label(post, user):
19 19 if MuralFavorites.objects.filter(post = post, user = user).exists():
20 20 return _('Unfavorite')
21 21  
22   - return _('Favorite')
23 22 \ No newline at end of file
  23 + return _('Favorite')
  24 +
  25 +@register.filter(name = 'fav_action')
  26 +def fav_action(post, user):
  27 + if MuralFavorites.objects.filter(post = post, user = user).exists():
  28 + return "unfavorite"
  29 +
  30 + return "favorite"
  31 +
  32 +@register.filter(name = 'fav_class')
  33 +def fav_class(post, user):
  34 + if MuralFavorites.objects.filter(post = post, user = user).exists():
  35 + return "btn_unfav"
  36 +
  37 + return "btn_fav"
24 38 \ No newline at end of file
... ...
mural/urls.py
... ... @@ -5,4 +5,5 @@ urlpatterns = [
5 5 url(r'^$', views.GeneralIndex.as_view(), name='manage_general'),
6 6 url(r'^create_gen/$', views.GeneralCreate.as_view(), name='create_general'),
7 7 url(r'^render_post/([\w_-]+)/$', views.render_gen_post, name='render_post_general'),
  8 + url(r'^favorite/([\w_-]+)/$', views.favorite, name='favorite'),
8 9 ]
9 10 \ No newline at end of file
... ...
mural/views.py
... ... @@ -6,6 +6,7 @@ from django.template.loader import render_to_string
6 6 from django.core.urlresolvers import reverse, reverse_lazy
7 7 from django.utils.translation import ugettext_lazy as _
8 8 from django.contrib.auth.mixins import LoginRequiredMixin
  9 +from django.contrib.auth.decorators import login_required
9 10 from django.db.models import Q, Count
10 11  
11 12 from channels import Group
... ... @@ -13,7 +14,7 @@ import json
13 14  
14 15 from users.models import User
15 16  
16   -from .models import GeneralPost, CategoryPost, SubjectPost, MuralVisualizations
  17 +from .models import Mural, GeneralPost, CategoryPost, SubjectPost, MuralVisualizations, MuralFavorites
17 18 from .forms import GeneralPostForm
18 19  
19 20 class GeneralIndex(LoginRequiredMixin, generic.ListView):
... ... @@ -103,3 +104,17 @@ def render_gen_post(request, post):
103 104 html = render_to_string("mural/_view.html", context, request)
104 105  
105 106 return JsonResponse({'message': _('Your post was published successfully!'), 'view': html})
  107 +
  108 +@login_required
  109 +def favorite(request, post):
  110 + action = request.GET.get('action', '')
  111 + post = get_object_or_404(Mural, id = post)
  112 +
  113 + if action == 'favorite':
  114 + MuralFavorites.objects.create(post = post, user = request.user)
  115 +
  116 + return JsonResponse({'label': _('Unfavorite')})
  117 + else:
  118 + MuralFavorites.objects.filter(post = post, user = request.user).delete()
  119 +
  120 + return JsonResponse({'label': _('Favorite')})
106 121 \ No newline at end of file
... ...