diff --git a/batiskaf/settings.py b/batiskaf/settings.py
index 0cb38a0..942657e 100644
--- a/batiskaf/settings.py
+++ b/batiskaf/settings.py
@@ -281,4 +281,9 @@ MERCHANT_ID = "92210431" # ; Терминал ИД в банковской Си
DJANGORESIZED_DEFAULT_SIZE = [1920, 1080]
DJANGORESIZED_DEFAULT_QUALITY = 75
-DJANGORESIZED_DEFAULT_KEEP_META = True
\ No newline at end of file
+DJANGORESIZED_DEFAULT_KEEP_META = True
+
+DPD_ID = '1122000140'
+DPD_KEY = '0599EDC793B39FA6C098C3A8A7B5C603BBD3BE56'
+DPD_DEV_SERVER = 'http://wstest.dpd.ru'
+DPD_SERVER = 'http://ws.dpd.ru'
diff --git a/batiskaf/templates/jinja2/cart_detail.jinja b/batiskaf/templates/jinja2/cart_detail.jinja
index 37a8807..8910bdf 100644
--- a/batiskaf/templates/jinja2/cart_detail.jinja
+++ b/batiskaf/templates/jinja2/cart_detail.jinja
@@ -103,6 +103,12 @@
Казпочта
+
+
+
+
+
{{ form|bootstrap }}
diff --git a/batiskaf/urls.py b/batiskaf/urls.py
index 227cbf2..f113ce1 100644
--- a/batiskaf/urls.py
+++ b/batiskaf/urls.py
@@ -102,7 +102,7 @@ urlpatterns = (
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_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'),
@@ -115,6 +115,9 @@ urlpatterns = (
url(r'^order/(?P.+)/$', order_view,
name='store_order_view'),
+ url(r'^get_dpd_cities/$', 'store.views.get_dpd_cities'),
+
+
url(r'^store/', include('store.urls')),
url(r'^account/', include('accounts.urls')),
url(r'^advantages/$', advantages, name='advantages'),
diff --git a/dpd/__init__.py b/dpd/__init__.py
new file mode 100644
index 0000000..7c68785
--- /dev/null
+++ b/dpd/__init__.py
@@ -0,0 +1 @@
+# -*- coding: utf-8 -*-
\ No newline at end of file
diff --git a/static/img/dpd.png b/static/img/dpd.png
new file mode 100644
index 0000000..16e5875
Binary files /dev/null and b/static/img/dpd.png differ
diff --git a/static/js/_.js b/static/js/_.js
index 937947f..46660b2 100644
--- a/static/js/_.js
+++ b/static/js/_.js
@@ -301,20 +301,65 @@ $(document).ready(function () {
$('#order-itogo-amount').html(parseFloat(cartItogo));
}
+ function selectDpdCity() {
+ console.log('dpd');
+
+ // $.get("/get_dpd_cities/", function (data) {
+ //
+ // console.log(data);
+ //
+ // $("#id_dpd_city").select2({
+ // data: data
+ // });
+ //
+ // });
+
+
+ $("#id_dpd_city").select2({
+ minimumInputLength: 2,
+ ajax: {
+ method: 'GET',
+ url: "/get_dpd_cities/",
+ dataType: 'json',
+ data: function (params) {
+ return {
+ search: params.term
+ };
+ },
+ processResults: function (data) {
+
+ return {
+ results: data
+ };
+ },
+ cache: true
+ }
+ });
+ };
+
$('input[name=deliv_service]').change(function () {
switch ($(this).val()) {
case 'pickup' :
selectPickup();
$('.alemtat_block').hide();
$('.kazpost_block').hide();
-
+ $('.dpd_block').hide();
break;
+
case 'kazpost' :
selectKazpostCity();
$('.alemtat_block').hide();
+ $('.dpd_block').hide();
$('.kazpost_block').show();
+ break;
+ case 'dpd' :
+ selectDpdCity();
+ $('.alemtat_block').hide();
+ $('.kazpost_block').hide();
+ $('.dpd_block').show();
break;
+
case 'alemtat' :
selectCity();
$('.alemtat_block').show();
diff --git a/store/views.py b/store/views.py
index 91da242..64f76e1 100644
--- a/store/views.py
+++ b/store/views.py
@@ -1,4 +1,6 @@
import base64
+import json
+
from django.contrib.auth import authenticate, login
from django.core.mail import mail_managers, mail_admins
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
@@ -19,6 +21,8 @@ from django.http import JsonResponse
from datetime import datetime
from django.conf import settings
from django.contrib.sitemaps import Sitemap
+import xml.etree.ElementTree as ET
+from django.http import HttpResponse
import kkb
@@ -92,8 +96,8 @@ class CategoryView(CategoryBaseView, TemplateView):
attr_values = [v.strip() for v in attr_values]
if attr_values:
self.products_qs = self.products_qs.filter(
- product_attributes__attribute__attribute__in=attr,
- product_attributes__value__in=attr_values).distinct()
+ product_attributes__attribute__attribute__in=attr,
+ product_attributes__value__in=attr_values).distinct()
def get_brands_by_products(self):
pass
@@ -105,14 +109,14 @@ class CategoryView(CategoryBaseView, TemplateView):
if self.is_search:
q = self.request.GET.get('q', '')
- self.products_qs = Product.objects.filter(title__icontains=q).\
+ self.products_qs = Product.objects.filter(title__icontains=q). \
sorted_in_stock_by_field('-pk')
brands_pks = [item.brand.pk for item in self.products_qs]
retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by(
'title') # list(set(map(lambda item: item.brand, self.products_qs)))
elif self.is_sale:
- self.products_qs = Product.objects.filter(variations__discount__gt=0).distinct().\
+ self.products_qs = Product.objects.filter(variations__discount__gt=0).distinct(). \
sorted_in_stock_by_field('-pk')
brands_pks = [item.brand.pk for item in self.products_qs]
retval['brands'] = Brand.objects.filter(pk__in=brands_pks).order_by('title')
@@ -131,7 +135,7 @@ class CategoryView(CategoryBaseView, TemplateView):
if self.brand_pks:
self.products_qs = self.products_qs.filter(
- brand__pk__in=self.brand_pks)
+ brand__pk__in=self.brand_pks)
if self.sort:
sort_parameter = dict(self.ORDER_PARAMETERS)[self.sort]
@@ -139,12 +143,12 @@ class CategoryView(CategoryBaseView, TemplateView):
if sort_parameter in ['price_min', '-price_min']:
preordered_qs = self.products_qs.extra(
- select={
- 'price_min':
- 'SELECT MIN(price) FROM store_productvariation ' +
- 'WHERE store_productvariation.product_id ' +
- '= store_product.id'
- })
+ select={
+ 'price_min':
+ 'SELECT MIN(price) FROM store_productvariation ' +
+ 'WHERE store_productvariation.product_id ' +
+ '= store_product.id'
+ })
if preordered_qs:
self.products_qs = preordered_qs.order_by('-have_stock', sort_parameter)
else:
@@ -169,7 +173,7 @@ class ProductView(CategoryBaseView, DetailView):
self.category = self._get_full_category(kwargs['categories'])
retval = super(ProductView, self).get(request, args, kwargs)
ranee = request.session.get('ranee', [])
- #import pdb;pdb.set_trace()
+ # import pdb;pdb.set_trace()
if kwargs['slug'] not in ranee:
ranee.append(kwargs['slug'])
request.session['ranee'] = ranee
@@ -182,18 +186,19 @@ class ProductView(CategoryBaseView, DetailView):
retval['form'] = ProductFeedbackForm(self.request.POST or None)
retval['updated'] = ProductsUpdate.objects.last()
ranee = self.request.session.get('ranee', [])
- #import pdb;pdb.set_trace()
- #ranee.pop(kwargs['object'].slug)
+ # import pdb;pdb.set_trace()
+ # ranee.pop(kwargs['object'].slug)
retval['ranee'] = []
for i in ranee:
- #import pdb; pdb.set_trace()
+ # import pdb; pdb.set_trace()
if kwargs and i != kwargs['object'].slug:
try:
p = Product.objects.get(slug=i)
if p not in retval['ranee']:
retval['ranee'].append(p)
- except: pass
- #import pdb;pdb.set_trace()
+ except:
+ pass
+ # import pdb;pdb.set_trace()
if retval['ranee']:
retval['ranee'] = retval['ranee'][::-1][:4]
@@ -223,7 +228,7 @@ class CartAddView(RedirectView):
cart = Cart(self.request)
try:
item_variant = ProductVariation.objects.get(
- pk=self.request.GET.get('pk'))
+ pk=self.request.GET.get('pk'))
except ProductVariation.DoesNotExist:
return redirect('/')
except:
@@ -290,10 +295,10 @@ class CartDetailView(TemplateView):
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.city,
+ len(cart.items),
+ cart.weight,
+ order.deliv_type,
))
order.amount = order_amount['AmountPlusFSAmount'] + cart.total
order.address = request.POST['alemtat_address']
@@ -311,28 +316,28 @@ class CartDetailView(TemplateView):
try:
profile = Profile.objects.get(phone=normalize_phone(order.phone))
- #profile.set_password(settings.PROFILE_TEMP_PASSWORD)
- #profile.save()
+ # profile.set_password(settings.PROFILE_TEMP_PASSWORD)
+ # profile.save()
send_email(profile, template='mail/order.jinja')
except:
from random import randint
import requests
password = randint(10000000, 99999999)
profile = Profile.objects.create(
- phone=normalize_phone(order.phone),
- email=order.email,
- first_name=order.first_name,
- last_name=order.last_name,
+ phone=normalize_phone(order.phone),
+ email=order.email,
+ first_name=order.first_name,
+ last_name=order.last_name,
)
profile.set_password(password)
profile.save()
phone = normalize_phone(order.phone)
params = dict(
- login='Jango.kz',
- psw='AcEMXtLGz042Fc1ZJUSl',
- phones='7{}'.format(phone),
- mes='Batiskaf.kz - Vash parol: {}'.format(password)
+ login='Jango.kz',
+ psw='AcEMXtLGz042Fc1ZJUSl',
+ phones='7{}'.format(phone),
+ mes='Batiskaf.kz - Vash parol: {}'.format(password)
)
requests.get('http://smsc.ru/sys/send.php', params=params)
@@ -363,10 +368,10 @@ def get_order_amount(request):
a = AlemTat()
cart = Cart(request)
retval = dict(a.get_amount(
- request.GET['city'],
- len(cart.items),
- cart.weight,
- request.GET['deliv'],
+ request.GET['city'],
+ len(cart.items),
+ cart.weight,
+ request.GET['deliv'],
))
_retval = {k: _currency.get_price(v) for k, v in retval.items() if k != 'FS'}
@@ -375,12 +380,11 @@ def get_order_amount(request):
def get_kazpost_tarif(weight, to):
-
import requests
import re
- url="http://rates.kazpost.kz/postratesprod/postratesws.wsdl"
- #headers = {'content-type': 'application/soap+xml'}
+ url = "http://rates.kazpost.kz/postratesprod/postratesws.wsdl"
+ # headers = {'content-type': 'application/soap+xml'}
headers = {'content-type': 'text/xml'}
body = """
@@ -403,7 +407,7 @@ def get_kazpost_tarif(weight, to):
"""
- body = body.format(weight*1000, to)
+ body = body.format(weight * 1000, to)
try:
response = requests.post(url, data=body, headers=headers)
@@ -441,7 +445,7 @@ def order_kkb(request, order):
c_appendix = dict(items=cart.items, deliv_price=order.amount - cart.total)
render_appendix = render_to_string('kkb/appendix.xml', c_appendix)
appendix = base64.b64encode(
- bytes(render_appendix, 'utf-8')
+ bytes(render_appendix, 'utf-8')
).decode('utf-8')
c = dict(order=order, context=context, appendix=appendix)
@@ -464,6 +468,58 @@ def kkb_result(request):
return render(request, 'kkb_ok.jinja')
+def get_dpd_cities(request, *args, **kwargs):
+ import requests
+
+ url = "http://ws.dpd.ru/services/geography2?wsdl"
+ headers = {'content-type': 'text/xml'}
+ body = """
+
+
+
+
+
+ {clientID}
+ {clientKey}
+
+ KZ
+
+
+
+
+ """
+ places = list()
+ search = request.GET.get('search', '')
+
+ body = body.format(clientID=settings.DPD_ID, clientKey=settings.DPD_KEY)
+ try:
+ response = requests.post(url, data=body, headers=headers)
+ elements = ET.fromstring(response.content).findall(".//return")
+
+ if search:
+ for el in elements:
+ if search.lower() in el.find('.//cityName').text.lower():
+ add_items(el, places)
+ else:
+ for el in elements:
+ add_items(el, places)
+
+ data = json.dumps(places)
+ except:
+ data = json.dumps({'msg': 'false'})
+ return HttpResponse(data, content_type='json')
+
+
+def add_items(el, places):
+ places.append({'id': el.find('.//cityId').text,
+ 'text': '{0} {1}'.format(
+ el.find('.//abbreviation').text,
+ el.find('.//cityName').text
+ )})
+
+
class ProductSitemap(Sitemap):
changefreq = "daily"
priority = 0.8