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