Browse Source

add client side

devel
Dmitry 10 years ago
parent
commit
ec849b2594
  1. 1
      abonapp/__init__.py
  2. 1
      abonapp/apps.py
  3. 16
      abonapp/views.py
  4. 15
      accounts_app/views.py
  5. 0
      clientsideapp/__init__.py
  6. 3
      clientsideapp/admin.py
  7. 6
      clientsideapp/apps.py
  8. 0
      clientsideapp/migrations/__init__.py
  9. 5
      clientsideapp/models.py
  10. 3
      clientsideapp/tests.py
  11. 10
      clientsideapp/urls.py
  12. 17
      clientsideapp/views.py
  13. 6
      devapp/views.py
  14. 3
      djing/settings_example.py
  15. 1
      djing/urls.py
  16. 5
      djing/views.py
  17. 5
      ip_pool/views.py
  18. 2
      mapapp/views.py
  19. 10
      mydefs.py
  20. 3
      privatemessage/views.py
  21. 48
      static/clientside/ISPlaylist.m3u
  22. BIN
      static/clientside/bc.png
  23. 12
      static/clientside/custom.css
  24. BIN
      static/clientside/poe-splitter.jpg
  25. 3
      tariff_app/views.py
  26. 5
      taskapp/views.py
  27. 3
      templates/base.html
  28. 84
      templates/clientsideapp/buy.html
  29. 85
      templates/clientsideapp/ext.html
  30. 68
      templates/clientsideapp/index.html
  31. 26
      templates/clientsideapp/pays.html

1
abonapp/__init__.py

@ -0,0 +1 @@
default_app_config = 'abonapp.apps.AbonappConfig'

1
abonapp/apps.py

@ -3,3 +3,4 @@ from django.apps import AppConfig
class AbonappConfig(AppConfig):
name = 'abonapp'
verbose_name = 'Abonent app'

16
abonapp/views.py

@ -17,6 +17,7 @@ import mydefs
@login_required
@mydefs.only_admins
def peoples(request, gid):
peopleslist = models.Abon.objects.filter(group=gid)
@ -38,6 +39,7 @@ def peoples(request, gid):
@login_required
@mydefs.only_admins
# @permission_required('abonapp.add_abongroup')
def addgroup(request):
warntext = ''
@ -57,6 +59,7 @@ def addgroup(request):
@login_required
@mydefs.only_admins
def grouplist(request):
groups = models.AbonGroup.objects.annotate(usercount=Count('abon'))
@ -75,6 +78,7 @@ def grouplist(request):
@login_required
@mydefs.only_admins
def delgroup(request):
agd = mydefs.safe_int(request.GET.get('id'))
get_object_or_404(models.AbonGroup, id=agd).delete()
@ -82,6 +86,7 @@ def delgroup(request):
@login_required
@mydefs.only_admins
# @permission_required('abonapp.add_abon')
# @permission_required('abonapp.change_abon')
def addabon(request, gid):
@ -121,6 +126,7 @@ def addabon(request, gid):
@login_required
@mydefs.only_admins
# @permission_required('abonapp.delete_abon')
# @permission_required('abonapp.delete_abongroup')
def delentity(request):
@ -138,6 +144,7 @@ def delentity(request):
@login_required
@mydefs.only_admins
def abonamount(request, gid, uid):
warntext=''
abon = get_object_or_404(models.Abon, id=uid)
@ -158,6 +165,7 @@ def abonamount(request, gid, uid):
@login_required
@mydefs.only_admins
def invoice_for_payment(request, gid, uid):
abon = get_object_or_404(models.Abon, id=uid)
invoices = models.InvoiceForPayment.objects.filter(abon=abon)
@ -170,6 +178,7 @@ def invoice_for_payment(request, gid, uid):
@login_required
@mydefs.only_admins
def pay_history(request, gid, uid):
abon = get_object_or_404(models.Abon, id=uid)
pay_history = models.AbonLog.objects.filter(abon=abon).order_by('-id')
@ -182,6 +191,7 @@ def pay_history(request, gid, uid):
@login_required
@mydefs.only_admins
def abon_services(request, gid, uid):
abon = get_object_or_404(models.Abon, id=uid)
abon_tarifs = models.AbonTariff.objects.filter(abon=abon).order_by('tariff_priority')
@ -195,6 +205,7 @@ def abon_services(request, gid, uid):
@login_required
@mydefs.only_admins
def abonhome(request, gid, uid):
abon = get_object_or_404(models.Abon, id=uid)
abon_group = get_object_or_404(models.AbonGroup, id=gid)
@ -288,6 +299,7 @@ def terminal_pay(request):
@login_required
@mydefs.only_admins
# @permission_required('abonapp.add_invoiceforpayment')
def add_invoice(request, gid, uid):
uid = mydefs.safe_int(uid)
@ -319,6 +331,7 @@ def add_invoice(request, gid, uid):
@login_required
@mydefs.only_admins
def buy_tariff(request, gid, uid):
warntext = ''
frm = None
@ -351,6 +364,7 @@ def buy_tariff(request, gid, uid):
@login_required
@mydefs.only_admins
def chpriority(request, gid, uid):
t = request.GET.get('t')
act = request.GET.get('a')
@ -366,6 +380,7 @@ def chpriority(request, gid, uid):
@login_required
@mydefs.only_admins
def complete_service(request, gid, uid, srvid):
abtar = get_object_or_404(models.AbonTariff, id=srvid)
abon_group = get_object_or_404(models.AbonGroup, id=gid)
@ -440,6 +455,7 @@ def complete_service(request, gid, uid, srvid):
@login_required
@mydefs.only_admins
def log_page(request):
logs = models.AbonLog.objects.all()

