css,js,ws
This commit is contained in:
@@ -1,6 +0,0 @@
|
|||||||
from django.apps import AppConfig
|
|
||||||
|
|
||||||
|
|
||||||
class ApiConfig(AppConfig):
|
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
|
||||||
name = 'api'
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
import ros_api
|
|
||||||
|
|
||||||
router = ros_api.Api('192.168.10.1', user='server', password='Cbvgcjy0V', port='8728')
|
|
||||||
r = router.talk('/interface/wireless/cap/print')
|
|
||||||
print(r[0]['enabled'])
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
import netmiko
|
|
||||||
from netmiko import ConnectHandler
|
|
||||||
|
|
||||||
mikrotik_router_1 = {
|
|
||||||
'device_type': 'mikrotik_routeros',
|
|
||||||
'host': '192.168.10.1',
|
|
||||||
'port': '2202',
|
|
||||||
'username': 'server',
|
|
||||||
'password': 'Cbvgcjy0V'
|
|
||||||
}
|
|
||||||
|
|
||||||
sshCli = ConnectHandler(**mikrotik_router_1)
|
|
||||||
print(sshCli.find_prompt())
|
|
||||||
output = sshCli.send_command("/interface ethernet print")
|
|
||||||
print(output)
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
from rest_framework import serializers
|
|
||||||
from django.contrib.auth import get_user_model
|
|
||||||
User = get_user_model()
|
|
||||||
from upanel.models import Device,Hostname
|
|
||||||
|
|
||||||
class DeviceSerializer(serializers.HyperlinkedModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = Device
|
|
||||||
fields = ('id','name', 'device_id','device_ip','local_key','device_version','customuser_id')
|
|
||||||
|
|
||||||
|
|
||||||
class UserSerializer(serializers.HyperlinkedModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = User
|
|
||||||
fields = ('id','username','email','ipaddress')
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
import psycopg2
|
|
||||||
import tinytuya
|
|
||||||
import json
|
|
||||||
from tuya_connector import TuyaOpenAPI
|
|
||||||
|
|
||||||
tuya_file='tuya_con.json'
|
|
||||||
|
|
||||||
def connect_base():
|
|
||||||
conn = psycopg2.connect(host='172.17.0.1',
|
|
||||||
port='54322',
|
|
||||||
user='miroca',
|
|
||||||
password='cbvgcjy0',
|
|
||||||
database='miroca')
|
|
||||||
return conn
|
|
||||||
|
|
||||||
|
|
||||||
def connect_local():
|
|
||||||
device=tinytuya.deviceScan()
|
|
||||||
return device
|
|
||||||
|
|
||||||
def connect_tuya():
|
|
||||||
ACCESS_ID = "pardyqsmdjetwdxjcaxa"
|
|
||||||
ACCESS_KEY = "4f81a40a36f349dc9ad11d53d74cb34b"
|
|
||||||
API_ENDPOINT = "https://openapi.tuyaeu.com"
|
|
||||||
|
|
||||||
try:
|
|
||||||
openapi = TuyaOpenAPI(API_ENDPOINT, ACCESS_ID, ACCESS_KEY)
|
|
||||||
openapi.connect()
|
|
||||||
return openapi
|
|
||||||
except Exception as e:
|
|
||||||
with open(tuya_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump([{'error': str(e)}], f,ensure_ascii=False, indent=4)
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
from itertools import chain
|
|
||||||
from psycopg2.extras import execute_values
|
|
||||||
from connect import *
|
|
||||||
import json
|
|
||||||
|
|
||||||
file_psycopd = 'psycopd_con.json'
|
|
||||||
file_local = 'local_device.json'
|
|
||||||
file_tuya = 'tuya_con.json'
|
|
||||||
|
|
||||||
|
|
||||||
class DeviceError(Exception):
|
|
||||||
pass
|
|
||||||
|
|
||||||
|
|
||||||
def update_base():
|
|
||||||
conn = connect_base()
|
|
||||||
cursor = conn.cursor()
|
|
||||||
count = 0
|
|
||||||
try:
|
|
||||||
with open(file_tuya, 'r', encoding='utf-8') as f:
|
|
||||||
tuya_devices = json.load(f)
|
|
||||||
if tuya_devices['error']:
|
|
||||||
raise DeviceError(tuya_devices['error'])
|
|
||||||
except Exception as e:
|
|
||||||
print(f'Ошибка update_base: {e}')
|
|
||||||
with open(file_local, 'r', encoding='utf-8') as f:
|
|
||||||
local_devices = json.load(f)
|
|
||||||
for device in tuya_devices:
|
|
||||||
if device['result']['id'] == [v for v in local_devices.values()][count]['gwId']:
|
|
||||||
cursor.execute("UPDATE upanel_device SET local_key = %s, name = %s "
|
|
||||||
"WHERE device_id= %s",
|
|
||||||
(device['result']['local_key'],
|
|
||||||
device['result']['name'],
|
|
||||||
device['result']['id']))
|
|
||||||
conn.commit()
|
|
||||||
count += 1
|
|
||||||
cursor.close()
|
|
||||||
|
|
||||||
|
|
||||||
def add_base():
|
|
||||||
conn = connect_base()
|
|
||||||
cursor = conn.cursor()
|
|
||||||
try:
|
|
||||||
with open(file_local, 'r', encoding='utf-8') as f:
|
|
||||||
local_devices_dict = json.load(f)
|
|
||||||
local_devices = {i + 1: v for i, v in enumerate(local_devices_dict.values())}
|
|
||||||
cursor.execute("SELECT * FROM upanel_device")
|
|
||||||
devices = list(chain.from_iterable(cursor.fetchall()))
|
|
||||||
execute_values(cursor, "INSERT INTO upanel_device "
|
|
||||||
"(device_ip, device_id,device_version) "
|
|
||||||
"VALUES %s",
|
|
||||||
[(local_devices_dict[local_devices[device]['ip']]['ip'],
|
|
||||||
local_devices_dict[local_devices[device]['ip']]['gwId'],
|
|
||||||
local_devices_dict[local_devices[device]['ip']]['version'],)
|
|
||||||
for device in local_devices if local_devices[device]['ip'] not in devices])
|
|
||||||
conn.commit()
|
|
||||||
cursor.close()
|
|
||||||
except Exception as e:
|
|
||||||
print(f'ошибка add_base: {e}')
|
|
||||||
with open('error_add.json', 'w', encoding='utf-8') as f:
|
|
||||||
json.dump({'Error_add':e}, f)
|
|
||||||
|
|
||||||
def delete_base():
|
|
||||||
conn = connect_base()
|
|
||||||
cursor = conn.cursor()
|
|
||||||
try:
|
|
||||||
with open(file_local, 'r', encoding='utf-8') as f:
|
|
||||||
local_devices_dict = json.load(f)
|
|
||||||
ip_file=sorted([v for k,v in enumerate(local_devices_dict)])
|
|
||||||
cursor.execute('SELECT * FROM upanel_device')
|
|
||||||
cursor.executemany("DELETE FROM upanel_device WHERE device_ip=%s",
|
|
||||||
[tuple(str(item) for item in ip[2].split())
|
|
||||||
for ip in cursor.fetchall()
|
|
||||||
if ip[2] not in ip_file])
|
|
||||||
conn.commit()
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f'Ошибка delete_base: {e}')
|
|
||||||
with open('error_delete.json', 'w', encoding='utf-8') as f:
|
|
||||||
json.dump({'Error_delete':e}, f)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
add_base()
|
|
||||||
update_base()
|
|
||||||
delete_base()
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
from connect import *
|
|
||||||
|
|
||||||
psycopd_file = 'psycopd_con.json'
|
|
||||||
local_file = 'local_device.json'
|
|
||||||
tuya_file='tuya_con.json'
|
|
||||||
|
|
||||||
def file_base():
|
|
||||||
try:
|
|
||||||
cursor=connect_base().cursor()
|
|
||||||
cursor.execute('SELECT * FROM upanel_device')
|
|
||||||
except Exception as e:
|
|
||||||
with open(psycopd_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump({'error': str(e)}, f)
|
|
||||||
else:
|
|
||||||
with open(psycopd_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump({v[0]:v[1:] for k,v in enumerate(cursor.fetchall())}, f,
|
|
||||||
ensure_ascii=False, indent=4)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def file_local():
|
|
||||||
try:
|
|
||||||
with open(local_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(connect_local(), f, ensure_ascii=False, indent=4)
|
|
||||||
except Exception as e:
|
|
||||||
with open(local_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump({'error': str(e)}, f)
|
|
||||||
|
|
||||||
|
|
||||||
def file_tuya():
|
|
||||||
try:
|
|
||||||
with open(local_file, 'r', encoding='utf-8') as f:
|
|
||||||
local_device = json.load(f)
|
|
||||||
with open(tuya_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump([connect_tuya().get(f"/v1.0/iot-03/devices/{local_device[dev]['id']}")
|
|
||||||
for dev in local_device],f,ensure_ascii=False, indent=4)
|
|
||||||
except Exception as e:
|
|
||||||
with open(tuya_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump({'error': str(e)}, f)
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
file_base()
|
|
||||||
file_local()
|
|
||||||
file_tuya()
|
|
||||||
12
api/urls.py
12
api/urls.py
@@ -1,12 +0,0 @@
|
|||||||
from django.urls import path,include
|
|
||||||
from rest_framework.routers import DefaultRouter
|
|
||||||
from api import views
|
|
||||||
|
|
||||||
router = DefaultRouter()
|
|
||||||
router.register(r'devices', views.DeviceViewSet)
|
|
||||||
router.register(r'user', views.UserViewSet)
|
|
||||||
|
|
||||||
urlpatterns = [
|
|
||||||
path('', include((router.urls, 'app_name'), namespace='api/device')),
|
|
||||||
path('', include((router.urls, 'app_name'), namespace='api/user')),
|
|
||||||
]
|
|
||||||
24
api/views.py
24
api/views.py
@@ -1,24 +0,0 @@
|
|||||||
from django.shortcuts import render
|
|
||||||
from django.contrib.auth import get_user_model
|
|
||||||
User = get_user_model()
|
|
||||||
from rest_framework import viewsets
|
|
||||||
from api.serializers import DeviceSerializer,UserSerializer
|
|
||||||
from upanel.models import *
|
|
||||||
|
|
||||||
from rest_framework.authentication import BasicAuthentication
|
|
||||||
from rest_framework.permissions import IsAuthenticated
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class DeviceViewSet(viewsets.ModelViewSet):
|
|
||||||
authentication_classes = (BasicAuthentication,)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
queryset = Device.objects.values().order_by('id')
|
|
||||||
serializer_class = DeviceSerializer
|
|
||||||
|
|
||||||
|
|
||||||
class UserViewSet(viewsets.ModelViewSet):
|
|
||||||
authentication_classes = (BasicAuthentication,)
|
|
||||||
permission_classes = (IsAuthenticated,)
|
|
||||||
queryset = User.objects.values().order_by('id')
|
|
||||||
serializer_class = UserSerializer
|
|
||||||
73
app/home/templates/home/base/banner.html
Normal file
73
app/home/templates/home/base/banner.html
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
{% load static %}
|
||||||
|
<div class="banner-area bg-cover" style="background-image: url(assets/img/shape-1.png);">
|
||||||
|
<div id="bootcarousel" class="carousel light-bg top-padding text-dark slide animate_text" data-ride="carousel">
|
||||||
|
<!-- Wrapper for slides -->
|
||||||
|
<div class="carousel-inner">
|
||||||
|
<div class="item active">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="double-items">
|
||||||
|
<div class="col-md-7">
|
||||||
|
<div class="info">
|
||||||
|
<h2 data-animation="animated slideInLeft">Умный
|
||||||
|
<strong>Дом</strong></h2>
|
||||||
|
<ul data-animation="animated fadeInLeft">
|
||||||
|
<li>Безопасность</li>
|
||||||
|
<li>Техническая поддержка</li>
|
||||||
|
<li>Панель администратора</li>
|
||||||
|
<li>Адаптивный дизайн</li>
|
||||||
|
</ul>
|
||||||
|
<a data-animation="animated fadeInDown" class="btn circle btn-theme effect btn-md"
|
||||||
|
href="#">Learn more</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-5">
|
||||||
|
<div class="thumb" data-animation="animated slideInRight">
|
||||||
|
<img src="{% static 'file/home/img/illustrations/2.svg' %}" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="double-items">
|
||||||
|
<div class="col-md-7">
|
||||||
|
<div class="info">
|
||||||
|
<h2 data-animation="animated slideInLeft">We're offering <strong>Standard</strong>
|
||||||
|
services</h2>
|
||||||
|
<ul data-animation="animated fadeInLeft">
|
||||||
|
<li>Full Security</li>
|
||||||
|
<li>Team Collaboration</li>
|
||||||
|
<li>Poweful admin panel</li>
|
||||||
|
<li>Create and design responsive</li>
|
||||||
|
</ul>
|
||||||
|
<a data-animation="animated fadeInDown" class="btn circle btn-theme effect btn-md"
|
||||||
|
href="#">Learn more</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-5">
|
||||||
|
<div class="thumb" data-animation="animated slideInRight">
|
||||||
|
<img src="{% static 'file/home/img/illustrations/1.svg' %}" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Wrapper for slides -->
|
||||||
|
|
||||||
|
<!-- Left and right controls -->
|
||||||
|
<a class="left carousel-control theme" href="#bootcarousel" data-slide="prev">
|
||||||
|
<i class="fa fa-angle-left"></i>
|
||||||
|
<span class="sr-only">Previous</span>
|
||||||
|
</a>
|
||||||
|
<a class="right carousel-control theme" href="#bootcarousel" data-slide="next">
|
||||||
|
<i class="fa fa-angle-right"></i>
|
||||||
|
<span class="sr-only">Next</span>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
127
app/home/templates/home/base/footer.html
Normal file
127
app/home/templates/home/base/footer.html
Normal file
@@ -0,0 +1,127 @@
|
|||||||
|
{% load static %}
|
||||||
|
<footer>
|
||||||
|
<div class="svg-shape">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" class="gray" preserveAspectRatio="none" viewBox="0 0 1070 52">
|
||||||
|
<path d="M0,0S247,91,505,32c261.17-59.72,565-13,565-13V0Z"></path>
|
||||||
|
</svg>
|
||||||
|
</div>
|
||||||
|
<div class="container">
|
||||||
|
<div class="f-items default-padding">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-4 col-sm-6 equal-height item">
|
||||||
|
<div class="f-item about">
|
||||||
|
<img src="assets/img/logo.png" alt="Logo">
|
||||||
|
<p>
|
||||||
|
Celebrated conviction stimulated principles day. Sure fail or in said west. Right my front
|
||||||
|
it wound cause fully am sorry if. She jointure goodness interest debating did outweigh.
|
||||||
|
</p>
|
||||||
|
<h5>Stay Update With Us</h5>
|
||||||
|
<form action="#">
|
||||||
|
<div class="input-group stylish-input-group">
|
||||||
|
<input type="email" placeholder="Enter your e-mail here" class="form-control"
|
||||||
|
name="email">
|
||||||
|
<span class="input-group-addon">
|
||||||
|
<button type="submit">
|
||||||
|
<i class="fa fa-paper-plane"></i>
|
||||||
|
</button>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 col-sm-6 equal-height item">
|
||||||
|
<div class="f-item link">
|
||||||
|
<h4>Company</h4>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="#">Home</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">About us</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Compnay History</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Features</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Blog Page</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-2 col-sm-6 equal-height item">
|
||||||
|
<div class="f-item link">
|
||||||
|
<h4>Resources</h4>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="#">Career</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Leadership</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Strategy</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Services</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">History</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4 col-sm-6 equal-height item">
|
||||||
|
<div class="f-item twitter-widget">
|
||||||
|
<h4>Contact Info</h4>
|
||||||
|
<p>
|
||||||
|
Possible offering at contempt mr distance stronger an. Attachment excellence announcing
|
||||||
|
</p>
|
||||||
|
<div class="address">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<div class="info">
|
||||||
|
<h5>Email:</h5>
|
||||||
|
<span>support@validtheme.com</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<div class="info">
|
||||||
|
<h5>Phone:</h5>
|
||||||
|
<span>+44-20-7328-4499</span>
|
||||||
|
</div>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Start Footer Bottom -->
|
||||||
|
<div class="footer-bottom bg-light">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<p>© Copyright 2020. All Rights Reserved by <a href="#">validthemes</a></p>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 text-right link">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="#">Terms</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Privacy</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Support</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Footer Bottom -->
|
||||||
|
</footer>
|
||||||
43
app/home/templates/home/base/head.html
Normal file
43
app/home/templates/home/base/head.html
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{% load static %}
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!--metatextblock--> <title>Умный дом под
|
||||||
|
ключ | Заказать системы умного дома: расчет, установка и подключение оборудования, готовые
|
||||||
|
комплекты</title>
|
||||||
|
<meta name="description"
|
||||||
|
content="Умный дом под ключ по всей России с гарантией. Заказать систему умный дом от проектирования и расчета стоимости до подключения и установки оборудования и готовых комплектов умного дома.">
|
||||||
|
<meta name="keywords" content="умный дом">
|
||||||
|
<meta property="og:url" content="http://miroca.ru">
|
||||||
|
<meta property="og:title" content="Miroca">
|
||||||
|
<meta property="og:description"
|
||||||
|
content="Установка системы умный дом по всей России. От проектирования до монтажа и обслуживания. Рассчитайте свой проект.">
|
||||||
|
<meta property="og:type" content="website">
|
||||||
|
<link rel="canonical" href="https://miroca.ru/"> <!--/metatextblock-->
|
||||||
|
<meta name="format-detection" content="telephone=no">
|
||||||
|
<meta http-equiv="x-dns-prefetch-control" content="on">
|
||||||
|
<link rel="shortcut icon" href="{% static 'file/home/img/favicon.ico' %}" type="image/x-icon">
|
||||||
|
|
||||||
|
<!-- ========== Start Stylesheet ========== -->
|
||||||
|
<link href="{% static 'file/home/css/bootstrap.min.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/font-awesome.min.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/themify-icons.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/flaticon-set.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/magnific-popup.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/owl.carousel.min.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/owl.theme.default.min.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/animate.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/bootsnav.css' %}" rel="stylesheet" />
|
||||||
|
<link href="{% static 'file/home/css/style.css' %}" rel="stylesheet">
|
||||||
|
<link href="{% static 'file/home/css/responsive.css' %}" rel="stylesheet" />
|
||||||
|
<!-- ========== End Stylesheet ========== -->
|
||||||
|
|
||||||
|
<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
|
||||||
|
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
|
||||||
|
<!--[if lt IE 9]>
|
||||||
|
<script src="{% static 'file/js/html5/html5shiv.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/js/html5/respond.min.js' %}"></script>
|
||||||
|
<![endif]-->
|
||||||
|
|
||||||
|
<!-- ========== Google Fonts ========== -->
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro&display=swap" rel="stylesheet">
|
||||||
|
<link href="https://fonts.googleapis.com/css?family=Poppins:400,500,600,700,800" rel="stylesheet">
|
||||||
57
app/home/templates/home/base/header.html
Normal file
57
app/home/templates/home/base/header.html
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{% load static %}
|
||||||
|
<header id="home">
|
||||||
|
|
||||||
|
<!-- Start Navigation -->
|
||||||
|
<nav class="navbar navbar-default active-bg inc-border navbar-fixed dark no-background bootsnav">
|
||||||
|
|
||||||
|
<div class="container-full">
|
||||||
|
|
||||||
|
<!-- Start Atribute Navigation -->
|
||||||
|
<div class="attr-nav button fixed-nav">
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<a href="#">Вход</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a href="#">Регистрация</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!-- End Atribute Navigation -->
|
||||||
|
|
||||||
|
<!-- Start Header Navigation -->
|
||||||
|
<div class="navbar-header">
|
||||||
|
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#navbar-menu">
|
||||||
|
<i class="fa fa-bars"></i>
|
||||||
|
</button>
|
||||||
|
<a class="navbar-brand" href="/">
|
||||||
|
<img src="{% static 'file/home/img/miroca.png' %}" class="logo" alt="Logo">
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<!-- End Header Navigation -->
|
||||||
|
|
||||||
|
<!-- Collect the nav links, forms, and other content for toggling -->
|
||||||
|
<div class="collapse navbar-collapse" id="navbar-menu">
|
||||||
|
<ul class="nav navbar-nav navbar-right" data-in="#" data-out="#">
|
||||||
|
<li class="dropdown active dropdown-right">
|
||||||
|
<a href="#home">Главная</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="smooth-menu" href="#services">Сервис</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="smooth-menu" href="#overview">Обзор</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="smooth-menu" href="#pricing">Прайс</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="smooth-menu" href="#contact">Контакты</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div><!-- /.navbar-collapse -->
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
<!-- End Navigation -->
|
||||||
|
|
||||||
|
</header>
|
||||||
811
app/home/templates/home/content/index.html
Normal file
811
app/home/templates/home/content/index.html
Normal file
@@ -0,0 +1,811 @@
|
|||||||
|
{% extends 'home/base/base.html' %}
|
||||||
|
{% load static %}
|
||||||
|
{% block content%}
|
||||||
|
<!-- Preloader Start -->
|
||||||
|
<div class="se-pre-con"></div>
|
||||||
|
<!-- Preloader Ends -->
|
||||||
|
|
||||||
|
<!-- Header
|
||||||
|
============================================= -->
|
||||||
|
{% include 'home/base/header.html' %}
|
||||||
|
<!-- End Header -->
|
||||||
|
|
||||||
|
<!-- Start Banner
|
||||||
|
============================================= -->
|
||||||
|
{% include 'home/base/banner.html' %}
|
||||||
|
<!-- End Banner -->
|
||||||
|
|
||||||
|
<!-- Start Our feature
|
||||||
|
============================================= -->
|
||||||
|
<div id="features" class="features-area bg-gray shape default-padding">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<!-- Start Features Content -->
|
||||||
|
<div class="features-content">
|
||||||
|
<div class="col-md-5 thumb">
|
||||||
|
<img src="assets/img/illustrations/9.svg" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-7 info">
|
||||||
|
<div class="info-items">
|
||||||
|
<div class="features">
|
||||||
|
<div class="row">
|
||||||
|
<!-- Left Grid -->
|
||||||
|
<div class="col-md-6 col-sm-6 equal-height">
|
||||||
|
<div class="item">
|
||||||
|
<i class="flaticon-dashboard"></i>
|
||||||
|
<p>
|
||||||
|
situation perpetual allowance offending as principle satisfied. Improved
|
||||||
|
carriage securing.
|
||||||
|
</p>
|
||||||
|
<h4>Monitoring</h4>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<i class="flaticon-question"></i>
|
||||||
|
<p>
|
||||||
|
Fortune account written prepare invited no passage. Garrets use ten you the
|
||||||
|
weather ferrars.
|
||||||
|
</p>
|
||||||
|
<h4>Support Chat</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Left Grid -->
|
||||||
|
|
||||||
|
<!-- Right Grid -->
|
||||||
|
<div class="col-md-6 col-sm-6 equal-height">
|
||||||
|
<div class="item">
|
||||||
|
<i class="flaticon-analysis"></i>
|
||||||
|
<p>
|
||||||
|
Offending delivered questions met. Acceptance she interested new boisterous
|
||||||
|
discretion celebrated.
|
||||||
|
</p>
|
||||||
|
<h4>System Analysis</h4>
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<i class="flaticon-rocket"></i>
|
||||||
|
<p>
|
||||||
|
Jennings dashwood to quitting marriage bachelor in. On as conviction in of
|
||||||
|
appearance.
|
||||||
|
</p>
|
||||||
|
<h4>First Run</h4>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Right Grid -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Features Content -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Our Features -->
|
||||||
|
|
||||||
|
<!-- Start Our About
|
||||||
|
============================================= -->
|
||||||
|
<div id="about" class="about-area half-bg default-padding">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<!-- Start About Content -->
|
||||||
|
<div class="about-content">
|
||||||
|
<div class="col-md-12 info">
|
||||||
|
<div class="content-info">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 left-info text-light">
|
||||||
|
<h4>Our Story</h4>
|
||||||
|
<h2>We're knowledgeable about making benefits higher</h2>
|
||||||
|
<p>
|
||||||
|
Change wholly say why eldest period. Are projection put celebrated particular
|
||||||
|
unreserved joy unsatiable its. In then dare good am rose bred or. On am in nearer
|
||||||
|
square wanted.
|
||||||
|
</p>
|
||||||
|
<a class="popup-youtube light video-play-button relative"
|
||||||
|
href="https://www.youtube.com/watch?v=owhuBrGIOsE">
|
||||||
|
<i class="fa fa-play"></i>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 right-info">
|
||||||
|
<p>
|
||||||
|
Fully begin on by wound an. Girl rich in do up or both. At declared in as rejoiced
|
||||||
|
of together. He impression collecting delightful unpleasant by prosperous as on. End
|
||||||
|
too talent she object mrs wanted remove giving.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
In on announcing if of comparison pianoforte projection. Maids hoped gay yet bed
|
||||||
|
asked blind dried point. On abroad danger likely regret twenty edward do. Too
|
||||||
|
horrible consider followed may differed age. An rest if more five mr of. Age just
|
||||||
|
her rank met down way. unaffected partiality indulgence dispatched to of celebrated
|
||||||
|
remarkably. Unfeeling are had allowance own perceived abilities.
|
||||||
|
</p>
|
||||||
|
<a class="btn circle btn-theme border btn-md" href="#">Learn more</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End About -->
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Our About -->
|
||||||
|
|
||||||
|
<!-- Start Services Area
|
||||||
|
============================================= -->
|
||||||
|
<div id="services" class="services-area half-bg default-padding-top bottom-less">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8 col-md-offset-2">
|
||||||
|
<div class="site-heading text-center">
|
||||||
|
<h4>What we offer</h4>
|
||||||
|
<h2>Our <strong>Services</strong></h2>
|
||||||
|
<p>
|
||||||
|
Described questions for recommend advantage belonging estimable had. Pianoforte reasonable as so
|
||||||
|
am inhabiting. Chatty design remark and his abroad figure but its.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="services-items text-center">
|
||||||
|
<div class="row">
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="col-md-4 equal-height">
|
||||||
|
<div class="item">
|
||||||
|
<h4>Project creation</h4>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="flaticon-architect"></i>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
Intention defective at convinced. Led income months itself and houses you. After nor you
|
||||||
|
leave might share court balls.
|
||||||
|
</p>
|
||||||
|
<a href="#"><i class="fas fa-angle-right"></i> Learn more</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="col-md-4 equal-height">
|
||||||
|
<div class="item">
|
||||||
|
<h4>Software Development</h4>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="flaticon-software"></i>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
Intention defective at convinced. Led income months itself and houses you. After nor you
|
||||||
|
leave might share court balls.
|
||||||
|
</p>
|
||||||
|
<a href="#"><i class="fas fa-angle-right"></i> Learn more</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="col-md-4 equal-height">
|
||||||
|
<div class="item">
|
||||||
|
<h4>Porject Management</h4>
|
||||||
|
<div class="icon">
|
||||||
|
<i class="flaticon-testing"></i>
|
||||||
|
</div>
|
||||||
|
<p>
|
||||||
|
Intention defective at convinced. Led income months itself and houses you. After nor you
|
||||||
|
leave might share court balls.
|
||||||
|
</p>
|
||||||
|
<a href="#"><i class="fas fa-angle-right"></i> Learn more</a>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Services Area -->
|
||||||
|
|
||||||
|
<!-- Start Work Process Area
|
||||||
|
============================================= -->
|
||||||
|
<div id="overview" class="process-area default-padding">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 thumb">
|
||||||
|
<img src="assets/img/illustrations/5.svg" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 info">
|
||||||
|
<h4>How it works</h4>
|
||||||
|
<h2>Designed for startups with expert developer</h2>
|
||||||
|
<!-- Tab Nav -->
|
||||||
|
<div class="tab-navigation text-center">
|
||||||
|
<ul class="nav nav-pills">
|
||||||
|
<li class="active">
|
||||||
|
<a data-toggle="tab" href="#tab1" aria-expanded="true">
|
||||||
|
Optimization
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a data-toggle="tab" href="#tab2" aria-expanded="false">
|
||||||
|
Integration
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a data-toggle="tab" href="#tab3" aria-expanded="false">
|
||||||
|
Performance
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
<!-- End Tab Nav -->
|
||||||
|
<!-- Start Tab Content -->
|
||||||
|
<div class="tab-content">
|
||||||
|
|
||||||
|
<!-- Start Single Item -->
|
||||||
|
<div id="tab1" class="tab-pane fade active in">
|
||||||
|
<div class="info">
|
||||||
|
<p>
|
||||||
|
Celebrated conviction stimulated principles day. Sure fail or in said west. Right my
|
||||||
|
front it wound cause fully am sorry if. She jointure goodness interest debating did
|
||||||
|
outweigh. Is time from them.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<h5>Amazingly Simple Use</h5>
|
||||||
|
Certainty arranging am smallness by conveying
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>Clear Documentation</h5>
|
||||||
|
Frankness pronounce daughters remainder extensive
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>Flexible user interface</h5>
|
||||||
|
Outward general passage another as it. Very his are come man walk one next.
|
||||||
|
Delighted prevailed supported
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
|
||||||
|
<!-- Start Single Item -->
|
||||||
|
<div id="tab2" class="tab-pane fade">
|
||||||
|
<div class="info">
|
||||||
|
<p>
|
||||||
|
Consulted or acuteness dejection an smallness if. Outward general passage another as it.
|
||||||
|
Very his are come man walk one next. partiality affronting unpleasant why add. Esteem
|
||||||
|
garden men yet shy course Consulted.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<h5>Amazingly Simple Use</h5>
|
||||||
|
Certainty arranging am smallness by conveying
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>Clear Documentation</h5>
|
||||||
|
Frankness pronounce daughters remainder extensive
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>Flexible user interface</h5>
|
||||||
|
Outward general passage another as it. Very his are come man walk one next.
|
||||||
|
Delighted prevailed supported
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
|
||||||
|
<!-- Start Single Item -->
|
||||||
|
<div id="tab3" class="tab-pane fade">
|
||||||
|
<div class="info">
|
||||||
|
<p>
|
||||||
|
Celebrated conviction stimulated principles day. Sure fail or in said west. Right my
|
||||||
|
front it wound cause fully am sorry if. She jointure goodness interest debating did
|
||||||
|
outweigh. Is time from them.
|
||||||
|
</p>
|
||||||
|
<ul>
|
||||||
|
<li>
|
||||||
|
<h5>Amazingly Simple Use</h5>
|
||||||
|
Certainty arranging am smallness by conveying
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>Clear Documentation</h5>
|
||||||
|
Frankness pronounce daughters remainder extensive
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<h5>Flexible user interface</h5>
|
||||||
|
Outward general passage another as it. Very his are come man walk one next.
|
||||||
|
Delighted prevailed supported
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
</div>
|
||||||
|
<!-- End Tab Content -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Work Process Area -->
|
||||||
|
|
||||||
|
<!-- Start Pricing Area
|
||||||
|
============================================= -->
|
||||||
|
<div id="pricing" class="pricing-area bg-gray shape default-padding-top">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8 col-md-offset-2">
|
||||||
|
<div class="site-heading text-center">
|
||||||
|
<h4>Pricing Plan</h4>
|
||||||
|
<h2>Our <strong>Pricing</strong></h2>
|
||||||
|
<p>
|
||||||
|
Described questions for recommend advantage belonging estimable had. Pianoforte reasonable as so
|
||||||
|
am inhabiting. Chatty design remark and his abroad figure but its.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="pricing pricing-simple text-center">
|
||||||
|
<div class="col-md-12 pricing-items">
|
||||||
|
<div class="col-md-4 single-item">
|
||||||
|
<div class="pricing-item">
|
||||||
|
<ul>
|
||||||
|
<li class="pricing-header">
|
||||||
|
<i class="flaticon-start"></i>
|
||||||
|
<h4>Trial Version</h4>
|
||||||
|
</li>
|
||||||
|
<li class="price">
|
||||||
|
<h2>Free</h2>
|
||||||
|
</li>
|
||||||
|
<li>Demo file <span data-toggle="tooltip" data-placement="top" title=""
|
||||||
|
data-original-title="Available on pro version"><i
|
||||||
|
class="fas fa-info-circle"></i></span></li>
|
||||||
|
<li>Update</li>
|
||||||
|
<li>File compressed</li>
|
||||||
|
<li>Commercial use</li>
|
||||||
|
<li>Support <span data-toggle="tooltip" data-placement="top" title=""
|
||||||
|
data-original-title="Available on pro version"><i
|
||||||
|
class="fas fa-info-circle"></i></span></li>
|
||||||
|
<li>2 database</li>
|
||||||
|
<li>Documetation <span data-toggle="tooltip" data-placement="top" title=""
|
||||||
|
data-original-title="Available on pro version"><i
|
||||||
|
class="fas fa-info-circle"></i></span></li>
|
||||||
|
<li class="footer">
|
||||||
|
<a class="btn btn-dark border btn-sm" href="#">Try for free</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4 single-item">
|
||||||
|
<div class="pricing-item active">
|
||||||
|
<ul>
|
||||||
|
<li class="pricing-header">
|
||||||
|
<i class="flaticon-quality-badge"></i>
|
||||||
|
<h4>Regular</h4>
|
||||||
|
</li>
|
||||||
|
<li class="price">
|
||||||
|
<h2><sup>$</sup>29 <sub>/ Mo</sub></h2>
|
||||||
|
</li>
|
||||||
|
<li>Demo file</li>
|
||||||
|
<li>Update <span data-toggle="tooltip" data-placement="top" title=""
|
||||||
|
data-original-title="Only for extended licence"><i
|
||||||
|
class="fas fa-info-circle"></i></span></li>
|
||||||
|
<li>File compressed</li>
|
||||||
|
<li>Commercial use</li>
|
||||||
|
<li>Support <span data-toggle="tooltip" data-placement="top" title=""
|
||||||
|
data-original-title="Only for extended licence"><i
|
||||||
|
class="fas fa-info-circle"></i></span></li>
|
||||||
|
<li>5 database</li>
|
||||||
|
<li>Documetation</li>
|
||||||
|
<li class="footer">
|
||||||
|
<a class="btn btn-theme effect btn-sm" href="#">Get Started</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4 single-item">
|
||||||
|
<div class="pricing-item">
|
||||||
|
<ul>
|
||||||
|
<li class="pricing-header">
|
||||||
|
<i class="flaticon-value"></i>
|
||||||
|
<h4>Extended</h4>
|
||||||
|
</li>
|
||||||
|
<li class="price">
|
||||||
|
<h2><sup>$</sup>59 <sub>/ Mo</sub></h2>
|
||||||
|
</li>
|
||||||
|
<li>Demo file</li>
|
||||||
|
<li>Update</li>
|
||||||
|
<li>File compressed</li>
|
||||||
|
<li>Commercial use</li>
|
||||||
|
<li>Support</li>
|
||||||
|
<li>8 database</li>
|
||||||
|
<li>Documetation</li>
|
||||||
|
<li class="footer">
|
||||||
|
<a class="btn btn-dark border btn-sm" href="#">Get Started</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Pricing Area -->
|
||||||
|
|
||||||
|
<!-- Start Team Area
|
||||||
|
============================================= -->
|
||||||
|
<div id="team" class="team-area shape default-padding bottom-less">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8 col-md-offset-2">
|
||||||
|
<div class="site-heading text-center">
|
||||||
|
<h4>Meet our experts</h4>
|
||||||
|
<h2>Team <strong>Members</strong></h2>
|
||||||
|
<p>
|
||||||
|
Described questions for recommend advantage belonging estimable had. Pianoforte reasonable as so
|
||||||
|
am inhabiting. Chatty design remark and his abroad figure but its.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="team-items text-center">
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="col-md-4 single-item">
|
||||||
|
<div class="item">
|
||||||
|
<div class="thumb">
|
||||||
|
<img src="assets/img/800x800.png" alt="Thumb">
|
||||||
|
<div class="social">
|
||||||
|
<ul>
|
||||||
|
<li class="facebook">
|
||||||
|
<a href="#"><i class="fab fa-facebook-f"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="twitter">
|
||||||
|
<a href="#"><i class="fab fa-twitter"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="instagram">
|
||||||
|
<a href="#"><i class="fab fa-instagram"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="linkedin">
|
||||||
|
<a href="#"><i class="fab fa-linkedin-in"></i></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
|
||||||
|
<h4>Jessica Jones</h4>
|
||||||
|
<span>Sales & Marketing</span>
|
||||||
|
<p>
|
||||||
|
Required honoured trifling eat pleasure man relation. Assurance yet bed was improving
|
||||||
|
furniture Distrusts delighted
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="col-md-4 single-item">
|
||||||
|
<div class="item">
|
||||||
|
<div class="thumb">
|
||||||
|
<img src="assets/img/800x800.png" alt="Thumb">
|
||||||
|
<div class="social">
|
||||||
|
<ul>
|
||||||
|
<li class="facebook">
|
||||||
|
<a href="#"><i class="fab fa-facebook-f"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="twitter">
|
||||||
|
<a href="#"><i class="fab fa-twitter"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="instagram">
|
||||||
|
<a href="#"><i class="fab fa-instagram"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="linkedin">
|
||||||
|
<a href="#"><i class="fab fa-linkedin-in"></i></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
|
||||||
|
<h4>Amir Bubhan</h4>
|
||||||
|
<span>Data Scientist</span>
|
||||||
|
<p>
|
||||||
|
Required honoured trifling eat pleasure man relation. Assurance yet bed was improving
|
||||||
|
furniture Distrusts delighted
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="col-md-4 single-item">
|
||||||
|
<div class="item">
|
||||||
|
<div class="thumb">
|
||||||
|
<img src="assets/img/800x800.png" alt="Thumb">
|
||||||
|
<div class="social">
|
||||||
|
<ul>
|
||||||
|
<li class="facebook">
|
||||||
|
<a href="#"><i class="fab fa-facebook-f"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="twitter">
|
||||||
|
<a href="#"><i class="fab fa-twitter"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="instagram">
|
||||||
|
<a href="#"><i class="fab fa-instagram"></i></a>
|
||||||
|
</li>
|
||||||
|
<li class="linkedin">
|
||||||
|
<a href="#"><i class="fab fa-linkedin-in"></i></a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="info">
|
||||||
|
|
||||||
|
<h4>Ahel Natasha</h4>
|
||||||
|
<span>Chairman</span>
|
||||||
|
<p>
|
||||||
|
Required honoured trifling eat pleasure man relation. Assurance yet bed was improving
|
||||||
|
furniture Distrusts delighted
|
||||||
|
</p>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Team Area -->
|
||||||
|
|
||||||
|
<!-- Start Testimonials Area
|
||||||
|
============================================= -->
|
||||||
|
<div class="testimonials-area default-padding bg-dark text-light">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8 col-md-offset-2">
|
||||||
|
<div class="site-heading text-center">
|
||||||
|
<h4>What people says</h4>
|
||||||
|
<h2>Customer <strong>Review</strong></h2>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-8 col-md-offset-2">
|
||||||
|
<div class="row">
|
||||||
|
<div class="testimonial-items testimonial-carousel owl-carousel owl-theme">
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="item">
|
||||||
|
<div class="col-md-5 thumb">
|
||||||
|
<img src="assets/img/800x800.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-7 info">
|
||||||
|
<i class="ti-quote-left"></i>
|
||||||
|
<h4>Jessica Jones</h4>
|
||||||
|
<span>Market researcher</span>
|
||||||
|
<p>
|
||||||
|
Music leave say doors him. Tore bred form if sigh case as do. Staying he no looking if
|
||||||
|
do opinion. Sentiments way understood end partiality and his.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="item">
|
||||||
|
<div class="col-md-5 thumb">
|
||||||
|
<img src="assets/img/800x800.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="col-md-7 info">
|
||||||
|
<i class="ti-quote-left"></i>
|
||||||
|
<h4>Jessica Jones</h4>
|
||||||
|
<span>Market researcher</span>
|
||||||
|
<p>
|
||||||
|
Music leave say doors him. Tore bred form if sigh case as do. Staying he no looking if
|
||||||
|
do opinion. Sentiments way understood end partiality and his.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Testimonials Area -->
|
||||||
|
|
||||||
|
<!-- Start Contact Area
|
||||||
|
============================================= -->
|
||||||
|
<div id="contact" class="contact-area default-padding">
|
||||||
|
<div class="container">
|
||||||
|
<div class="contact-items">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6 faq">
|
||||||
|
<div class="heading">
|
||||||
|
<h2>Answer & Questions</h2>
|
||||||
|
</div>
|
||||||
|
<div class="acd-items acd-arrow">
|
||||||
|
<div class="panel-group symb" id="accordion">
|
||||||
|
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a data-toggle="collapse" data-parent="#accordion" href="#ac1">
|
||||||
|
<strong>01</strong> Do I need a business plan?
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="ac1" class="panel-collapse collapse in">
|
||||||
|
<div class="panel-body">
|
||||||
|
<p>
|
||||||
|
Removing welcomed civility or hastened is. Justice elderly but perhaps
|
||||||
|
expense six her are another passage. Full her ten open fond walk not
|
||||||
|
down.For request general express unknown are. Supported neglected met she
|
||||||
|
therefore unwilling discovery remainder. Way sentiments two indulgence
|
||||||
|
uncommonly own.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a data-toggle="collapse" data-parent="#accordion" href="#ac2">
|
||||||
|
<strong>02</strong> How long should a business plan be?
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="ac2" class="panel-collapse collapse">
|
||||||
|
<div class="panel-body">
|
||||||
|
<p>
|
||||||
|
Removing welcomed civility or hastened is. Justice elderly but perhaps
|
||||||
|
expense six her are another passage. Full her ten open fond walk not
|
||||||
|
down.For request general express unknown are. Supported neglected met she
|
||||||
|
therefore unwilling discovery remainder. Way sentiments two indulgence
|
||||||
|
uncommonly own.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Single Item -->
|
||||||
|
|
||||||
|
<!-- Single Item -->
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading">
|
||||||
|
<h4 class="panel-title">
|
||||||
|
<a data-toggle="collapse" data-parent="#accordion" href="#ac4">
|
||||||
|
<strong>03</strong> Where do I start?
|
||||||
|
</a>
|
||||||
|
</h4>
|
||||||
|
</div>
|
||||||
|
<div id="ac4" class="panel-collapse collapse">
|
||||||
|
<div class="panel-body">
|
||||||
|
<p>
|
||||||
|
Removing welcomed civility or hastened is. Justice elderly but perhaps
|
||||||
|
expense six her are another passage. Full her ten open fond walk not
|
||||||
|
down.For request general express unknown are. Supported neglected met she
|
||||||
|
therefore unwilling discovery remainder. Way sentiments two indulgence
|
||||||
|
uncommonly own.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Single Item -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Faq -->
|
||||||
|
<a class="btn btn-theme effect btn-sm" href="#">more questions ?</a>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6 contact-forms">
|
||||||
|
<div class="form-items bg-cover shadow dark-hard text-light"
|
||||||
|
style="background-image: url(assets/img/2440x1578.png);">
|
||||||
|
<h2>Do You Have Any <strong>Questions?</strong></h2>
|
||||||
|
|
||||||
|
<form action="assets/mail/contact.php" method="POST" class="contact-form">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" id="name" name="name" placeholder="Name"
|
||||||
|
type="text">
|
||||||
|
<span class="alert-error"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" id="email" name="email" placeholder="Email*"
|
||||||
|
type="email">
|
||||||
|
<span class="alert-error"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<div class="form-group">
|
||||||
|
<input class="form-control" id="phone" name="phone" placeholder="Phone"
|
||||||
|
type="text">
|
||||||
|
<span class="alert-error"></span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="row">
|
||||||
|
<div class="form-group comments">
|
||||||
|
<textarea class="form-control" id="comments" name="comments"
|
||||||
|
placeholder="Tell Us About Project *"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div class="row">
|
||||||
|
<button type="submit" name="submit" id="submit">
|
||||||
|
Send Message
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- Alert Message -->
|
||||||
|
<div class="col-md-12 alert-notification">
|
||||||
|
<div id="message" class="alert-msg"></div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Contact Area -->
|
||||||
|
|
||||||
|
<!-- Start Companies Area
|
||||||
|
============================================= -->
|
||||||
|
<div class="companies-area bg-gray text-center default-padding">
|
||||||
|
<div class="container">
|
||||||
|
<div class="companies-items">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8 col-md-offset-2">
|
||||||
|
<div class="heading">
|
||||||
|
<h4>We're thrusted by</h4>
|
||||||
|
<h2><strong>12k+</strong> Customer</h2>
|
||||||
|
<p>
|
||||||
|
Perceive screened throwing met not eat distance. Viewing hastily or written dearest elderly
|
||||||
|
up weather it as. So direction so sweetness or extremity at daughters. Provided put unpacked
|
||||||
|
now but bringing.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<div class="item-list companies-carousel owl-carousel owl-theme">
|
||||||
|
<div class="item">
|
||||||
|
<img src="assets/img/150x80.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="assets/img/150x80.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="assets/img/150x80.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="assets/img/150x80.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="assets/img/150x80.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
<div class="item">
|
||||||
|
<img src="assets/img/150x80.png" alt="Thumb">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- End Companies Area -->
|
||||||
|
|
||||||
|
<!-- Start Footer
|
||||||
|
============================================= -->
|
||||||
|
{% include 'home/base/footer.html' %}
|
||||||
|
<!-- End Footer -->
|
||||||
|
|
||||||
|
<!-- jQuery Frameworks
|
||||||
|
============================================= -->
|
||||||
|
{% include 'home/jquery/jguery.html' %}
|
||||||
|
|
||||||
|
{% endblock content %}
|
||||||
18
app/home/templates/home/jquery/jguery.html
Normal file
18
app/home/templates/home/jquery/jguery.html
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
{% load static %}
|
||||||
|
<script src="{% static 'file/home/js/jquery-1.12.4.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/bootstrap.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/equal-height.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/jquery.appear.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/jquery.easing.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/jquery.magnific-popup.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/modernizr.custom.13711.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/owl.carousel.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/wow.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/progress-bar.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/isotope.pkgd.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/imagesloaded.pkgd.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/count-to.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/YTPlayer.min.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/circle-progress.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/bootsnav.js' %}"></script>
|
||||||
|
<script src="{% static 'file/home/js/main.js' %}"></script>
|
||||||
22
app/manage.py
Normal file
22
app/manage.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
"""Django's command-line utility for administrative tasks."""
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
"""Run administrative tasks."""
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'miroca.settings')
|
||||||
|
try:
|
||||||
|
from django.core.management import execute_from_command_line
|
||||||
|
except ImportError as exc:
|
||||||
|
raise ImportError(
|
||||||
|
"Couldn't import Django. Are you sure it's installed and "
|
||||||
|
"available on your PYTHONPATH environment variable? Did you "
|
||||||
|
"forget to activate a virtual environment?"
|
||||||
|
) from exc
|
||||||
|
execute_from_command_line(sys.argv)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == '__main__':
|
||||||
|
main()
|
||||||
16
app/miroca/asgi.py
Normal file
16
app/miroca/asgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
ASGI config for miroca project.
|
||||||
|
|
||||||
|
It exposes the ASGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/6.0/howto/deployment/asgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.asgi import get_asgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'miroca.settings')
|
||||||
|
|
||||||
|
application = get_asgi_application()
|
||||||
135
app/miroca/settings.py
Normal file
135
app/miroca/settings.py
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
"""
|
||||||
|
Django settings for miroca project.
|
||||||
|
|
||||||
|
Generated by 'django-admin startproject' using Django 6.0.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/6.0/topics/settings/
|
||||||
|
|
||||||
|
For the full list of settings and their values, see
|
||||||
|
https://docs.djangoproject.com/en/6.0/ref/settings/
|
||||||
|
"""
|
||||||
|
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
# Build paths inside the project like this: BASE_DIR / 'subdir'.
|
||||||
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
||||||
|
|
||||||
|
|
||||||
|
# Quick-start development settings - unsuitable for production
|
||||||
|
# See https://docs.djangoproject.com/en/6.0/howto/deployment/checklist/
|
||||||
|
|
||||||
|
# SECURITY WARNING: keep the secret key used in production secret!
|
||||||
|
SECRET_KEY = 'django-insecure-wk$33v@xp^n&mg1^#=h+_1ekmoeewyub5cyk_w62ocpp8-7rj@'
|
||||||
|
|
||||||
|
# SECURITY WARNING: don't run with debug turned on in production!
|
||||||
|
DEBUG = True
|
||||||
|
|
||||||
|
ALLOWED_HOSTS = ['miroca.ru']
|
||||||
|
|
||||||
|
|
||||||
|
# Application definition
|
||||||
|
|
||||||
|
INSTALLED_APPS = [
|
||||||
|
'django.contrib.admin',
|
||||||
|
'django.contrib.auth',
|
||||||
|
'django.contrib.contenttypes',
|
||||||
|
'django.contrib.sessions',
|
||||||
|
'django.contrib.messages',
|
||||||
|
'django.contrib.staticfiles',
|
||||||
|
'upanel.apps.UpanelConfig',
|
||||||
|
'home.apps.HomeConfig',
|
||||||
|
]
|
||||||
|
|
||||||
|
MIDDLEWARE = [
|
||||||
|
'django.middleware.security.SecurityMiddleware',
|
||||||
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
||||||
|
'django.middleware.common.CommonMiddleware',
|
||||||
|
'django.middleware.csrf.CsrfViewMiddleware',
|
||||||
|
'django.contrib.auth.middleware.AuthenticationMiddleware',
|
||||||
|
'django.contrib.messages.middleware.MessageMiddleware',
|
||||||
|
'django.middleware.clickjacking.XFrameOptionsMiddleware',
|
||||||
|
]
|
||||||
|
|
||||||
|
ROOT_URLCONF = 'miroca.urls'
|
||||||
|
|
||||||
|
TEMPLATES = [
|
||||||
|
{
|
||||||
|
'BACKEND': 'django.template.backends.django.DjangoTemplates',
|
||||||
|
'DIRS': [],
|
||||||
|
'APP_DIRS': True,
|
||||||
|
'OPTIONS': {
|
||||||
|
'context_processors': [
|
||||||
|
'django.template.context_processors.request',
|
||||||
|
'django.contrib.auth.context_processors.auth',
|
||||||
|
'django.contrib.messages.context_processors.messages',
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
WSGI_APPLICATION = 'miroca.wsgi.application'
|
||||||
|
|
||||||
|
|
||||||
|
# Database
|
||||||
|
# https://docs.djangoproject.com/en/6.0/ref/settings/#databases
|
||||||
|
|
||||||
|
# DATABASES = {
|
||||||
|
# 'default': {
|
||||||
|
# 'ENGINE': 'django.db.backends.sqlite3',
|
||||||
|
# 'NAME': BASE_DIR / 'db.sqlite3',
|
||||||
|
# }
|
||||||
|
# }
|
||||||
|
|
||||||
|
|
||||||
|
# Password validation
|
||||||
|
# https://docs.djangoproject.com/en/6.0/ref/settings/#auth-password-validators
|
||||||
|
|
||||||
|
AUTH_PASSWORD_VALIDATORS = [
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
|
||||||
|
},
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
# Internationalization
|
||||||
|
# https://docs.djangoproject.com/en/6.0/topics/i18n/
|
||||||
|
|
||||||
|
LANGUAGE_CODE = 'en-us'
|
||||||
|
|
||||||
|
TIME_ZONE = 'UTC'
|
||||||
|
|
||||||
|
USE_I18N = True
|
||||||
|
|
||||||
|
USE_TZ = True
|
||||||
|
|
||||||
|
|
||||||
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
# https://docs.djangoproject.com/en/6.0/howto/static-files/
|
||||||
|
|
||||||
|
STATIC_URL = 'static/'
|
||||||
|
STATIC_ROOT = '/home/c76533/miroca.ru/www/static'
|
||||||
|
|
||||||
|
MEDIA_URL = '/media/'
|
||||||
|
MEDIA_ROOT = '/home/c76533/miroca.ru/www/media'
|
||||||
|
|
||||||
|
# database settings
|
||||||
|
DATABASES = {
|
||||||
|
'default': {
|
||||||
|
'ENGINE': 'django.db.backends.postgresql_psycopg2',
|
||||||
|
'HOST': 'postgres.c76533.h2',
|
||||||
|
'PORT': '5432',
|
||||||
|
'NAME': 'c76533_miroca_ru',
|
||||||
|
'USER': 'c76533_miroca_ru',
|
||||||
|
'PASSWORD': 'FeJhiKotdinuv65',
|
||||||
|
},
|
||||||
|
}
|
||||||
23
app/miroca/urls.py
Normal file
23
app/miroca/urls.py
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
"""
|
||||||
|
URL configuration for miroca project.
|
||||||
|
|
||||||
|
The `urlpatterns` list routes URLs to views. For more information please see:
|
||||||
|
https://docs.djangoproject.com/en/6.0/topics/http/urls/
|
||||||
|
Examples:
|
||||||
|
Function views
|
||||||
|
1. Add an import: from my_app import views
|
||||||
|
2. Add a URL to urlpatterns: path('', views.home, name='home')
|
||||||
|
Class-based views
|
||||||
|
1. Add an import: from other_app.views import Home
|
||||||
|
2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
|
||||||
|
Including another URLconf
|
||||||
|
1. Import the include() function: from django.urls import include, path
|
||||||
|
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
|
||||||
|
"""
|
||||||
|
from django.contrib import admin
|
||||||
|
from django.urls import path, include
|
||||||
|
|
||||||
|
urlpatterns = [
|
||||||
|
path('admin/', admin.site.urls),
|
||||||
|
path('', include('home.urls')),
|
||||||
|
]
|
||||||
16
app/miroca/wsgi.py
Normal file
16
app/miroca/wsgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for miroca project.
|
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'miroca.settings')
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
||||||
16
app/wsgi.py
Normal file
16
app/wsgi.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
"""
|
||||||
|
WSGI config for miroca project.
|
||||||
|
|
||||||
|
It exposes the WSGI callable as a module-level variable named ``application``.
|
||||||
|
|
||||||
|
For more information on this file, see
|
||||||
|
https://docs.djangoproject.com/en/6.0/howto/deployment/wsgi/
|
||||||
|
"""
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'miroca.settings')
|
||||||
|
|
||||||
|
application = get_wsgi_application()
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
from django.contrib import admin
|
|
||||||
from django.contrib.auth.admin import UserAdmin
|
|
||||||
from .forms import CustomUserCreationForm, CustomUserChangeForm
|
|
||||||
from .models import CustomUser
|
|
||||||
|
|
||||||
class CustomUserAdmin(UserAdmin):
|
|
||||||
add_form = CustomUserCreationForm
|
|
||||||
form = CustomUserChangeForm
|
|
||||||
model = CustomUser
|
|
||||||
list_display = ('email', 'is_superuser','is_staff', 'is_active',)
|
|
||||||
list_filter = ('email','is_superuser','is_staff', 'is_active',)
|
|
||||||
fieldsets = (
|
|
||||||
(None, {'fields': ('email', 'password')}),
|
|
||||||
('Разрешения', {'fields': ('is_superuser','is_staff','is_active','groups',)}),
|
|
||||||
('Пользователь',{'fields':('username','last_name','first_name','phone','org','address')}),
|
|
||||||
('Регистрация и вход', {'fields': ('date_joined','last_login')}),
|
|
||||||
)
|
|
||||||
add_fieldsets = (
|
|
||||||
(None, {
|
|
||||||
'classes': ('wide',),
|
|
||||||
'fields': ('email','is_superuser', 'password1', 'password2', 'is_staff', 'is_active')}
|
|
||||||
),
|
|
||||||
)
|
|
||||||
search_fields = ('email',)
|
|
||||||
ordering = ('email',)
|
|
||||||
admin.site.register(CustomUser, CustomUserAdmin)
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
from django.apps import AppConfig
|
|
||||||
|
|
||||||
|
|
||||||
class AuthMirocaConfig(AppConfig):
|
|
||||||
default_auto_field = 'django.db.models.BigAutoField'
|
|
||||||
name = 'auth_miroca'
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
from django.contrib.auth.forms import UserCreationForm, UserChangeForm
|
|
||||||
from .models import CustomUser
|
|
||||||
class CustomUserCreationForm(UserCreationForm):
|
|
||||||
class Meta(UserCreationForm):
|
|
||||||
model = CustomUser
|
|
||||||
fields = ('email',)
|
|
||||||
class CustomUserChangeForm(UserChangeForm):
|
|
||||||
class Meta:
|
|
||||||
model = CustomUser
|
|
||||||
fields = ('email',)
|
|
||||||
@@ -1,34 +0,0 @@
|
|||||||
from django.contrib.auth.base_user import BaseUserManager
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
|
||||||
|
|
||||||
|
|
||||||
class CustomUserManager(BaseUserManager):
|
|
||||||
"""
|
|
||||||
Custom user model manager where email is the unique identifiers
|
|
||||||
for authentication instead of usernames.
|
|
||||||
"""
|
|
||||||
def create_user(self, email, password, **extra_fields):
|
|
||||||
"""
|
|
||||||
Create and save a user with the given email and password.
|
|
||||||
"""
|
|
||||||
if not email:
|
|
||||||
raise ValueError(_("The Email must be set"))
|
|
||||||
email = self.normalize_email(email)
|
|
||||||
user = self.model(email=email, **extra_fields)
|
|
||||||
user.set_password(password)
|
|
||||||
user.save()
|
|
||||||
return user
|
|
||||||
|
|
||||||
def create_superuser(self, email, password, **extra_fields):
|
|
||||||
"""
|
|
||||||
Create and save a SuperUser with the given email and password.
|
|
||||||
"""
|
|
||||||
extra_fields.setdefault("is_staff", True)
|
|
||||||
extra_fields.setdefault("is_superuser", True)
|
|
||||||
extra_fields.setdefault("is_active", True)
|
|
||||||
|
|
||||||
if extra_fields.get("is_staff") is not True:
|
|
||||||
raise ValueError(_("Superuser must have is_staff=True."))
|
|
||||||
if extra_fields.get("is_superuser") is not True:
|
|
||||||
raise ValueError(_("Superuser must have is_superuser=True."))
|
|
||||||
return self.create_user(email, password, **extra_fields)
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 06:19
|
|
||||||
|
|
||||||
import django.utils.timezone
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
initial = True
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('auth', '0012_alter_user_first_name_max_length'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.CreateModel(
|
|
||||||
name='CustomUser',
|
|
||||||
fields=[
|
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('password', models.CharField(max_length=128, verbose_name='password')),
|
|
||||||
('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')),
|
|
||||||
('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')),
|
|
||||||
('email', models.EmailField(max_length=254, unique=True, verbose_name='email address')),
|
|
||||||
('is_staff', models.BooleanField(default=False, verbose_name='Персонал')),
|
|
||||||
('is_active', models.BooleanField(default=True, verbose_name='Активный')),
|
|
||||||
('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')),
|
|
||||||
('username', models.CharField(max_length=255, null=True, verbose_name='username')),
|
|
||||||
('image', models.ImageField(blank=True, null=True, upload_to='user/%Y/%m/%d', verbose_name='Изображение')),
|
|
||||||
('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.group', verbose_name='groups')),
|
|
||||||
('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.permission', verbose_name='user permissions')),
|
|
||||||
],
|
|
||||||
options={
|
|
||||||
'verbose_name': ('user',),
|
|
||||||
'verbose_name_plural': 'Пользователь',
|
|
||||||
},
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 12:46
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('auth_miroca', '0001_initial'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='ipaddress',
|
|
||||||
field=models.GenericIPAddressField(null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 12:53
|
|
||||||
|
|
||||||
import phone_field.models
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('auth_miroca', '0002_customuser_ipaddress'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='last_name',
|
|
||||||
field=models.CharField(max_length=255, null=True, verbose_name='Фамилия'),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='phone',
|
|
||||||
field=phone_field.models.PhoneField(blank=True, help_text='Контактный номер', max_length=31, null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,26 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 13:00
|
|
||||||
|
|
||||||
import address.models
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('address', '0003_auto_20200830_1851'),
|
|
||||||
('auth_miroca', '0003_customuser_last_name_customuser_phone'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='address',
|
|
||||||
field=address.models.AddressField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='address.address', verbose_name='Адрес'),
|
|
||||||
),
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='first_name',
|
|
||||||
field=models.CharField(max_length=255, null=True, verbose_name='Имя'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 13:02
|
|
||||||
|
|
||||||
import address.models
|
|
||||||
import django.db.models.deletion
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('address', '0003_auto_20200830_1851'),
|
|
||||||
('auth_miroca', '0004_customuser_address_customuser_first_name'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AlterField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='address',
|
|
||||||
field=address.models.AddressField(null=True, on_delete=django.db.models.deletion.SET_NULL, to='address.address', verbose_name='Адрес'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 13:05
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('auth_miroca', '0005_alter_customuser_address'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='address',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 16:51
|
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('auth_miroca', '0006_remove_customuser_address'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.AddField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='ipaddress_mikrotik',
|
|
||||||
field=models.GenericIPAddressField(null=True),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# Generated by Django 5.1.3 on 2024-11-29 17:28
|
|
||||||
|
|
||||||
from django.db import migrations
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
|
||||||
|
|
||||||
dependencies = [
|
|
||||||
('auth_miroca', '0007_customuser_ipaddress_mikrotik'),
|
|
||||||
]
|
|
||||||
|
|
||||||
operations = [
|
|
||||||
migrations.RemoveField(
|
|
||||||
model_name='customuser',
|
|
||||||
name='ipaddress_mikrotik',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
from django.contrib.auth.models import AbstractBaseUser, PermissionsMixin
|
|
||||||
from django.db import models
|
|
||||||
from django.utils import timezone
|
|
||||||
from django.utils.translation import gettext_lazy as _
|
|
||||||
from phone_field import PhoneField
|
|
||||||
from address.models import AddressField
|
|
||||||
|
|
||||||
from .managers import CustomUserManager
|
|
||||||
|
|
||||||
|
|
||||||
class CustomUser(AbstractBaseUser, PermissionsMixin):
|
|
||||||
email = models.EmailField(_("email address"), unique=True)
|
|
||||||
is_staff = models.BooleanField(default=False, verbose_name='Персонал')
|
|
||||||
is_active = models.BooleanField(default=True, verbose_name='Активный')
|
|
||||||
date_joined = models.DateTimeField(_('date joined'), default=timezone.now)
|
|
||||||
username = models.CharField(max_length=255, null=True, verbose_name='username')
|
|
||||||
image = models.ImageField(upload_to='user/%Y/%m/%d', blank=True, null=True, verbose_name='Изображение')
|
|
||||||
ipaddress=models.GenericIPAddressField(null=True)
|
|
||||||
last_name=models.CharField(max_length=255, null=True,verbose_name='Фамилия')
|
|
||||||
first_name=models.CharField(max_length=255,null=True,verbose_name='Имя')
|
|
||||||
phone = PhoneField(blank=True,null=True, help_text='Контактный номер')
|
|
||||||
|
|
||||||
USERNAME_FIELD = 'email'
|
|
||||||
REQUIRED_FIELDS = []
|
|
||||||
|
|
||||||
objects = CustomUserManager()
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return self.email
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = 'user',
|
|
||||||
verbose_name_plural = 'Пользователь'
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.shortcuts import render
|
|
||||||
|
|
||||||
# Create your views here.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.contrib import admin
|
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.db import models
|
|
||||||
|
|
||||||
# Create your models here.
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
{% load static %}
|
|
||||||
<meta charset="utf-8">
|
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <!--metatextblock--> <title>Умный дом под
|
|
||||||
ключ | Заказать системы умного дома: расчет, установка и подключение оборудования, готовые
|
|
||||||
комплекты</title>
|
|
||||||
<meta name="description"
|
|
||||||
content="Умный дом под ключ по всей России с гарантией. Заказать систему умный дом от проектирования и расчета стоимости до подключения и установки оборудования и готовых комплектов умного дома.">
|
|
||||||
<meta name="keywords" content="умный дом">
|
|
||||||
<meta property="og:url" content="http://miroca.ru">
|
|
||||||
<meta property="og:title" content="Miroca">
|
|
||||||
<meta property="og:description"
|
|
||||||
content="Установка системы умный дом по всей России. От проектирования до монтажа и обслуживания. Рассчитайте свой проект.">
|
|
||||||
<meta property="og:type" content="website">
|
|
||||||
<meta property="og:image" content="{% static 'file/upanel/img/miroca192' %}">
|
|
||||||
<link rel="canonical" href="https://miroca.ru/"> <!--/metatextblock-->
|
|
||||||
<meta name="format-detection" content="telephone=no">
|
|
||||||
<meta http-equiv="x-dns-prefetch-control" content="on">
|
|
||||||
<link rel="shortcut icon" href="{% static 'file/home/img/favicon.ico' %}" type="image/x-icon">
|
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
{% extends 'home/base/base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
{% block content%}
|
|
||||||
|
|
||||||
{% endblock content %}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.contrib import admin
|
|
||||||
|
|
||||||
# Register your models here.
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.db import models
|
|
||||||
|
|
||||||
# Create your models here.
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
{% load static %}
|
|
||||||
<html lang="ru"
|
|
||||||
class="light-style layout-menu-fixed layout-compact"
|
|
||||||
dir="ltr"
|
|
||||||
data-theme="theme-default"
|
|
||||||
data-assets-path="{% static 'kiosk' %}"
|
|
||||||
data-template="vertical-menu-template-free">
|
|
||||||
<head>
|
|
||||||
<meta charset="utf-8"/>
|
|
||||||
<meta
|
|
||||||
name="viewport"
|
|
||||||
content="width=device-width, initial-scale=1.0, user-scalable=no, minimum-scale=1.0, maximum-scale=1.0"/>
|
|
||||||
|
|
||||||
<title>Панель управления Умный дом Мирока</title>
|
|
||||||
|
|
||||||
<meta name="description" content=""/>
|
|
||||||
|
|
||||||
<!-- Favicon -->
|
|
||||||
<link rel="icon" type="image/x-icon" href="{% static 'file/kiosk/img/favicon.ico' %}"/>
|
|
||||||
|
|
||||||
<!-- Fonts -->
|
|
||||||
<link rel="preconnect" href="https://fonts.googleapis.com"/>
|
|
||||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/>
|
|
||||||
<link
|
|
||||||
href="https://fonts.googleapis.com/css2?family=Public+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500;1,600;1,700&display=swap"
|
|
||||||
rel="stylesheet"/>
|
|
||||||
|
|
||||||
<link rel="stylesheet" href="{% static 'file/assets/vendor/fonts/boxicons.css' %}"/>
|
|
||||||
|
|
||||||
<!-- Core CSS -->
|
|
||||||
<link rel="stylesheet" href="{% static 'file/kiosk/assets/vendor/css/core.css' %}"
|
|
||||||
class="template-customizer-core-css">
|
|
||||||
<link rel="stylesheet" href="{% static 'file/kiosk/assets/vendor/css/theme-default.css' %}"
|
|
||||||
class="template-customizer-theme-css">
|
|
||||||
<link rel="stylesheet" href="{% static 'file/kiosk/assets/css/demo.css' %}">
|
|
||||||
|
|
||||||
<!-- Vendors CSS -->
|
|
||||||
<link rel="stylesheet" href="{% static 'file/kiosk/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.css' %}"/>
|
|
||||||
<link rel="stylesheet" href="{% static 'file/kiosk/assets/vendor/libs/apex-charts/apex-charts.css' %}"/>
|
|
||||||
|
|
||||||
<!-- Button CSS kiosk -->
|
|
||||||
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css'>
|
|
||||||
<link rel='stylesheet' href='https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css'>
|
|
||||||
<link rel="stylesheet" href="{% static 'file/kiosk/assets/css/style_button.css' %}">
|
|
||||||
|
|
||||||
<!--Server CSS-->
|
|
||||||
<link rel="stylesheet" href="{% static 'file/kiosk/css/style.css' %}">
|
|
||||||
|
|
||||||
|
|
||||||
<!--Server JS-->
|
|
||||||
<script src="{% static 'file/kiosk/js/jquery-3.5.1.min.js' %}"></script>
|
|
||||||
<script src="{% static 'file/upanel/js/update_server.js' %}"></script>
|
|
||||||
<script type="text/javascript" src="{% static 'file/kiosk/js/clock.js' %}"></script>
|
|
||||||
|
|
||||||
<!--Button js kiosk -->
|
|
||||||
<script type="text/javascript" src="{% static 'file/kiosk/js/button.js' %}"></script>
|
|
||||||
|
|
||||||
<!-- Helpers -->
|
|
||||||
<script src="{% static 'file/kiosk/assets/vendor/js/helpers.js' %}"></script>
|
|
||||||
<!--! Template customizer & Theme config files MUST be included after core stylesheets and helpers.js in the <head> section -->
|
|
||||||
<!--? Config: Mandatory theme config file contain global vars & default theme options, Set your preferred theme option in this file. -->
|
|
||||||
<script src="{% static 'file/kiosk/assets/js/config.js' %}"></script>
|
|
||||||
</head>
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
|
|
||||||
{% endblock %}
|
|
||||||
</html>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
{% extends 'kiosk/base/base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
{% block content %}
|
|
||||||
<body>
|
|
||||||
<!-- Layout wrapper -->
|
|
||||||
<div class="layout-wrapper layout-content-navbar">
|
|
||||||
<div class="layout-container">
|
|
||||||
<!-- Layout container -->
|
|
||||||
<div class="layout-page">
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
{% include 'kiosk/include/content_wrapper.html' %}
|
|
||||||
<!-- Content wrapper -->
|
|
||||||
</div>
|
|
||||||
<!-- / Layout page -->
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<!-- Overlay -->
|
|
||||||
<div class="layout-overlay layout-menu-toggle"></div>
|
|
||||||
</div>
|
|
||||||
<!-- / Layout wrapper -->
|
|
||||||
|
|
||||||
<script src="{% static 'file/assets/vendor/libs/jquery/jquery.js' %}"></script>
|
|
||||||
<script src="{% static 'file/assets/vendor/libs/popper/popper.js' %}"></script>
|
|
||||||
<script src="{% static 'file/assets/vendor/js/bootstrap.js' %}"></script>
|
|
||||||
<script src="{% static 'file/assets/vendor/libs/perfect-scrollbar/perfect-scrollbar.js' %}"></script>
|
|
||||||
<script src="{% static 'file/assets/vendor/js/menu.js' %}"></script>
|
|
||||||
|
|
||||||
<!-- endbuild -->
|
|
||||||
|
|
||||||
<!-- Vendors JS -->
|
|
||||||
<script src="{% static 'file/assets/vendor/libs/apex-charts/apexcharts.js' %}"></script>
|
|
||||||
|
|
||||||
<!-- Main JS -->
|
|
||||||
<script src="{% static 'file/assets/js/main.js' %}"></script>
|
|
||||||
|
|
||||||
<!-- Page JS -->
|
|
||||||
<script src="{% static 'file/assets/js/dashboards-analytics.js' %}"></script>
|
|
||||||
|
|
||||||
<!-- Place this tag in your head or just before your close body tag. -->
|
|
||||||
<script async defer src="https://buttons.github.io/buttons.js"></script>
|
|
||||||
|
|
||||||
<script>
|
|
||||||
setTimeout(function () {
|
|
||||||
window.location.reload();
|
|
||||||
}, 1800000)
|
|
||||||
</script>
|
|
||||||
</body>
|
|
||||||
{% endblock content %}
|
|
||||||
</html>
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
{% extends 'kiosk/base/base.html' %}
|
|
||||||
{% load static %}
|
|
||||||
{#Блоки температуры и влажности#}
|
|
||||||
{% block styleinclude %}
|
|
||||||
<link rel="stylesheet" href="{% static 'file/upanel/css/smart_style.css' %}">
|
|
||||||
{% endblock styleinclude %}
|
|
||||||
{#График#}
|
|
||||||
{% block js %}
|
|
||||||
<script src="{% static 'file/upanel/js/smart-size-reload.js' %}"></script>
|
|
||||||
<script src="{% static 'file/upanel/js/vue.min.js' %}"></script>
|
|
||||||
<script src="{% static 'file/upanel/js/highcharts.js' %}"></script>
|
|
||||||
<script src="{% static 'file/upanel/js/vue-highcharts.min.js' %}"></script>
|
|
||||||
{% endblock js %}
|
|
||||||
{% block content %}
|
|
||||||
<body onload="clockTimer();">
|
|
||||||
<div class="app-content">
|
|
||||||
<div class="projects-section">
|
|
||||||
<div class="projects-section-header">
|
|
||||||
{% include 'upanel/upanel/base/label.html' %}
|
|
||||||
<p class="time" id="dayOfWeek"></p>
|
|
||||||
{% include 'upanel/upanel/base/user.html' %}
|
|
||||||
<div class="projects-section-line">
|
|
||||||
{% include 'upanel/upanel/base/status.html' %}
|
|
||||||
<time id="clock"></time>
|
|
||||||
</div>
|
|
||||||
<ul class="breadcrumb">
|
|
||||||
<li><a href="{% url 'upanel' %}">Главная</a></li>
|
|
||||||
<li><a href="{% url 'smarthome' %}">Умный дом</a></li>
|
|
||||||
</ul>
|
|
||||||
<div class="breadcrumbs">
|
|
||||||
{% include 'upanel/upanel/base/temperature.html' %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<script src="{% static 'file/upanel/js/script.js' %}"></script>
|
|
||||||
</body>
|
|
||||||
{% endblock content %}
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
{% load static %}
|
|
||||||
<div class="content-wrapper">
|
|
||||||
<!-- Content -->
|
|
||||||
|
|
||||||
<div class="container-xxl flex-grow-1 container-p-y">
|
|
||||||
|
|
||||||
<div class="row">
|
|
||||||
<!--Sidebar-->
|
|
||||||
{% include 'kiosk/include/sidebar.html' %}
|
|
||||||
<!--Sidebar-->
|
|
||||||
|
|
||||||
<div class="col-lg-8 mb-6 order-0">
|
|
||||||
<!--Показания теплицы-->
|
|
||||||
{% include 'kiosk/include/greenhouse.html' %}
|
|
||||||
<!--End Показания теплицы-->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<!-- Order Statistics -->
|
|
||||||
{% include 'kiosk/include/transaction.html' %}
|
|
||||||
<!--/ Order Statistics -->
|
|
||||||
|
|
||||||
<!-- Transactions -->
|
|
||||||
{% include 'kiosk/include/transaction.html' %}
|
|
||||||
<!--/ Transactions -->
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<!-- / Content -->
|
|
||||||
|
|
||||||
<div class="content-backdrop fade"></div>
|
|
||||||
</div>
|
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
<div class="card">
|
|
||||||
<div class="row row-bordered g-0">
|
|
||||||
<div class="col-md-8">
|
|
||||||
<h5 class="card-header m-0 me-2 pb-3">Показания датчиков</h5>
|
|
||||||
<div id="totalRevenueChart" class="px-2"></div>
|
|
||||||
</div>
|
|
||||||
<div class="col-md-4">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="text-center">
|
|
||||||
<div class="dropdown">
|
|
||||||
<div class="dropdown-menu dropdown-menu-end" aria-labelledby="growthReportId">
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div id="growthChart"></div>
|
|
||||||
<div class="text-center fw-medium pt-3 mb-2">Показания датчиков теплицы</div>
|
|
||||||
|
|
||||||
<div class="d-flex px-xxl-4 px-lg-2 p-4 gap-xxl-3 gap-lg-1 gap-3 justify-content-between">
|
|
||||||
<div class="d-flex">
|
|
||||||
<div class="me-2">
|
|
||||||
<span class="badge bg-label-primary p-2"><i
|
|
||||||
class="bx bx-health text-primary"></i></span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex flex-column">
|
|
||||||
<small>Температура</small>
|
|
||||||
{% if temp != 0 %}
|
|
||||||
<h6 class="mb-0" id="temp_green">+{{ temp }}°C</h6>
|
|
||||||
{% elif temp == 0 %}
|
|
||||||
<h6 class="mb-0" id="temp_green">+{{ temp }}°C</h6>
|
|
||||||
{% else %}
|
|
||||||
<h6 class="mb-0" id="temp_green">-{{ temp }}°C</h6>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex">
|
|
||||||
<div class="me-2">
|
|
||||||
<span class="badge bg-label-info p-2"><i
|
|
||||||
class="bx bx-water text-info"></i></span>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex flex-column">
|
|
||||||
<small>Влаж. почвы</small>
|
|
||||||
<h6 id='damp' class="mb-0">{{ damp }}%</h6>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,151 +0,0 @@
|
|||||||
{% load static %}
|
|
||||||
<div class="col-lg-4 col-md-4 order-1">
|
|
||||||
<div class="row">
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img
|
|
||||||
src="{% static 'file/assets/img/icons/unicons/data-collection.png' %}"
|
|
||||||
alt="chart success"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span class="fw-medium d-block mb-1">Сервер</span>
|
|
||||||
<h3 id="server"></h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img
|
|
||||||
src="{% static 'file/assets/img/icons/unicons/internet.png' %}"
|
|
||||||
alt="temper"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span>Интернет</span>
|
|
||||||
<h3 id="internet"></h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<input class="addoncheckbox" type="checkbox" name="" value="">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/humidity.png' %}"
|
|
||||||
alt="wet"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span class="d-block mb-1">Влажность</span>
|
|
||||||
<h3 class="card-title text-nowrap mb-2">50%</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/temperature.png' %}"
|
|
||||||
alt="Credit Card" class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span class="fw-medium d-block mb-1">Блок</span>
|
|
||||||
<h3 class="card-title mb-2">$147</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/humidity.png' %}"
|
|
||||||
alt="wet"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span class="d-block mb-1">Влажность</span>
|
|
||||||
<h3 class="card-title text-nowrap mb-2">125%</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/temperature.png' %}"
|
|
||||||
alt="Credit Card" class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span class="fw-medium d-block mb-1">Блок</span>
|
|
||||||
<h3 class="card-title mb-2">$147</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/temperature.png' %}"
|
|
||||||
alt="Credit Card" class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span class="fw-medium d-block mb-1">Блок</span>
|
|
||||||
<h3 class="card-title mb-2">$147</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<div class="card">
|
|
||||||
<div class="card-body">
|
|
||||||
<div class="card-title d-flex align-items-start justify-content-between">
|
|
||||||
<div class="avatar flex-shrink-0">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/temperature.png' %}"
|
|
||||||
alt="Credit Card" class="rounded"/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<span class="fw-medium d-block mb-1">Блок</span>
|
|
||||||
<h3 class="card-title mb-2">$147</h3>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<label class="">
|
|
||||||
<input class="addoncheckbox" type="checkbox" name="" value="">
|
|
||||||
<span class="checkbox-icon card"><i class="fa fa-fw fa-plus"></i></span>
|
|
||||||
<div class="upgrade-site-name">
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-lg-6 col-md-12 col-6 mb-4">
|
|
||||||
<label class="">
|
|
||||||
<input class="addoncheckbox" type="checkbox" name="" value="">
|
|
||||||
<span class="checkbox-icon card"><i class="fa fa-fw fa-plus"></i></span>
|
|
||||||
<div class="upgrade-site-name">
|
|
||||||
</div>
|
|
||||||
</label>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,76 +0,0 @@
|
|||||||
{% load static %}
|
|
||||||
<div class="col-md-6 col-lg-4 order-2 mb-4">
|
|
||||||
<div class="card h-100">
|
|
||||||
<div class="card-body">
|
|
||||||
<ul class="p-0 m-0">
|
|
||||||
<li class="d-flex mb-4 pb-1">
|
|
||||||
<div class="avatar flex-shrink-0 me-3">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/paypal.png' %}"
|
|
||||||
alt="User"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex w-100 flex-wrap align-items-center justify-content-between gap-2">
|
|
||||||
<div class="me-2">
|
|
||||||
<small class="text-muted d-block mb-1">Paypal</small>
|
|
||||||
<h6 class="mb-0">Send money</h6>
|
|
||||||
</div>
|
|
||||||
<div class="user-progress d-flex align-items-center gap-1">
|
|
||||||
<h6 class="mb-0">+82.6</h6>
|
|
||||||
<span class="text-muted">USD</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li class="d-flex mb-4 pb-1">
|
|
||||||
<div class="avatar flex-shrink-0 me-3">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/wallet.png' %}" alt="User"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex w-100 flex-wrap align-items-center justify-content-between gap-2">
|
|
||||||
<div class="me-2">
|
|
||||||
<small class="text-muted d-block mb-1">Wallet</small>
|
|
||||||
<h6 class="mb-0">Mac'D</h6>
|
|
||||||
</div>
|
|
||||||
<div class="user-progress d-flex align-items-center gap-1">
|
|
||||||
<h6 class="mb-0">+270.69</h6>
|
|
||||||
<span class="text-muted">USD</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li class="d-flex mb-4 pb-1">
|
|
||||||
<div class="avatar flex-shrink-0 me-3">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/chart.png' %}"
|
|
||||||
alt="User"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex w-100 flex-wrap align-items-center justify-content-between gap-2">
|
|
||||||
<div class="me-2">
|
|
||||||
<small class="text-muted d-block mb-1">Transfer</small>
|
|
||||||
<h6 class="mb-0">Refund</h6>
|
|
||||||
</div>
|
|
||||||
<div class="user-progress d-flex align-items-center gap-1">
|
|
||||||
<h6 class="mb-0">+637.91</h6>
|
|
||||||
<span class="text-muted">USD</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
<li class="d-flex mb-4 pb-1">
|
|
||||||
<div class="avatar flex-shrink-0 me-3">
|
|
||||||
<img src="{% static 'file/assets/img/icons/unicons/cc-success.png' %}"
|
|
||||||
alt="User"
|
|
||||||
class="rounded"/>
|
|
||||||
</div>
|
|
||||||
<div class="d-flex w-100 flex-wrap align-items-center justify-content-between gap-2">
|
|
||||||
<div class="me-2">
|
|
||||||
<small class="text-muted d-block mb-1">Credit Card</small>
|
|
||||||
<h6 class="mb-0">Ordered Food</h6>
|
|
||||||
</div>
|
|
||||||
<div class="user-progress d-flex align-items-center gap-1">
|
|
||||||
<h6 class="mb-0">-838.71</h6>
|
|
||||||
<span class="text-muted">USD</span>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
from django.urls import path,include
|
|
||||||
from kiosk import views
|
|
||||||
|
|
||||||
urlpatterns = [
|
|
||||||
path('', views.kiosk, name='kiosk'),
|
|
||||||
]
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
from django.shortcuts import render
|
|
||||||
from upanel.models import *
|
|
||||||
import tinytuya
|
|
||||||
|
|
||||||
def turn_on_off(click):
|
|
||||||
devices = Device.objects.values('device_id', 'device_ip', 'local_key', 'device_version').order_by('id')
|
|
||||||
d = tinytuya.OutletDevice(
|
|
||||||
dev_id=str(devices[0]['device_id']),
|
|
||||||
address=str(devices[0]['device_ip']),
|
|
||||||
local_key=str(devices[0]['local_key']),
|
|
||||||
version=devices[0]['device_version'])
|
|
||||||
match click:
|
|
||||||
case 'on':
|
|
||||||
return d.turn_on()
|
|
||||||
case 'off':
|
|
||||||
return d.turn_off()
|
|
||||||
|
|
||||||
def kiosk(request):
|
|
||||||
if request.method == 'POST':
|
|
||||||
turn_on_off(request.POST['click'])
|
|
||||||
return render(request, 'kiosk/content/index.html',)
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user