remotes/origin/mitri4
spacenergy 10 years ago
parent 6db7bc8531
commit 14d5e437e5
  1. 4
      batiskaf/templates/jinja2/accounts/index.jinja
  2. 2
      batiskaf/templates/jinja2/base.jinja
  3. 98
      batiskaf/templates/jinja2/cart_detail.jinja
  4. 93
      batiskaf/templates/jinja2/size/elios.jinja
  5. 2
      batiskaf/templates/jinja2/size/index.jinja
  6. 164
      batiskaf/templates/jinja2/size/mares.jinja
  7. 5
      batiskaf/urls.py
  8. 33
      kazpost.py
  9. 6
      main/views.py
  10. BIN
      static/img/alemtat.jpg
  11. BIN
      static/img/kazpost.jpg
  12. 86
      static/js/_.js
  13. 2
      store/admin.py
  14. 2
      store/forms.py
  15. 29
      store/migrations/0043_auto_20151223_1155.py
  16. 29
      store/migrations/0044_auto_20151223_1612.py
  17. 39
      store/models.py
  18. 70
      store/views.py

@ -32,9 +32,9 @@
<td>{{ order.created.strftime('%d.%m.%Y') }}</td>
<td>
<a href="/account/order/{{ order.pk }}/"><b>{{ order.first_name }} {{ order.last_name }}</b><br/>
г. {{ order.get_city_display() }}<br/>
г. {{ order.get_city() }}<br/>
{{ order.address }}</a></td>
<td>{{ order.get_deliv_type_display() }}</td>
<td>{{ order.get_deliv_type() }}</td>
<td>{{ order.amount }}</td>
<td>{{ order.get_status_display() }}</td>
</tr>

@ -392,7 +392,7 @@
<script src="/static/js/formstone/js/touch.js"></script>
<script src="/static/js/formstone/js/dropdown.js"></script>
<script src="/static/star-rating/jquery.rating.pack.js"></script>
<script src="/static/js/_.js?v=10"></script>
<script src="/static/js/_.js?v=11"></script>
{% endblock footer_scripts %}
{% block jss %}{% endblock jss %}
{% if messages %}

