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. 1
      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): class AbonappConfig(AppConfig):
name = 'abonapp' name = 'abonapp'
verbose_name = 'Abonent app'

16
abonapp/views.py

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

15
accounts_app/views.py

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

3
djing/settings_example.py

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

1
djing/urls.py

@ -15,6 +15,7 @@ urlpatterns = [
url(r'^map/', include('mapapp.urls')), url(r'^map/', include('mapapp.urls')),
url(r'^statistic/', include('statistics.urls')), url(r'^statistic/', include('statistics.urls')),
url(r'^tasks/', include('taskapp.urls')), url(r'^tasks/', include('taskapp.urls')),
url(r'^client/', include('clientsideapp.urls')),
url(r'^admin/', admin.site.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 from django.shortcuts import redirect
@login_required
def home(request): def home(request):
if request.user.is_admin:
return redirect('profile') return redirect('profile')
else:
return redirect('client_home')
def finance_report(request): def finance_report(request):

5
ip_pool/views.py

@ -6,6 +6,7 @@ import mydefs
@login_required @login_required
@mydefs.only_admins
def home(request): def home(request):
pools = IpPoolItem.objects.get_pools() pools = IpPoolItem.objects.get_pools()
print pools print pools
@ -20,6 +21,7 @@ def home(request):
@login_required @login_required
@mydefs.only_admins
def ips(request): def ips(request):
ip_start = request.GET.get('ips') ip_start = request.GET.get('ips')
ip_end = request.GET.get('ipe') ip_end = request.GET.get('ipe')
@ -37,6 +39,7 @@ def ips(request):
@login_required @login_required
@mydefs.only_admins
def del_pool(request): def del_pool(request):
ip_start = request.GET.get('ips') ip_start = request.GET.get('ips')
ip_end = request.GET.get('ipe') ip_end = request.GET.get('ipe')
@ -51,6 +54,7 @@ def del_pool(request):
@login_required @login_required
@mydefs.only_admins
def add_pool(request): def add_pool(request):
if request.method == 'POST': if request.method == 'POST':
frm = PoolForm(request.POST) frm = PoolForm(request.POST)
@ -70,6 +74,7 @@ def add_pool(request):
@login_required @login_required
@mydefs.only_admins
def delip(request): def delip(request):
ipid = request.GET.get('id') ipid = request.GET.get('id')
get_object_or_404(IpPoolItem, id=ipid).delete() 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 django.shortcuts import render
from models import Dot from models import Dot
from json import dumps from json import dumps
from mydefs import only_admins
@login_required @login_required
@only_admins
def home(request): def home(request):
return render(request, 'maps/index.html') return render(request, 'maps/index.html')

10
mydefs.py

@ -128,3 +128,13 @@ def order_helper(request):
return dir, dfx + orby return dir, dfx + orby
else: else:
return dir, orby 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 @login_required
@mydefs.only_admins
def home(request): def home(request):
msgs = PrivateMessages.objects.all() msgs = PrivateMessages.objects.all()
return render(request, 'private_messages/index.html', { return render(request, 'private_messages/index.html', {
@ -19,6 +20,7 @@ def home(request):
@login_required @login_required
@mydefs.only_admins
def delitem(request, id=0): def delitem(request, id=0):
r = {'errnum': 0,'errtext': u''} r = {'errnum': 0,'errtext': u''}
try: try:
@ -32,6 +34,7 @@ def delitem(request, id=0):
@login_required @login_required
@mydefs.only_admins
def send_message(request): def send_message(request):
if request.method == 'GET': if request.method == 'GET':
return HttpResponse(render_to_string('private_messages/send_form.html',{ 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 @login_required
@mydefs.only_admins
def tarifs(request): def tarifs(request):
tars = Tariff.objects.all() tars = Tariff.objects.all()
@ -26,6 +27,7 @@ def tarifs(request):
@login_required @login_required
@mydefs.only_admins
def edit_tarif(request, tarif_id=0): def edit_tarif(request, tarif_id=0):
tarif_id = mydefs.safe_int(tarif_id) tarif_id = mydefs.safe_int(tarif_id)
@ -53,6 +55,7 @@ def edit_tarif(request, tarif_id=0):
@login_required @login_required
@mydefs.only_admins
def del_tarif(request, id): def del_tarif(request, id):
tar_id = mydefs.safe_int(id) tar_id = mydefs.safe_int(id)
get_object_or_404(Tariff, id=tar_id).delete() 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.contrib.auth.decorators import login_required
from django.shortcuts import render, redirect, get_object_or_404 from django.shortcuts import render, redirect, get_object_or_404
from models import Task from models import Task
from mydefs import pag_mn#, order_helper
from mydefs import pag_mn, only_admins#, order_helper
from forms import TaskFrm from forms import TaskFrm
@login_required @login_required
@only_admins
def home(request): def home(request):
tasks = Task.objects.all() tasks = Task.objects.all()
@ -26,12 +27,14 @@ def home(request):
@login_required @login_required
@only_admins
def task_delete(request, task_id): def task_delete(request, task_id):
get_object_or_404(Task, id=task_id).delete() get_object_or_404(Task, id=task_id).delete()
return redirect('task_home') return redirect('task_home')
@login_required @login_required
@only_admins
def task_add_edit(request, task_id=0): def task_add_edit(request, task_id=0):
warntext = '' warntext = ''
if request.method == 'POST': if request.method == 'POST':

1
templates/base.html

@ -48,6 +48,7 @@
<li class="active"><a href="/">Главная</a></li> <li class="active"><a href="/">Главная</a></li>
<li><a href="{% url 'maps_home_link' %}" target="_blank">Карта</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"> <li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown">Другое <b class="caret"></b></a> <a href="#" class="dropdown-toggle" data-toggle="dropdown">Другое <b class="caret"></b></a>
<ul class="dropdown-menu"> <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