15
accounts_app/views.py

@ -12,6 +12,7 @@ import mydefs
@login_required
@mydefs.only_admins
def home(request):
return redirect('profile')
@ -25,12 +26,14 @@ def to_signin(request):
if auser:
login(request, auser)
if nextl == 'None' or nextl == None or nextl == '':
if request.user.is_admin:
return redirect('profile')
else:
return redirect('client_home')
else:
return redirect(nextl)
else:
return render(request, 'accounts/login.html', {
'csrf_token': csrf(request)['csrf_token'],
'next': nextl,
'errmsg': u'Неправильный логин или пароль, попробуйте ещё раз'
})
@ -48,6 +51,7 @@ def sign_out(request):
@login_required
@mydefs.only_admins
def profile_show(request, id=0):
id = mydefs.safe_int(id)
@ -72,6 +76,7 @@ def profile_show(request, id=0):
@login_required
@mydefs.only_admins
def chgroup(request, uid):
usr = get_object_or_404(UserProfile, id=uid)
usergroups = usr.groups.all()
@ -87,6 +92,7 @@ def chgroup(request, uid):
@login_required
@mydefs.only_admins
def ch_ava(request):
if request.method == 'POST':
user = request.user
@ -105,6 +111,7 @@ def ch_ava(request):
@login_required
@mydefs.only_admins
def ch_info(request):
warntext=''
if request.method == 'POST':
@ -132,6 +139,7 @@ def ch_info(request):
@login_required
@mydefs.only_admins
##@permission_required('accounts_app.add_userprofile')
def create_profile(request):
if request.method == 'POST':
@ -182,6 +190,7 @@ def create_profile(request):
@login_required
@mydefs.only_admins
#@permission_required('accounts_app.del_userprofile')
def delete_profile(request, uid):
prf = get_object_or_404(UserProfile, id=uid)
@ -190,6 +199,7 @@ def delete_profile(request, uid):
@login_required
@mydefs.only_admins
def acc_list(request):
users = UserProfile.objects.filter(is_admin=True)
@ -201,6 +211,7 @@ def acc_list(request):
@login_required
@mydefs.only_admins
#@permission_required('accounts_app.change_userprofile')
def perms(request, id):
ingroups = filter(lambda x: x[0] == 'ingroups', request.POST.lists())[0][1]
@ -218,6 +229,7 @@ def perms(request, id):
@login_required
@mydefs.only_admins
def groups(request):
grps = Group.objects.all()
@ -229,6 +241,7 @@ def groups(request):
@login_required
@mydefs.only_admins
#@permission_required('auth.change_group')
def group(request, id):
id = mydefs.safe_int(id)

0
clientsideapp/__init__.py

3
clientsideapp/admin.py

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
clientsideapp/apps.py

