Added mark a notification as read feature, Fixed some errors
This commit is contained in:
		
					parent
					
						
							
								c33c4f4148
							
						
					
				
			
			
				commit
				
					
						a846f42bf6
					
				
			
		
					 7 changed files with 153 additions and 11 deletions
				
			
		| 
						 | 
					@ -54,6 +54,7 @@ INSTALLED_APPS = (
 | 
				
			||||||
    'django.contrib.sites',
 | 
					    'django.contrib.sites',
 | 
				
			||||||
    'easy_thumbnails',
 | 
					    'easy_thumbnails',
 | 
				
			||||||
    'utils',
 | 
					    'utils',
 | 
				
			||||||
 | 
					    'stored_messages',
 | 
				
			||||||
    'mptt',
 | 
					    'mptt',
 | 
				
			||||||
    'parler',
 | 
					    'parler',
 | 
				
			||||||
    'taggit',
 | 
					    'taggit',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -3,12 +3,13 @@ import os
 | 
				
			||||||
from django.db import models
 | 
					from django.db import models
 | 
				
			||||||
from django.utils.translation import ugettext_lazy as _
 | 
					from django.utils.translation import ugettext_lazy as _
 | 
				
			||||||
from django.utils.functional import cached_property
 | 
					from django.utils.functional import cached_property
 | 
				
			||||||
from membership.models import StripeCustomer
 | 
					
 | 
				
			||||||
from utils.models import BillingAddress
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
from Crypto.PublicKey import RSA
 | 
					from Crypto.PublicKey import RSA
 | 
				
			||||||
 | 
					from stored_messages.settings import stored_messages_settings
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from membership.models import StripeCustomer
 | 
				
			||||||
 | 
					from utils.models import BillingAddress
 | 
				
			||||||
from .managers import VMPlansManager
 | 
					from .managers import VMPlansManager
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -118,6 +119,13 @@ class VirtualMachinePlan(models.Model):
 | 
				
			||||||
        name = 'vm-%s' % self.id
 | 
					        name = 'vm-%s' % self.id
 | 
				
			||||||
        return name
 | 
					        return name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    @cached_property
 | 
				
			||||||
 | 
					    def notifications(self):
 | 
				
			||||||
 | 
					        stripe_customer = StripeCustomer.objects.get(hostingorder__vm_plan=self)
 | 
				
			||||||
 | 
					        backend = stored_messages_settings.STORAGE_BACKEND()
 | 
				
			||||||
 | 
					        messages = backend.inbox_list(stripe_customer.user)
 | 
				
			||||||
 | 
					        return messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def create(cls, data, user):
 | 
					    def create(cls, data, user):
 | 
				
			||||||
        instance = cls.objects.create(**data)
 | 
					        instance = cls.objects.create(**data)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -71,7 +71,11 @@
 | 
				
			||||||
                                <i class="fa fa-credit-card"></i> My Orders
 | 
					                                <i class="fa fa-credit-card"></i> My Orders
 | 
				
			||||||
                            </a>
 | 
					                            </a>
 | 
				
			||||||
                        </li>
 | 
					                        </li>
 | 
				
			||||||
 | 
					                        <li>
 | 
				
			||||||
 | 
					                            <a href="{% url 'hosting:notifications' %}">
 | 
				
			||||||
 | 
					                                <i class="fa fa-bell"></i> Notifications
 | 
				
			||||||
 | 
					                            </a>
 | 
				
			||||||
 | 
					                        </li>
 | 
				
			||||||
                        <li class="dropdown">
 | 
					                        <li class="dropdown">
 | 
				
			||||||
                          <a class="dropdown-toggle" role="button" data-toggle="dropdown" href="#">
 | 
					                          <a class="dropdown-toggle" role="button" data-toggle="dropdown" href="#">
 | 
				
			||||||
                            <i class="glyphicon glyphicon-user"></i> {{request.user.name}} <span class="caret"></span></a>
 | 
					                            <i class="glyphicon glyphicon-user"></i> {{request.user.name}} <span class="caret"></span></a>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										90
									
								
								hosting/templates/hosting/notifications.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								hosting/templates/hosting/notifications.html
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,90 @@
 | 
				
			||||||
 | 
					{% extends "hosting/base_short.html" %}
 | 
				
			||||||
 | 
					{% load staticfiles bootstrap3 %}
 | 
				
			||||||
 | 
					{% block content %} 
 | 
				
			||||||
 | 
					<div>
 | 
				
			||||||
 | 
						<div class="container virtual-machine-container dashboard-container ">
 | 
				
			||||||
 | 
							<div class="row">
 | 
				
			||||||
 | 
								<div class="col-md-9 col-md-offset-2">
 | 
				
			||||||
 | 
									 <div  class="col-sm-12">
 | 
				
			||||||
 | 
									        <h3><i class="fa fa-bell" aria-hidden="true"></i> Notifications</h3>
 | 
				
			||||||
 | 
									        <hr/>
 | 
				
			||||||
 | 
									        <div class="col-md-3"> <!-- required for floating -->
 | 
				
			||||||
 | 
									          <!-- Nav tabs -->
 | 
				
			||||||
 | 
									          <ul class="nav nav-tabs tabs-left sideways">
 | 
				
			||||||
 | 
									            <li  class="active">
 | 
				
			||||||
 | 
									            	<a href="#unread-v" data-toggle="tab">
 | 
				
			||||||
 | 
									            		Unread  <span class="badge">{{unread_notifications|length}}</span>
 | 
				
			||||||
 | 
									            	</a>
 | 
				
			||||||
 | 
									            </li>
 | 
				
			||||||
 | 
									            <li>
 | 
				
			||||||
 | 
									            	<a href="#all-v" data-toggle="tab">
 | 
				
			||||||
 | 
									            		 All
 | 
				
			||||||
 | 
									            	</a>
 | 
				
			||||||
 | 
									            </li>
 | 
				
			||||||
 | 
									          </ul>
 | 
				
			||||||
 | 
									        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									        <div class="col-md-9">
 | 
				
			||||||
 | 
									          <!-- Tab panes -->
 | 
				
			||||||
 | 
									          <div class="tab-content">
 | 
				
			||||||
 | 
									            <div class="tab-pane active" id="unread-v">
 | 
				
			||||||
 | 
									            	<div class="row">
 | 
				
			||||||
 | 
														<div class="col-md-12">
 | 
				
			||||||
 | 
														<h3>Unread notifications</h3>
 | 
				
			||||||
 | 
														<hr>
 | 
				
			||||||
 | 
														</div>
 | 
				
			||||||
 | 
									            	</div>
 | 
				
			||||||
 | 
													<div class="row">
 | 
				
			||||||
 | 
													  <div class="col-md-12"> 
 | 
				
			||||||
 | 
															{% for notification in unread_notifications %}
 | 
				
			||||||
 | 
																<form method="POST" action="{% url 'hosting:read_notification' notification.id %}">
 | 
				
			||||||
 | 
																	{% csrf_token %} 
 | 
				
			||||||
 | 
																	<span>{{notification}} -</span>
 | 
				
			||||||
 | 
																	<button type="submit" class="btn btn-link">Mark as read</button>
 | 
				
			||||||
 | 
												                	<span  class="pull-right" style="font-size: 11px;color: #999;">{{notification.date}}</span>
 | 
				
			||||||
 | 
																</form>
 | 
				
			||||||
 | 
																<hr/>
 | 
				
			||||||
 | 
															{% endfor %}
 | 
				
			||||||
 | 
													  </div><!--/col-12-->
 | 
				
			||||||
 | 
													</div><!--/row-->
 | 
				
			||||||
 | 
									            </div>
 | 
				
			||||||
 | 
									            <div class="tab-pane" id="all-v">
 | 
				
			||||||
 | 
									            	<div class="row">
 | 
				
			||||||
 | 
														<div class="col-md-12">
 | 
				
			||||||
 | 
														<h3>All notifications</h3>
 | 
				
			||||||
 | 
														<hr>
 | 
				
			||||||
 | 
														{% for notification in all_notifications %}
 | 
				
			||||||
 | 
															<span>{{notification.message}} </span>
 | 
				
			||||||
 | 
															<span class="pull-right" style="font-size: 11px;color: #999;">{{notification.message.date}}</span>
 | 
				
			||||||
 | 
															<hr/>
 | 
				
			||||||
 | 
														{% endfor %}
 | 
				
			||||||
 | 
														</div>
 | 
				
			||||||
 | 
									            	</div>
 | 
				
			||||||
 | 
													<div class="row">
 | 
				
			||||||
 | 
													  <div class="col-md-12"> 
 | 
				
			||||||
 | 
													  </div><!--/col-12-->
 | 
				
			||||||
 | 
													</div><!--/row-->
 | 
				
			||||||
 | 
									            </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									          </div>
 | 
				
			||||||
 | 
									        </div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									        <div class="clearfix"></div>
 | 
				
			||||||
 | 
									</div>
 | 
				
			||||||
 | 
								</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						    </div>
 | 
				
			||||||
 | 
						</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{%endblock%}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,9 +1,10 @@
 | 
				
			||||||
from django.conf.urls import url
 | 
					from django.conf.urls import url
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from .views import DjangoHostingView, RailsHostingView, PaymentVMView, \
 | 
					from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
 | 
				
			||||||
    NodeJSHostingView, LoginView, SignupView, IndexView, \
 | 
					    NodeJSHostingView, LoginView, SignupView, IndexView, \
 | 
				
			||||||
    OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView,\
 | 
					    OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView,\
 | 
				
			||||||
    VirtualMachineDetailView, GenerateVMSSHKeysView, OrdersHostingDeleteView
 | 
					    VirtualMachineDetailView, GenerateVMSSHKeysView, OrdersHostingDeleteView, NotificationsView, \
 | 
				
			||||||
 | 
					    MarkAsReadNotificationView
 | 
				
			||||||
 | 
					
 | 
				
			||||||
urlpatterns = [
 | 
					urlpatterns = [
 | 
				
			||||||
    # url(r'pricing/?$', VMPricingView.as_view(), name='pricing'),
 | 
					    # url(r'pricing/?$', VMPricingView.as_view(), name='pricing'),
 | 
				
			||||||
| 
						 | 
					@ -20,6 +21,9 @@ urlpatterns = [
 | 
				
			||||||
        name='virtual_machines'),
 | 
					        name='virtual_machines'),
 | 
				
			||||||
    url(r'my-virtual-machines/(?P<pk>\d+)/key/?$', GenerateVMSSHKeysView.as_view(),
 | 
					    url(r'my-virtual-machines/(?P<pk>\d+)/key/?$', GenerateVMSSHKeysView.as_view(),
 | 
				
			||||||
        name='virtual_machine_key'),
 | 
					        name='virtual_machine_key'),
 | 
				
			||||||
 | 
					    url(r'^notifications/$', NotificationsView.as_view(), name='notifications'),
 | 
				
			||||||
 | 
					    url(r'^notifications/(?P<pk>\d+)/?$', MarkAsReadNotificationView.as_view(),
 | 
				
			||||||
 | 
					        name='read_notification'),
 | 
				
			||||||
    url(r'login/?$', LoginView.as_view(), name='login'),
 | 
					    url(r'login/?$', LoginView.as_view(), name='login'),
 | 
				
			||||||
    url(r'signup/?$', SignupView.as_view(), name='signup'),
 | 
					    url(r'signup/?$', SignupView.as_view(), name='signup'),
 | 
				
			||||||
    url(r'^logout/?$', 'django.contrib.auth.views.logout',
 | 
					    url(r'^logout/?$', 'django.contrib.auth.views.logout',
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,12 +2,17 @@
 | 
				
			||||||
from django.shortcuts import get_object_or_404, render,render_to_response
 | 
					from django.shortcuts import get_object_or_404, render,render_to_response
 | 
				
			||||||
from django.core.urlresolvers import reverse_lazy, reverse
 | 
					from django.core.urlresolvers import reverse_lazy, reverse
 | 
				
			||||||
from django.contrib.auth.mixins import LoginRequiredMixin
 | 
					from django.contrib.auth.mixins import LoginRequiredMixin
 | 
				
			||||||
 | 
					from django.views.generic import View, CreateView, FormView, ListView, DetailView,\
 | 
				
			||||||
from django.views.generic import View, CreateView, FormView, ListView, DetailView, UpdateView, DeleteView
 | 
					    DeleteView, TemplateView, UpdateView
 | 
				
			||||||
from django.http import HttpResponseRedirect, HttpResponse
 | 
					from django.http import HttpResponseRedirect
 | 
				
			||||||
from django.contrib.auth import authenticate, login
 | 
					from django.contrib.auth import authenticate, login
 | 
				
			||||||
from django.conf import settings
 | 
					from django.conf import settings
 | 
				
			||||||
from django.contrib import messages
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from stored_messages.settings import stored_messages_settings
 | 
				
			||||||
 | 
					from stored_messages.models import Message
 | 
				
			||||||
 | 
					from stored_messages.api import mark_read
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from membership.models import CustomUser, StripeCustomer
 | 
					from membership.models import CustomUser, StripeCustomer
 | 
				
			||||||
from utils.stripe_utils import StripeUtils
 | 
					from utils.stripe_utils import StripeUtils
 | 
				
			||||||
| 
						 | 
					@ -145,6 +150,34 @@ class SignupView(CreateView):
 | 
				
			||||||
        return HttpResponseRedirect(self.get_success_url())
 | 
					        return HttpResponseRedirect(self.get_success_url())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class NotificationsView(TemplateView):
 | 
				
			||||||
 | 
					    template_name = 'hosting/notifications.html'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def get_context_data(self, **kwargs):
 | 
				
			||||||
 | 
					        context = super(NotificationsView, self).get_context_data(**kwargs)
 | 
				
			||||||
 | 
					        backend = stored_messages_settings.STORAGE_BACKEND()
 | 
				
			||||||
 | 
					        unread_notifications = backend.inbox_list(self.request.user)
 | 
				
			||||||
 | 
					        read_notifications = backend.archive_list(self.request.user)
 | 
				
			||||||
 | 
					        context.update({
 | 
				
			||||||
 | 
					            'unread_notifications': unread_notifications,
 | 
				
			||||||
 | 
					            'all_notifications': read_notifications + unread_notifications
 | 
				
			||||||
 | 
					        })
 | 
				
			||||||
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class MarkAsReadNotificationView(LoginRequiredMixin, UpdateView):
 | 
				
			||||||
 | 
					    model = Message
 | 
				
			||||||
 | 
					    success_url = reverse_lazy('hosting:notifications')
 | 
				
			||||||
 | 
					    fields = '__all__'
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def post(self, *args, **kwargs):
 | 
				
			||||||
 | 
					        message = self.get_object()
 | 
				
			||||||
 | 
					        backend = stored_messages_settings.STORAGE_BACKEND()
 | 
				
			||||||
 | 
					        backend.archive_store([self.request.user], message)
 | 
				
			||||||
 | 
					        mark_read(self.request.user, message)
 | 
				
			||||||
 | 
					        return HttpResponseRedirect(reverse('hosting:notifications'))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class GenerateVMSSHKeysView(LoginRequiredMixin, DetailView):
 | 
					class GenerateVMSSHKeysView(LoginRequiredMixin, DetailView):
 | 
				
			||||||
    model = VirtualMachinePlan
 | 
					    model = VirtualMachinePlan
 | 
				
			||||||
    template_name = 'hosting/virtual_machine_key.html'
 | 
					    template_name = 'hosting/virtual_machine_key.html'
 | 
				
			||||||
| 
						 | 
					@ -278,10 +311,11 @@ class OrdersHostingListView(LoginRequiredMixin, ListView):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView):
 | 
					class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView):
 | 
				
			||||||
    login_url=reverse_lazy('hosting:login')
 | 
					    login_url = reverse_lazy('hosting:login')
 | 
				
			||||||
    success_url = reverse_lazy('hosting:orders')
 | 
					    success_url = reverse_lazy('hosting:orders')
 | 
				
			||||||
    model = HostingOrder
 | 
					    model = HostingOrder
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class VirtualMachinesPlanListView(LoginRequiredMixin, ListView):
 | 
					class VirtualMachinesPlanListView(LoginRequiredMixin, ListView):
 | 
				
			||||||
    template_name = "hosting/virtual_machines.html"
 | 
					    template_name = "hosting/virtual_machines.html"
 | 
				
			||||||
    login_url = reverse_lazy('hosting:login')
 | 
					    login_url = reverse_lazy('hosting:login')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,6 +18,7 @@ easy_thumbnails
 | 
				
			||||||
django-polymorphic
 | 
					django-polymorphic
 | 
				
			||||||
model-mommy
 | 
					model-mommy
 | 
				
			||||||
pycryptodome
 | 
					pycryptodome
 | 
				
			||||||
 | 
					django-stored-messages
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#PLUGINS
 | 
					#PLUGINS
 | 
				
			||||||
djangocms_flash
 | 
					djangocms_flash
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue