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',
|
||||
'easy_thumbnails',
|
||||
'utils',
|
||||
'stored_messages',
|
||||
'mptt',
|
||||
'parler',
|
||||
'taggit',
|
||||
|
|
|
@ -3,12 +3,13 @@ import os
|
|||
from django.db import models
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.utils.functional import cached_property
|
||||
from membership.models import StripeCustomer
|
||||
from utils.models import BillingAddress
|
||||
|
||||
|
||||
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
|
||||
|
||||
|
||||
|
@ -118,6 +119,13 @@ class VirtualMachinePlan(models.Model):
|
|||
name = 'vm-%s' % self.id
|
||||
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
|
||||
def create(cls, data, user):
|
||||
instance = cls.objects.create(**data)
|
||||
|
|
|
@ -71,7 +71,11 @@
|
|||
<i class="fa fa-credit-card"></i> My Orders
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li>
|
||||
<a href="{% url 'hosting:notifications' %}">
|
||||
<i class="fa fa-bell"></i> Notifications
|
||||
</a>
|
||||
</li>
|
||||
<li class="dropdown">
|
||||
<a class="dropdown-toggle" role="button" data-toggle="dropdown" href="#">
|
||||
<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%}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -3,7 +3,8 @@ from django.conf.urls import url
|
|||
from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
|
||||
NodeJSHostingView, LoginView, SignupView, IndexView, \
|
||||
OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView,\
|
||||
VirtualMachineDetailView, GenerateVMSSHKeysView, OrdersHostingDeleteView
|
||||
VirtualMachineDetailView, GenerateVMSSHKeysView, OrdersHostingDeleteView, NotificationsView, \
|
||||
MarkAsReadNotificationView
|
||||
|
||||
urlpatterns = [
|
||||
# url(r'pricing/?$', VMPricingView.as_view(), name='pricing'),
|
||||
|
@ -20,6 +21,9 @@ urlpatterns = [
|
|||
name='virtual_machines'),
|
||||
url(r'my-virtual-machines/(?P<pk>\d+)/key/?$', GenerateVMSSHKeysView.as_view(),
|
||||
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'signup/?$', SignupView.as_view(), name='signup'),
|
||||
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.core.urlresolvers import reverse_lazy, reverse
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
|
||||
from django.views.generic import View, CreateView, FormView, ListView, DetailView, UpdateView, DeleteView
|
||||
from django.http import HttpResponseRedirect, HttpResponse
|
||||
from django.views.generic import View, CreateView, FormView, ListView, DetailView,\
|
||||
DeleteView, TemplateView, UpdateView
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.contrib.auth import authenticate, login
|
||||
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 utils.stripe_utils import StripeUtils
|
||||
|
@ -145,6 +150,34 @@ class SignupView(CreateView):
|
|||
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):
|
||||
model = VirtualMachinePlan
|
||||
template_name = 'hosting/virtual_machine_key.html'
|
||||
|
@ -282,6 +315,7 @@ class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView):
|
|||
success_url = reverse_lazy('hosting:orders')
|
||||
model = HostingOrder
|
||||
|
||||
|
||||
class VirtualMachinesPlanListView(LoginRequiredMixin, ListView):
|
||||
template_name = "hosting/virtual_machines.html"
|
||||
login_url = reverse_lazy('hosting:login')
|
||||
|
|
|
@ -18,6 +18,7 @@ easy_thumbnails
|
|||
django-polymorphic
|
||||
model-mommy
|
||||
pycryptodome
|
||||
django-stored-messages
|
||||
|
||||
#PLUGINS
|
||||
djangocms_flash
|
||||
|
|
Loading…
Reference in a new issue