@ -0,0 +1,6 @@
from django.apps import AppConfig
class ClientsideappConfig(AppConfig):
name = 'clientsideapp'
verbose_name = 'Client side application'

0
clientsideapp/migrations/__init__.py

5
clientsideapp/models.py

@ -0,0 +1,5 @@
from __future__ import unicode_literals
from django.db import models
# Create your models here.

3
clientsideapp/tests.py

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

10
clientsideapp/urls.py

@ -0,0 +1,10 @@
# -*- coding:utf-8 -*-
from django.conf.urls import url
import views
urlpatterns = [
url(r'^$', views.home, name='client_home'),
url(r'^pays$', views.pays, name='client_pays'),
url(r'^buy$', views.buy_service, name='client_buy')
]

17
clientsideapp/views.py

@ -0,0 +1,17 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import render
@login_required
def home(request):
return render(request, 'clientsideapp/index.html')
@login_required
def pays(request):
return render(request, 'clientsideapp/pays.html')
@login_required
def buy_service(request):
return render(request, 'clientsideapp/buy.html')

6
devapp/views.py

@ -2,11 +2,12 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404
from models import Device
from mydefs import pag_mn, res_success, res_error
from mydefs import pag_mn, res_success, res_error, only_admins
from forms import DeviceForm
@login_required
@only_admins
def devices(request):
devs = Device.objects.all()
devs = pag_mn(request, devs)
@ -17,6 +18,7 @@ def devices(request):
@login_required
@only_admins
def devdel(request, did):
try:
get_object_or_404(Device, id=did).delete()
@ -26,6 +28,7 @@ def devdel(request, did):
@login_required
@only_admins
def dev(request, devid=0):
warntext = ''
devinst = get_object_or_404(Device, id=devid) if devid != 0 else None
@ -48,6 +51,7 @@ def dev(request, devid=0):
@login_required
@only_admins
def devview(request, did):
warntext = ''

3
djing/settings_example.py