@ -90,6 +90,80 @@
value="{{ csrf_token }}">
{{ form|bootstrap }}
<br/>
<div class="form-group"><label class="control-label" for="deliv_service">Служба
доставки</label></div>
<div class="radio">
<label>
<input type="radio" name="deliv_service" id="deliv_service1" value="kazpost"
checked>
Казпочта <br><img src="/static/img/kazpost.jpg" alt="" width="150">
</label>
</div>
<div class="radio">
<label>
<input type="radio" name="deliv_service" id="deliv_service2"
value="alemtat">
Алемтат <br><img src="/static/img/alemtat.jpg" alt="" width="150">
</label>
</div>
<div class="alemtat_block" style="display: none;">
<div class="form-group">
<label class="control-label" for="id_city">Город</label>
<div>
<select name="city" id="id_city" class="form-control">
{% for city in alemtat_cities %}
<option value="{{ city[0] }}" {% if request.POST['city'] %}selected{% endif %}>{{ city[1] }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label" for="id_deliv_type">Способ доставки</label>
<div>
<select name="deliv_type" id="id_deliv_type" class="form-control">
{% for service in alemtat_services %}
<option value="{{ service[0] }}" {% if request.POST['deliv_type'] %}selected{% endif %}>{{ service[1] }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label" for="id_alemtat_address">Адрес</label>
<div>
<input name="alemtat_address" type="text" id="id_alemtat_address"
class="form-control" value="{{ request.POST['alemtat_address'] or '' }}">
</div>
</div>
</div>
<div class="kazpost_block">
<div class="form-group">
<label class="control-label" for="id_city">Ближайшее областное отделение</label>
<div>
<select name="kazpost_city" id="id_kazpost_city" class="form-control">
{% for city in kazpost_cities %}
<option value="{{ city[0] }}" {% if request.POST['kazpost_city'] %}selected{% endif %}>{{ city[1] }}</option>
{% endfor %}
</select>
</div>
</div>
<div class="form-group">
<label class="control-label" for="id_kazpost_address">Адрес</label>
<div>
<input name="kazpost_address" type="text" id="id_kazpost_address"
class="form-control" value="{{ request.POST['kazpost_address'] or '' }}">
</div>
</div>
</div>
<br>
<div class="order-itogo text-right">
Стоимость доставки: <span id="order-itogo-delivery">0</span> ₸
<br/>
@ -118,29 +192,7 @@
</div>
</div>
</div>
{# <div class="col-xs-6">#}
{# <div class="panel panel-default">#}
{# <div class="panel-heading">#}
{# <h3 class="panel-title">Доставка</h3>#}
{# </div>#}
{# <div class="panel-body">#}
{# #}
{# </div>#}
{# </div>#}
{# </div>#}
</div>
{# <div class="row">#}
{# <div class="col-xs-12">#}
{# <div class="panel panel-default">#}
{# <div class="panel-heading">#}
{# <h3 class="panel-title">Способ оплаты</h3>#}
{# </div>#}
{# <div class="panel-body">#}
{# Банковский платеж#}
{# </div>#}
{# </div>#}
{# </div>#}
{# </div>#}
</div>
</div>
{% else %}
<div class="alert alert-warning alert-dismissable">

@ -0,0 +1,93 @@
{% extends 'base.jinja' %}
{% block meta_description %}
Размерная сетка гидрокостюмов Elios
{% endblock %}
{% block meta_keywords %}
Гидрокостюм, Размер, Бренд, Размерная сетка, Elios, Батискаф-Казахстан
{% endblock %}
{% block title %}
Размерная сетка для гидрокостюмов Elios
{% endblock %}
{% block content %}
<div class=" breadcrumbs">
<ol class="breadcrumb breadcrumb-arrow">
<li><a href="/">Главная</a></li>
<li><a href="/size/">Размерные сетки</a></li>
<li class="active"><span>Elios</span></li>
</ol>
</div>
<h2>Размерные сетки Elios</h2>
<div class="well well-large">
<strong>Размерная сетка Elios мужских мокрых гидрокостюмов</strong><br><br>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>
Размер
</th>
<th>
Вес (кг)
</th>
<th>
Рост (см)
</th>
</thead>
<tr>
<td>1</td>
<td>61/68</td>
<td>162/167</td>
</tr>
<tr>
<td>2</td>
<td>68/74</td>
<td>167/174</td>
</tr>
<tr>
<td>3</td>
<td>74/82</td>
<td>175/181</td>
</tr>
<tr>
<td>4</td>
<td>83/92</td>
<td>178/183</td>
</tr>
<tr>
<td>5</td>
<td>93/100</td>
<td>180/186</td>
</tr>
<tr>
<td>6</td>
<td>101/114</td>
<td>180/187</td>
</tr>
<tr>
<td>1 Long</td>
<td>61/71</td>
<td>168/173</td>
</tr>
<tr>
<td>2 Long</td>
<td>68/77</td>
<td>173/180</td>
</tr>
<tr>
<td>3 Long</td>
<td>74/85</td>
<td>181/187</td>
</tr>
<tr>
<td>4 Long</td>
<td>83/95</td>
<td>184/189</td>
</tr>
<tr>
<td>5 Long</td>
<td>93/114</td>
<td>186/193</td>
</tr>
</table>
</div>
{% endblock %}

@ -28,6 +28,8 @@
<a href="/size/aqualung/" class="btn">Aqua Lung</a>
<a href="/size/aquatics/" class="btn">Aquatics</a>
<a href="/size/cressi/" class="btn">Cressi</a>
<a href="/size/mares/" class="btn">Mares</a>
<a href="/size/elios/" class="btn">Elios</a>
</p>
</div>
{% endblock %}

@ -0,0 +1,164 @@
{% extends 'base.jinja' %}
{% block meta_description %}
Размерная сетка гидрокостюмов Mares
{% endblock %}
{% block meta_keywords %}
Гидрокостюм, Размер, Бренд, Размерная сетка, Mares, Батискаф-Казахстан
{% endblock %}
{% block title %}
Размерная сетка для гидрокостюмов Mares
{% endblock %}
{% block content %}
<div class=" breadcrumbs">
<ol class="breadcrumb breadcrumb-arrow">
<li><a href="/">Главная</a></li>
<li><a href="/size/">Размерные сетки</a></li>
<li class="active"><span>Mares</span></li>
</ol>
</div>
<h2>Размерные сетки Mares</h2>
<div class="well well-large">
<strong>Размерная сетка Mares мужских мокрых гидрокостюмов</strong><br><br>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>
Размер
</th>
<th>
Рост (см)
</th>
<th>
Вес (кг)
</th>
<th>
Окружность груди (см)
</th>
<th>
Окружность талии(см)
</th>
<th>
Окружность бедер(см)
</th>
</tr>
</thead>
<tr>
<td>S</td>
<td>167-175</td>
<td>54-70</td>
<td>86-96</td>
<td>68-81</td>
<td>86-96</td>
</tr>
<tr>
<td>M</td>
<td>172-180</td>
<td>61-79</td>
<td>91-100</td>
<td>73-86</td>
<td>91-101</td>
</tr>
<tr>
<td>ML</td>
<td>177-185</td>
<td>70-88</td>
<td>96-109</td>
<td>78-93</td>
<td>96-109</td>
</tr>
<tr>
<td>L</td>
<td>182-190</td>
<td>79-97</td>
<td>100-116</td>
<td>83-99</td>
<td>101-116</td>
</tr>
<tr>
<td>XL</td>
<td>185-195</td>
<td>88-107</td>
<td>106-124</td>
<td>88-104</td>
<td>106-124</td>
</tr>
<tr>
<td>XXL</td>
<td>188-200</td>
<td>92 ></td>
<td>111-132</td>
<td>91-111</td>
<td>111-132</td>
</tr>
</tbody>
</table>
<strong>Размерная сетка женских мокрых гидрокостюмов</strong><br><br>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>
Размер
</th>
<th>
Рост (см)
</th>
<th>
Вес (кг)
</th>
<th>
Окружность груди (см)
</th>
<th>
Окружность талии(см)
</th>
<th>
Окружность бедер(см)
</th>
</tr>
</thead>
<tr>
<td>XS</td>
<td>155-164</td>
<td>47-52</td>
<td>76-81</td>
<td>58-63</td>
<td>58-63</td>
</tr>
<tr>
<td>S</td>
<td>164-170</td>
<td>52-57</td>
<td>81-86</td>
<td>63-58</td>
<td>63-68</td>
</tr>
<tr>
<td>M</td>
<td>167-173</td>
<td>57-61</td>
<td>86-91</td>
<td>68-73</td>
<td>68-73</td>
</tr>
<tr>
<td>L</td>
<td>175-182</td>
<td>66-75</td>
<td>96-101</td>
<td>78-83</td>
<td>78-83</td>
</tr>
<tr>
<td>XL</td>
<td>179-187</td>
<td>70-79</td>
<td>101-106</td>
<td>83-88</td>
<td>83-88</td>
</tr>
</tbody>
</table>
</div>
{% endblock %}

@ -93,11 +93,16 @@ urlpatterns = patterns(
name='size_aquatics'),
url(r'^size/cressi/$', 'main.views.size_cressi',
name='size_cressi'),
url(r'^size/mares/$', 'main.views.size_mares',
name='size_mares'),
url(r'^size/elios/$', 'main.views.size_elios',
name='size_elios'),
url(r'^api/item/(?P<article>.+)/$', 'main.views.temp_count_update', name='temp_count_update'),
url(r'^api/', include(router.urls)),
url(r'^news/', include('news.urls')),
url(r'^promo/', include('promo.urls')),
url(r'^get_order_amount/$', 'store.views.get_order_amount'),
url(r'^get_order_kazpost_amount/$', 'store.views.get_order_kazpost_amount'),
url(r'^order_call/$', 'api.views.call_order'),
url(r'^order_order/$', 'api.views.order_order'),
url(r'^order/(?P<order>.+)/print/$', order_print,

@ -0,0 +1,33 @@
import requests
import json, xmljson
from lxml.etree import fromstring, tostring
import re
url="http://rates.kazpost.kz/postratesws/postratesws.wsdl"
#headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pos="http://webservices.kazpost.kz/postratesws">
<soapenv:Header/>
<soapenv:Body>
<pos:GetPostRateRequest>
<pos:MailInfo>
<pos:Product>7</pos:Product>
<pos:MailCat>2</pos:MailCat>
<pos:SendMethod>2</pos:SendMethod>
<pos:Weight>3500</pos:Weight>
<pos:From>13</pos:From>
<pos:To>3</pos:To>
<pos:SpecMarks/>
<pos:InCity/>
<pos:ExpressDlv/>
<pos:Size/>
<pos:DeclaredValue/>
</pos:MailInfo>
</pos:GetPostRateRequest>
</soapenv:Body>
</soapenv:Envelope>"""
response = requests.post(url,data=body,headers=headers)
print(response.text)
m = re.search(r'<ns2:PostRate>(\d+)</ns2:PostRate>', response.text)
print(m.group(1))

@ -76,6 +76,12 @@ def size_aquatics(request):
def size_cressi(request):
return render(request, 'size/cressi.jinja')
def size_mares(request):
return render(request, 'size/mares.jinja')
def size_elios(request):
return render(request, 'size/elios.jinja')
def temp_count_update(request, article):
retval = dict(error_code=0)

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

@ -213,22 +213,62 @@ $(document).ready(function () {
} else {
order_itogo.html(cart_itogo);
order_itogo_up.html(cart_itogo);
order_itogo_delivery.html(0);
order_itogo_delivery_up.html(0);
}
}
function selectKazpostCity() {
var city = $('#id_kazpost_city').val();
var cart_itogo = $('#cart-itogo');
var order_itogo_delivery = $('#order-itogo-delivery');
var order_itogo = $('#order-itogo-amount');
var order_itogo_up = $('#order-itogo-amount-up');
var order_itogo_delivery_up = $('#order-itogo-delivery-up');
$('#id_city').select2({
placeholder: "Выберите город",
allowClear: false
}).on('change', function () {
selectCity();
if (city) {
$.ajax({
method: "GET",
url: "/get_order_kazpost_amount/",
data: {
city: city,
}
})
.done(function (msg) {
order_itogo.html(
parseFloat(msg.amount) + parseFloat(cart_itogo.html())
);
order_itogo_up.html(
parseFloat(msg.amount) + parseFloat(cart_itogo.html())
);
order_itogo_delivery.html(
parseFloat(msg.amount)
);
//cart_itogo.html(
// parseFloat(msg.AmountPlusFSAmount) + parseFloat(cart_itogo.html())
//);
order_itogo_delivery_up.html(
parseFloat(msg.amount)
);
});
$('#id_deliv_type').select2({
placeholder: "Выберите способ доставки",
} else {
order_itogo.html(cart_itogo);
order_itogo_up.html(cart_itogo);
order_itogo_delivery.html(0);
order_itogo_delivery_up.html(0);
}
}
$('#id_kazpost_city').select2({
placeholder: "Выберите почтовое отделение",
allowClear: false
}).on('change', function () {
selectCity();
selectKazpostCity();
});
@ -247,6 +287,36 @@ $(document).ready(function () {
}
});
$('input[name=deliv_service]').change(function () {
switch ($(this).val()) {
case 'kazpost' :
selectKazpostCity();
$('.alemtat_block').hide();
$('.kazpost_block').show();
break;
case 'alemtat' :
selectCity();
$('.alemtat_block').show();
$('.kazpost_block').hide();
$('#id_city').select2({
placeholder: "Выберите город",
allowClear: false
}).on('change', function () {
selectCity();
});
$('#id_deliv_type').select2({
placeholder: "Выберите способ доставки",
allowClear: false
}).on('change', function () {
selectCity();
});
break;
}
});
selectCity();
selectKazpostCity();
$('#call-form').on('submit', function () {
var f_name = $('#call-form #id_name');
var f_phone = $('#call-form #id_phone');

@ -105,7 +105,7 @@ class OrderAdmin(admin.ModelAdmin):
obj.save()
list_display = (
'first_name', 'last_name', 'phone', 'email', 'city', 'address', 'deliv_type', 'amount', 'status',
'first_name', 'last_name', 'phone', 'email', 'deliv_service', 'city', 'kazpost_city', 'address', 'deliv_type', 'amount', 'status',
get_order_items)

@ -7,7 +7,7 @@ from store.models import OrderData, ProductFeedback
class OrderForm(forms.ModelForm):
class Meta:
model = OrderData
fields = ['first_name', 'last_name', 'phone', 'email', 'city', 'address', 'deliv_type']
fields = ['first_name', 'last_name', 'phone', 'email', ]#'city', 'address', 'deliv_type']
class ProductFeedbackForm(forms.ModelForm):

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -309,6 +309,25 @@ STATUS_CHOICES = (
(5, 'Выполнен'),
)
KAZPOST_CITIES = (
(1, "Астана"),
(2, "Актобе"),
(3, "Актау"),
(4, "Алматы"),
(5, "Атырау"),
(6, "Караганда"),
(7, "Кызылорда"),
(8, "Кокшетау"),
(9, "Костанай"),
(10, "Павлодар"),
(11, "Петропавловск"),
(12, "Тараз"),
(13, "Усть-Каменогорск"),
(14, "Уральск"),
(15, "Шымкент"),
(16, "Талдыкорган")
)
class OrderData(models.Model):
created = models.DateTimeField('Дата и время', auto_now_add=True, editable=False)
@ -324,11 +343,15 @@ class OrderData(models.Model):
email = models.EmailField(
'Email', blank=False, null=False)
city = models.CharField(
'Город', max_length=20, blank=False, null=False, choices=alemtat_get_cities_tuple())
'Город Алемтат', max_length=20, blank=True, null=True, choices=alemtat_get_cities_tuple())
deliv_service = models.CharField(
'Почтовая служба', max_length=20, blank=True, null=True, default='alemtat')
kazpost_city = models.IntegerField(
'Город Казпочта', blank=True, null=True, choices=KAZPOST_CITIES)
address = models.CharField(
'Адрес', max_length=100, blank=False, null=False)
deliv_type = models.CharField(
'Способ доставки', max_length=2, blank=False, null=False, default='',
'Способ Алемтат', max_length=2, blank=True, null=True, default='',
choices=alemtat_get_services_tuple())
items = models.CharField(
'Товары', max_length=256, blank=False, null=False, default='')
@ -360,6 +383,18 @@ class OrderData(models.Model):
retval += ((variation, variation_count),)
return retval
def get_city(self):
if self.city:
return self.get_city_display()
else:
return self.get_kazpost_city_display()
def get_deliv_type(self):
if self.deliv_type:
return self.get_deliv_type_display()
else:
return 'Авиапочта EMS'
class ProductFeedback(models.Model):
created = models.DateTimeField('Дата и время', auto_now_add=True, editable=False)

@ -224,33 +224,52 @@ class CartDetailView(TemplateView):
template_name = 'cart_detail.jinja'
def get_context_data(self, **kwargs):
from .models import KAZPOST_CITIES
retval = super(CartDetailView, self).get_context_data()
retval['cart'] = Cart(self.request)
retval['form'] = OrderForm(self.request.POST or None)
retval['alemtat_cities'] = alemtat_get_cities_tuple()
retval['alemtat_services'] = alemtat_get_services_tuple()
retval['kazpost_cities'] = KAZPOST_CITIES
# retval['form_delivs'] = DelivsForm()
return retval
def post(self, request, *args, **kwargs):
cart = Cart(self.request)
cart.update_items()
deliv_service = request.POST['deliv_service']
if 'order_next' in self.request.POST:
form = OrderForm(self.request.POST)
if form.is_valid():
order = form.save(commit=False)
json_items = map(lambda items: {items.item.pk: items.count}, cart.items)
order.items = str(list(json_items))
a = AlemTat()
cart = Cart(request)
order.phone = normalize_phone(order.phone)
order.deliv_service = deliv_service
if deliv_service == 'alemtat':
a = AlemTat()
order.city = request.POST['city']
order.deliv_type = request.POST['deliv_type']
order_amount = dict(a.get_amount(
order.city,
len(cart.items),
cart.weight,
order.deliv_type,
))
order.phone = normalize_phone(order.phone)
order.amount = order_amount['AmountPlusFSAmount'] + cart.total
order.address = request.POST['alemtat_address']
elif deliv_service == 'kazpost':
amount = get_kazpost_tarif(cart.weight, request.POST['kazpost_city'])
order.amount = int(amount) + cart.total
order.kazpost_city = int(request.POST['kazpost_city'])
order.address = request.POST['kazpost_address']
profile = None
try:
@ -301,6 +320,53 @@ def get_order_amount(request):
return JsonResponse(retval)
def get_kazpost_tarif(weight, to):
import requests
import json, xmljson
from lxml.etree import fromstring, tostring
import re
url="http://rates.kazpost.kz/postratesws/postratesws.wsdl"
#headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:pos="http://webservices.kazpost.kz/postratesws">
<soapenv:Header/>
<soapenv:Body>
<pos:GetPostRateRequest>
<pos:MailInfo>
<pos:Product>7</pos:Product>
<pos:MailCat>2</pos:MailCat>
<pos:SendMethod>2</pos:SendMethod>
<pos:Weight>{}</pos:Weight>
<pos:From>13</pos:From>
<pos:To>{}</pos:To>
<pos:SpecMarks/>
<pos:InCity/>
<pos:ExpressDlv/>
<pos:Size/>
<pos:DeclaredValue/>
</pos:MailInfo>
</pos:GetPostRateRequest>
</soapenv:Body>
</soapenv:Envelope>"""
body = body.format(weight*1000, to)
try:
response = requests.post(url, data=body, headers=headers)
m = re.search(r'<ns2:PostRate>(\d+)</ns2:PostRate>', response.text)
return m.group(1)
except:
return 0
def get_order_kazpost_amount(request):
retval = None
cart = Cart(request)
retval = dict(amount=get_kazpost_tarif(cart.weight, request.GET['city']))
return JsonResponse(retval)
def order_view(request, order):
order = get_object_or_404(OrderData, pk=order)

Loading…
Cancel
Save