@ -36,7 +36,8 @@ INSTALLED_APPS = [
'devapp',
'mapapp',
'statistics',
'taskapp'
'taskapp',
'clientsideapp'
]
MIDDLEWARE_CLASSES = [

1
djing/urls.py

@ -15,6 +15,7 @@ urlpatterns = [
url(r'^map/', include('mapapp.urls')),
url(r'^statistic/', include('statistics.urls')),
url(r'^tasks/', include('taskapp.urls')),
url(r'^client/', include('clientsideapp.urls')),
url(r'^admin/', admin.site.urls),
]

5
djing/views.py

@ -1,8 +1,13 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import redirect
@login_required
def home(request):
if request.user.is_admin:
return redirect('profile')
else:
return redirect('client_home')
def finance_report(request):

5
ip_pool/views.py

@ -6,6 +6,7 @@ import mydefs
@login_required
@mydefs.only_admins
def home(request):
pools = IpPoolItem.objects.get_pools()
print pools
@ -20,6 +21,7 @@ def home(request):
@login_required
@mydefs.only_admins
def ips(request):
ip_start = request.GET.get('ips')
ip_end = request.GET.get('ipe')
@ -37,6 +39,7 @@ def ips(request):
@login_required
@mydefs.only_admins
def del_pool(request):
ip_start = request.GET.get('ips')
ip_end = request.GET.get('ipe')
@ -51,6 +54,7 @@ def del_pool(request):
@login_required
@mydefs.only_admins
def add_pool(request):
if request.method == 'POST':
frm = PoolForm(request.POST)
@ -70,6 +74,7 @@ def add_pool(request):
@login_required
@mydefs.only_admins
def delip(request):
ipid = request.GET.get('id')
get_object_or_404(IpPoolItem, id=ipid).delete()

2
mapapp/views.py

@ -3,9 +3,11 @@ from django.http import HttpResponse
from django.shortcuts import render
from models import Dot
from json import dumps
from mydefs import only_admins
@login_required
@only_admins
def home(request):
return render(request, 'maps/index.html')

10
mydefs.py

@ -128,3 +128,13 @@ def order_helper(request):
return dir, dfx + orby
else:
return dir, orby
# Декоратор проверяет аккаунт, чтоб не пускать клиентов в страницы администрации
def only_admins(fn):
def wrapped(request, *args, **kwargs):
if request.user.is_admin:
return fn(request, *args, **kwargs)
else:
return redirect('client_home')
return wrapped

3
privatemessage/views.py

@ -11,6 +11,7 @@ from accounts_app.models import UserProfile
@login_required
@mydefs.only_admins
def home(request):
msgs = PrivateMessages.objects.all()
return render(request, 'private_messages/index.html', {
@ -19,6 +20,7 @@ def home(request):
@login_required
@mydefs.only_admins
def delitem(request, id=0):
r = {'errnum': 0,'errtext': u''}
try:
@ -32,6 +34,7 @@ def delitem(request, id=0):
@login_required
@mydefs.only_admins
def send_message(request):
if request.method == 'GET':
return HttpResponse(render_to_string('private_messages/send_form.html',{

48
static/clientside/ISPlaylist.m3u

@ -0,0 +1,48 @@
#EXTM3U
#EXTINF:-1,ПЕРВЫЙ КАНАЛ
udp://@239.255.1.15:1234
#EXTINF:-1,Россия-1
udp://@239.255.1.16:1234
#EXTINF:-1,МАТЧ ТВ
udp://@239.255.1.17:1234
#EXTINF:-1,НТВ
udp://@239.255.1.18:1234
#EXTINF:-1,ПЯТЫЙ КАНАЛ
udp://@239.255.1.19:1234
#EXTINF:-1,РОССИЯ-КУЛЬТУРА
udp://@239.255.1.20:1234
#EXTINF:-1,Россия-24
udp://@239.255.1.21:1234
#EXTINF:-1,КАРУСЕЛЬ
udp://@239.255.1.22:1234
#EXTINF:-1,ОТР
udp://@239.255.1.23:1234
#EXTINF:-1,ТВ Центр
udp://@239.255.1.24:1234
#EXTINF:-1,РЕН ТВ
udp://@239.255.1.28:1234
#EXTINF:-1,Спас
udp://@239.255.1.29:1234
#EXTINF:-1,СТС
udp://@239.255.1.30:1234
#EXTINF:-1,Домашний
udp://@239.255.1.31:1234
#EXTINF:-1,ТВ3
udp://@239.255.1.32:1234
#EXTINF:-1,Звезда
udp://@239.255.1.34:1234
#EXTINF:-1,Мир-24
udp://@239.255.1.9:1234
#EXTINF:-1,ТНТ
udp://@239.255.1.35:1234
#EXTINF:-1,МУЗ ТВ
udp://@239.255.1.36:1234
#EXTINF:-1,Крым 24
udp://@239.255.1.14:1234
#EXTINF:-1,Перец
udp://@239.255.1.12:1234

BIN
static/clientside/bc.png

After

Width: 80  |  Height: 71  |  Size: 8.7 KiB

12
static/clientside/custom.css

@ -0,0 +1,12 @@
img.navbar-brand {
width: 59px;
height: 50px;
padding: 0;
margin: 0 15px 0 0;
}
body > .container {
padding: 60px 15px 0;
}
.table thead {
background-color: #ddd;
}

BIN
static/clientside/poe-splitter.jpg

After

Width: 800  |  Height: 571  |  Size: 125 KiB

3
tariff_app/views.py

@ -8,6 +8,7 @@ import forms
@login_required
@mydefs.only_admins
def tarifs(request):
tars = Tariff.objects.all()
@ -26,6 +27,7 @@ def tarifs(request):
@login_required
@mydefs.only_admins
def edit_tarif(request, tarif_id=0):
tarif_id = mydefs.safe_int(tarif_id)
@ -53,6 +55,7 @@ def edit_tarif(request, tarif_id=0):
@login_required
@mydefs.only_admins
def del_tarif(request, id):
tar_id = mydefs.safe_int(id)
get_object_or_404(Tariff, id=tar_id).delete()

5
taskapp/views.py

@ -2,11 +2,12 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404
from models import Task
from mydefs import pag_mn#, order_helper
from mydefs import pag_mn, only_admins#, order_helper
from forms import TaskFrm
@login_required
@only_admins
def home(request):
tasks = Task.objects.all()
@ -26,12 +27,14 @@ def home(request):
@login_required
@only_admins
def task_delete(request, task_id):
get_object_or_404(Task, id=task_id).delete()
return redirect('task_home')
@login_required
@only_admins
def task_add_edit(request, task_id=0):
warntext = ''
if request.method == 'POST':

3
templates/base.html

@ -47,7 +47,8 @@
<ul class="nav navbar-nav">
<li class="active"><a href="/">Главная</a></li>
<li><a href="{% url 'maps_home_link' %}" target="_blank">Карта</a></li>
<li><a href="{% url 'stat_home' %}">График траффика</a> </li>
<li><a href="{% url 'stat_home' %}">График траффика</a></li>
<li><a href="{% url 'client_home' %}">Кабинет клиента</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Другое <b class="caret"></b></a>
<ul class="dropdown-menu">

84
templates/clientsideapp/buy.html

@ -0,0 +1,84 @@
{% extends 'clientsideapp/ext.html' %}
{% block client_main %}
<div class="page-header">
<h3>Заказать услугу</h3>
<p>Ваша текущая услуга <a href="#dv">Стандартный</a> за <b>130</b> руб.</p>
</div>
<div class="container">
<div class="row">
<div class="col-lg-4">
<h4>Ваши услуги</h4>
<ul class="list-group">
<li class="list-group-item">
<a href="#del" class="btn btn-xs btn-link" title="Удалить услугу из списка">
<span class="glyphicon glyphicon-remove"></span>
</a>
<span class="badge">130</span>
<a href="#sdv"><b>Стандартный</b></a>
</li>
<li class="list-group-item">
<a href="#del" class="btn btn-xs btn-link" title="Удалить услугу из списка">
<span class="glyphicon glyphicon-remove"></span>
</a>
<span class="badge">500</span>
<a href="#dsg">Премиум</a>
</li>
<li class="list-group-item">
<a href="#del" class="btn btn-xs btn-link" title="Удалить услугу из списка">
<span class="glyphicon glyphicon-remove"></span>
</a>
<span class="badge">500</span>
<a href="#dsg">Премиум</a>
</li>
</ul>
</div>
<div class="col-lg-8">
<h4>Выберите ещё услугу</h4>
<div class="container-fluid">
<div class="row">
<div class="col-lg-4">
<h3>Название услуги</h3>
<p>Опис</p>
<a href="#" class="btn btn-default">
<span class="glyphicon glyphicon-shopping-cart"></span> Купить
</a>
</div>
<div class="col-lg-4">
<h3>Название услуги</h3>
<p>Описание услуги, длинное длинное</p>
<a href="#" class="btn btn-default">
<span class="glyphicon glyphicon-shopping-cart"></span> Купить
</a>
</div>
<div class="col-lg-4">
<h3>Название услуги</h3>
<p>Описание услуги, длинное длинное</p>
<a href="#" class="btn btn-default">
<span class="glyphicon glyphicon-shopping-cart"></span> Купить
</a>
</div>
<div class="col-lg-4">
<h3>Название услуги</h3>
<p>Описание услуги, длинное длинное</p>
<a href="#" class="btn btn-default">
<span class="glyphicon glyphicon-shopping-cart"></span> Купить
</a>
</div>
<div class="col-lg-4">
<h3>Название услуги</h3>
<p>Описание услуги, длинное длинное</p>
<a href="#" class="btn btn-default">
<span class="glyphicon glyphicon-shopping-cart"></span> Купить
</a>
</div>
</div>
</div>
</div>
</div>
</div>
{% endblock %}

85
templates/clientsideapp/ext.html

@ -0,0 +1,85 @@
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>User side</title>
<link href="/static/css/bootstrap.min.css" rel="stylesheet">
<link href="/static/css/bootstrap-theme.min.css" rel="stylesheet">
<link href="/static/clientside/custom.css" rel="stylesheet">
<script src="/static/js/jquery-2.2.4.min.js"></script>
<script src="/static/js/bootstrap.min.js"></script>
<link rel="shortcut icon" href="/static/img/favicon_m.ico">
</head>
<body>
<!-- Fixed navbar -->
<div class="navbar navbar-default navbar-fixed-top" role="navigation">
<div class="container">
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
<span class="sr-only">Toggle navigation</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<img src="/static/clientside/bc.png" class="navbar-brand">
</div>
<div class="collapse navbar-collapse">
<ul class="nav navbar-nav">
{% url 'client_home' as client_home %}
<li{% if client_home == request.path %} class="active"{% endif %}>
<a href="{{ client_home }}">Личный кабинет</a>
</li>
{% url 'client_pays' as client_pays %}
<li{% if client_pays == request.path %} class="active"{% endif %}>
<a href="{{ client_pays }}">Платежи</a>
</li>
{% url 'client_buy' as client_buy %}
<li{% if client_buy == request.path %} class="active"{% endif %}>
<a href="{{ client_buy }}">Подключить услугу</a>
</li>
<li>
<a href="#">
Сообщения из администрации
<span class="badge">14</span>
</a>
</li>
<li><a href="#contact">График трафика</a></li>
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Другое <b class="caret"></b></a>
<ul class="dropdown-menu">
<li><a href="#">Подать заявку</a></li>
<li><a href="#">Another action</a></li>
<li><a href="#">Сеансы подключений</a></li>
<li class="divider"></li>
<li class="dropdown-header">Nav header</li>
<li><a href="#">Separated link</a></li>
<li><a href="#">Выйти</a></li>
</ul>
</li>
</ul>
</div><!--/.nav-collapse -->
</div>
</div>
<!-- Begin page content -->
<div class="container">
{% block client_main %}{% endblock %}
</div>
<div id="footer">
<div class="container">
<p class="text-muted">Place sticky footer content here.</p>
</div>
</div>
</body>
</html>

68
templates/clientsideapp/index.html

@ -0,0 +1,68 @@
{% extends 'clientsideapp/ext.html' %}
{% block client_main %}
<div class="page-header">
<h3>Тарифы на оказание услуг</h3>
<p>Остаток на счету <b>126</b> руб<br>
Скачать <a href="/static/clientside/ISPlaylist.m3u">IPTV список каналов</a>, кодировка UTF-8</p>
</div>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Стоимость (руб)</th>
<th>Услуга</th>
</tr>
</thead>
<tbody>
<tr>
<td>100-200</td>
<td>Вызов мастера, цена в зависимости от дальности от Нижнегорска</td>
</tr>
<tr>
<td>300</td>
<td>Настройка роутера</td>
</tr>
<tr>
<td>30 руб/метр</td>
<td>Замена кабеля</td>
</tr>
<tr>
<td>50</td>
<td>Обжать кабель</td>
</tr>
<tr>
<td>300</td>
<td>Настройка антены</td>
</tr>
<tr>
<td>4500</td>
<td>Замена антены</td>
</tr>
<tr>
<td>2300, 2100</td>
<td>Купить и настроить роутер (2,1 антенки)</td>
</tr>
<tr>
<td>100</td>
<td>Установка драйвера (с настройкой сетевых установок)</td>
</tr>
<tr>
<td>~</td>
<td>"Что-то не работает" &#8211; по договорённости</td>
</tr>
<tr>
<td>400</td>
<td>Замена блока питания</td>
</tr>
<tr>
<td>200</td>
<td>Замена <a target="_blank" href="/static/clientside/poe-splitter.jpg">инжектора питания POE</a></td>
</tr>
<tr>
<td>200</td>
<td>Настройка TV</td>
</tr>
</tbody>
</table>
{% endblock %}

26
templates/clientsideapp/pays.html

@ -0,0 +1,26 @@
{% extends 'clientsideapp/ext.html' %}
{% block client_main %}
<div class="page-header">
<h3>Проведённые платежи</h3>
</div>
<table class="table table-striped table-bordered">
<thead>
<tr>
<th>Сумма транзакции (руб)</th>
<th>Дата транзакции</th>
<th>Автор платежа</th>
<th>Комментарий</th>
</tr>
</thead>
<tbody>
<tr>
<td>100</td>
<td>08 Сентябрь 2016, 02:30:40</td>
<td><a target="_blank" href="/accounts/1">bashmak</a></td>
<td>Покупка тарифного плана через админку, тариф "New2"</td>
</tr>
</tbody>
</table>
{% endblock %}
Loading…
Cancel
Save