def checkout(request): """Оформление заказа - Подтверждение заказа""" mh_vars = order_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/order/checkout.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=order_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Подтверждение заказа', 'link': reverse('%s:%s' % (CUR_APP, 'checkout')), }] context['page'] = page context['containers'] = containers cart = calc_cart(shopper, min_info=False) context['cart'] = cart # Оформление заказа context.update(**create_new_order(request, shopper, cart)) if 'order' in context and context['order']: template = 'web/order/confirmed.html' return render(request, template, context)
def login(request): """Авторизация пользователя""" context = {} q_string = {} containers = {} result = login_from_site(request) if isinstance(result, list): context['errors'] = result else: save_user_to_request(request, result) context['shopper'] = result.to_dict() context['redirect'] = reverse('%s:%s' % (CUR_APP, 'show_profile')) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/login/registration.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=reg_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Регистрация', 'link': reverse('%s:%s' % (CUR_APP, 'registration')), }] context['page'] = page context['containers'] = containers context['vk_link'] = VK().get_auth_user_link() context['yandex_link'] = Yandex().get_auth_user_link() return render(request, template, context)
def show_cart(request): """Оформление заказа - Корзинка""" mh_vars = cart_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/order/cart.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=mh_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Корзина', 'link': reverse('%s:%s' % (CUR_APP, 'show_cart')), }] context['page'] = page context['containers'] = containers context['cart'] = calc_cart(shopper, min_info=False) return render(request, template, context)
def cat_on_site(request, link: str = None): """Странички каталога :param link: ссылка на рубрику (без /cat/ префикса) """ mh_vars = cat_vars.copy() kwargs = { 'q_string': { 'by': 30, }, } context = get_cat_for_site(request, link, **kwargs) if not context.get(settings.DEFAULT_CATALOGUE_TAG): raise Http404 containers = {} if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/cat/%slist.html' % (mh_vars['template_prefix'], ) page = SearchLink(context['q_string'], request, containers) if page: context['page'] = page context['containers'] = containers return render(request, template, context)
def product_on_site(request, product_id: int): """Страничка товара/услуги :param product_id: ид товара/услуги """ mh_vars = cat_vars.copy() context = get_product_for_site(request, product_id) if not context.get('product'): raise Http404 q_string = {} containers = {} photos = {} # Разбивка фоток for photo in context.get('photos', []): if not photo.name: photo.name = "0" if not photo.name in photos: photos[photo.name] = [] photos[photo.name].append(photo) context['photo_sections'] = photos if photos: context['photo_main_section_id'] = list(photos.keys())[0] if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/cat/%sproduct.html' % (mh_vars['template_prefix'], ) page = SearchLink(q_string, request, containers) context['page'] = page context['containers'] = containers return render(request, template, context)
def show_order(request, order_id: int): """Просмотр оформленного заказа""" mh_vars = order_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/order/order.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=mh_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Заказ', 'link': reverse('%s:%s' % (CUR_APP, 'show_order'), kwargs={'order_id': order_id}), }] context['page'] = page context['containers'] = containers result = get_order(shopper, order_id) context['cart'] = result.get('cart', {}) context['cart']['purchases'] = result.get('purchases', []) context['order'] = result.get('order') return render(request, template, context)
def cat_on_site(request, link: str = None): """Странички каталога :param link: ссылка на рубрику (без /cat/ префикса) """ mh_vars = cat_vars.copy() kwargs = { 'q_string': { 'by': 30, }, } context = get_cat_for_site(request, link, **kwargs) if not context.get(settings.DEFAULT_CATALOGUE_TAG): raise Http404 containers = {} if request.is_ajax(): # Если запрос по фасетному поиску, # отдаем отрендеренный шаблон if request.GET.get('ff'): context = { 'plp': render_to_string('web/cat/plp.html', context), 'my_paginator': context['my_paginator'], } return JsonResponse(context, safe=False) template = 'web/cat/%slist.html' % (mh_vars['template_prefix'], ) page = SearchLink(context['q_string'], request, containers) if page: context['page'] = page context['containers'] = containers return render(request, template, context)
def registration(request): """Страничка для регистрации""" mh_vars = reg_vars.copy() context = {} q_string = {} containers = {} if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/login/registration.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=mh_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Регистрация', 'link': reverse('%s:%s' % (CUR_APP, 'registration')), }] context['page'] = page context['containers'] = containers context['vk_link'] = VK().get_auth_user_link() context['yandex_link'] = Yandex().get_auth_user_link() return render(request, template, context)
def show_sitemap(self, request): """Формирование ссылок для карты сайта :param request: HttpRequest TODO: постраничная навигация TODO: выполнять кроном и ложить в кэш/файл """ managers = self.get_menu_managers() context = {} q_string = {} containers = {} # для перевода all_containers = [] all_blocks = [] for key, manager in managers.items(): query = Blocks.objects.filter( container__in=manager['containers']).order_by('position') manager['structure'] = [] for container in manager['containers']: menus = [] blocks = [ block for block in query if block.container_id == container ] recursive_fill(blocks, menus, parents='') sort_voca(menus) container = Containers.objects.filter(pk=container).first() all_containers.append(container) all_blocks += blocks manager['structure'].append({ 'container': container, 'blocks': menus }) # Переводим блоки/контейнеры if settings.IS_DOMAINS and request: domains = get_domains() domain = get_domain(request, domains) if domain: domains = [domain] get_translate(all_blocks, domains) translate_rows(all_blocks, domain) get_translate(all_containers, domains) translate_rows(all_containers, domain) context['managers'] = managers page = SearchLink(q_string, request, containers) if not page: page = Blocks(name='Карта сайта') context['breadcrumbs'] = [{ 'name': page.name, 'link': '/sitemap/', }] context['page'] = page context['containers'] = containers template = 'sitemap_html.html' return render(request, template, context)
def checkout(request): """Оформление заказа - Подтверждение заказа""" mh_vars = order_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/order/checkout.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=order_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Подтверждение заказа', 'link': reverse('%s:%s' % (CUR_APP, 'checkout')), }] context['page'] = page context['containers'] = containers cart = calc_cart(shopper, min_info=False) context['cart'] = cart # Оформление заказа comments = None wrist_size = request.POST.get('wrist_size') birthday = request.POST.get('birthday') if wrist_size or birthday: comments = [] if wrist_size: comments.append('Размер запястья %s' % wrist_size) if birthday: comments.append('День рождения %s' % birthday) comments = ', '.join(comments) context.update(**create_new_order(request, shopper, cart, comments)) if 'order' in context and context['order']: template = 'web/order/confirmed.html' payment = YandexKassa().create_payment( domain='%s%s' % ('https://' if request.is_secure() else 'http://', request.META['HTTP_HOST']), summa='%s' % context['order'].total, desc='Оплата заказа №%s' % context['order'].id, ) if 'confirmation' in payment: context['yandex_payment_link'] = payment['confirmation'][ 'confirmation_url'] Transactions.objects.create(order=context['order'], uuid=payment['id'], ptype=1) return render(request, template, context)
def demo(request): """Страничка для разработки""" mh_vars = demo_vars.copy() context = {} q_string = {} containers = {} if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/demo.html' page = SearchLink(q_string, request, containers) context['page'] = page context['containers'] = containers return render(request, template, context)
def home(request): """Главная страничка сайта""" mh_vars = main_vars.copy() context = {} q_string = {} containers = {} if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/main.html' page = SearchLink(q_string, request, containers) context['page'] = page context['containers'] = containers return render(request, template, context)
def payment(request, provider: str, action: str): """Оплата заказа :param request: HttpRequest :param provider: sbrf/ :param action: success/fail """ mh_vars = payment_vars.copy() context = { 'provider': provider, 'action': action, } q_string = {} containers = {} shopper = get_shopper(request) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/order/payment.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=order_vars['singular_obj']) kwargs = { 'provider': provider, 'action':action, } context['breadcrumbs'] = [{ 'name': 'Оплата заказа', 'link': reverse('%s:%s' % (CUR_APP, 'payment'), kwargs=kwargs), }] context['page'] = page context['containers'] = containers if request.GET.get('orderId'): order_id = request.GET['orderId'] order = Orders.objects.filter(shopper=shopper, external_number=order_id).first() if order: sber = SberPaymentProovider() order_status = sber.get_order_status(order.external_number, order.id) context['order_status'] = order_status context['order'] = order return render(request, template, context)
def checkout(request): """Оформление заказа - Подтверждение заказа""" mh_vars = order_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/order/checkout.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=order_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Подтверждение заказа', 'link': reverse('%s:%s' % (CUR_APP, 'checkout')), }] context['page'] = page context['containers'] = containers cart = calc_cart(shopper, min_info=False) context['cart'] = cart # Оформление заказа context.update(**create_new_order(request, shopper, cart)) if 'order' in context and context['order']: template = 'web/order/confirmed.html' # Если пользователь вернулся # на страничку оформленного заказа, # например, для оплаты if request.GET.get('order_id'): order_id = request.GET['order_id'] if order_id.isdigit(): order = Orders.objects.filter(pk=order_id, shopper=shopper).first() if order: template = 'web/order/confirmed.html' context['order'] = order return render(request, template, context)
def product_on_site(request, product_id: int): """Страничка товара/услуги :param product_id: ид товара/услуги """ mh_vars = cat_vars.copy() context = get_product_for_site(request, product_id) if not context.get('product'): raise Http404 q_string = {} containers = {} if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/cat/%sproduct.html' % (mh_vars['template_prefix'], ) page = SearchLink(q_string, request, containers) context['page'] = page context['containers'] = containers return render(request, template, context)
def registration(request): """Страничка для регистрации""" mh_vars = reg_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) if shopper: return redirect(reverse('%s:%s' % (CUR_APP, 'show_profile'))) # ----------- # регистрация # ----------- if request.method == 'POST': result = register_from_site(request) if isinstance(result, list): context['errors'] = result else: save_user_to_request(request, result) context['shopper'] = result.to_dict() context['redirect'] = reverse('%s:%s' % (CUR_APP, 'show_profile')) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/login/registration.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=reg_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': mh_vars['singular_obj'], 'link': reverse('%s:%s' % (CUR_APP, 'registration')), }] context['page'] = page context['containers'] = containers context['vk_link'] = VK().get_auth_user_link() context['yandex_link'] = Yandex().get_auth_user_link() return render(request, template, context)
def show_profile(request): """Личный кабинет пользователя""" mh_vars = profile_vars.copy() context = { 'fs_server': settings.FREESWITCH_DOMAIN, 'tab': request.GET.get('tab'), } q_string = {} containers = {} shopper = get_shopper(request) if not shopper: return redirect(reverse('%s:%s' % (CUR_APP, 'login'))) if request.method == 'POST': result = update_profile_from_site(request) if isinstance(result, list): context['errors'] = result else: save_user_to_request(request, result) context['shopper'] = result.to_dict() context['redirect'] = reverse('%s:%s' % (CUR_APP, 'show_profile')) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/login/profile.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=mh_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Ваш аккаунт', 'link': reverse('%s:%s' % (CUR_APP, 'show_profile')), }] context['page'] = page context['containers'] = containers context['shopper'] = shopper #context['orders'] = Orders.objects.filter(shopper=shopper).order_by('-created')[:50] return render(request, template, context)
def phones_cat(request, link: str = None): """Странички каталога телефонов :param link: ссылка на рубрику (без /phones/ префикса) """ mh_vars = cat_vars.copy() kwargs = { 'q_string': { 'by': 10, }, } context = get_phones_for_site(request, link, **kwargs) containers = {} if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/phones/%slist.html' % (mh_vars['template_prefix'], ) page = SearchLink(context['q_string'], request, containers) if page: context['page'] = page context['containers'] = containers return render(request, template, context)
def transaction_success(request): """Оформление заказа - Успешная оплата""" mh_vars = order_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=order_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Заказ оплачен', 'link': reverse('%s:%s' % (CUR_APP, 'transaction_success')), }] context['page'] = page context['containers'] = containers template = 'web/order/transaction_success.html' return render(request, template, context)
def DefaultFeedback(request, **kwargs): """Контакты и форма обратной связи kwargs['fv']: fv => array дополнительной информации для письма ------------------------------------------------ Любое количество полей с его описанием принимаем из main.views.FeedBack kwargs['fields'] = [{"name":"value"}, ...] name - название input/select... value - описание что за поле соответственно, вытаскиваем из POST по name и описание будет value:request.POST['name'] ------------------------------------------------- kwargs['additional_emails'] = True => принимаем request.POST.get("additional_emails) kwargs['additional_emails_condition'] = "223.ru" => условие - в email должно быть это выражение ------------------------------------------------- kwargs['additional_conds'] - доп. валидация kwargs['additional_conds'] = [ {"name":"sms", "error":u"Неправильный смс-код", "value":"1234"}, ..., ] """ q_string = kwargs.get('q_string', {}) breadcrumbs = kwargs.get('breadcrumbs', []) result = {'errors': []} # ----------------------------------- # Принудительная попытка отправки, # даже если не все гладко - например, # не все поля заполнены # ----------------------------------- force_send = kwargs.get('force_send') == True do_not_send = kwargs.get('do_not_send') == True isError = None if not breadcrumbs: breadcrumbs.append({ 'name': 'Обратная связь', 'link': '/feedback/', }) if request.method == "GET": product = kwargs.get('product') q_string['recall'] = kwargs.get('recall') containers = {} context = {} template = kwargs.get('template', 'web/main_stat.html') page = SearchLink(q_string, request, containers) context['page'] = page context['q_string'] = q_string context['breadcrumbs'] = breadcrumbs context['containers'] = containers context['product'] = product return render(request, template, context) # ------------------- # Дополнительные поля # ------------------- fields = kwargs.get('fields', []) feedback_vars = feedback_form(request, q_string, fields=fields) for required_key in ('name', 'phone', 'msg'): if not required_key in feedback_vars: result['error'] = required_key isError = 1 # ------------------------------------ # Принудительная отправка даже # при незаполненных обязательных полях # ------------------------------------ if force_send: isError = None if 'error' in result: del result['error'] # ------------------------ # Проверка по доп условиям # ------------------------ additional_conds = kwargs.get('additional_conds', []) for acond in additional_conds: v = request.POST.get(acond['name']) if not v == acond['value']: result['errors'].append(acond['error']) result['error'] = acond['name'] isError = 1 if not isError: result['success'] = 1 title = kwargs.get('title') if title: feedback_vars['title'] = title fv = kwargs.get('fv', []) for item in fv: feedback_vars['result'] += item logger.info('\n[--- SENDING EMAIL ---]' + '\n[TITLE]:%s' % feedback_vars['title'] + '\n[MSG]: %s' % feedback_vars['result'] + '\n[SENDER]: %s' % feedback_vars['sender'] + '\n[EMAILS]: %s' % feedback_vars['emails'] + '\n[---------------------]') mail = EmailMessage(feedback_vars['title'], feedback_vars['result'], feedback_vars['sender'], feedback_vars['emails']) mail.content_subtype = 'html' if feedback_vars['file']: mail.attach(feedback_vars['file']['name'], feedback_vars['file']['content'], feedback_vars['file']['content_type']) if not do_not_send: try: mail.send() except Exception as e: result['error'] = str(e) else: logger.info(json_pretty_print(feedback_vars)) # --------------------------- # Не возвращаем HttpResponse # --------------------------- if kwargs.get('dummy'): return {'feedback_vars': feedback_vars, 'result': result} return JsonResponse(result, safe=False)
def checkout(request): """Оформление заказа - Подтверждение заказа""" mh_vars = order_vars.copy() context = {} q_string = {} containers = {} shopper = get_shopper(request) if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/order/checkout.html' page = SearchLink(q_string, request, containers) if not page: page = Blocks(name=order_vars['singular_obj']) context['breadcrumbs'] = [{ 'name': 'Подтверждение заказа', 'link': reverse('%s:%s' % (CUR_APP, 'checkout')), }] context['page'] = page context['containers'] = containers cart = calc_cart(shopper, min_info=False) context['cart'] = cart # Оформление заказа context.update(**create_new_order(request, shopper, cart)) if 'order' in context and context['order']: template = 'web/order/confirmed.html' # Если пользователь вернулся # на страничку оформленного заказа, # например, для оплаты if request.GET.get('order_id'): order_id = request.GET['order_id'] if order_id.isdigit(): order = Orders.objects.filter(pk=order_id, shopper=shopper).first() if order: template = 'web/order/confirmed.html' context['order'] = order sber = SberPaymentProovider() order_status = sber.get_order_status(order.external_number, order.id) context['order_status'] = order_status # ----------------------------------------- # Если пользователь пытается оплатить заказ # ----------------------------------------- if 'order' in context and request.GET.get('pay') == 'sbrf': order = context['order'] scheme = 'http://' if request.is_secure(): scheme = 'https://' host = '%s%s' % (scheme, request.META['HTTP_HOST']) env = '' if settings.DEBUG: env = 'test_%s' % str(time.time()) params = { 'amount': int(order.total * 100), 'orderNumber': '%s%s' % (env, order.id), 'returnUrl': '%s/payment/sbrf/success/' % host, 'failUrl': '%s/payment/sbrf/fail/' % host, #'description': 'Тестовый заказ', 'clientId': shopper.id, 'email': shopper.email, 'phone': shopper.phone, } sber = SberPaymentProovider() register_order = sber.register_do(**params) context.update(register_order) # ------------------------ # Переадресация на форму и # запись номера заказа # ------------------------ if 'formUrl' in register_order: Orders.objects.filter(pk=order.id).update(external_number=register_order['orderId']) return redirect(register_order['formUrl']) return render(request, template, context)
def product_on_site(request, product_id: int): """Страничка товара/услуги :param product_id: ид товара/услуги """ colors = ( '6', #'Зеленый', '1', #'Красный', '2', #'Черный', '3', #'Живые фото', '8', #'Серебристый', '7', #'Серый', '5', #'Синий', '4', #'Желтый', ) live_photos_id = '3' mh_vars = cat_vars.copy() context = get_product_for_site(request, product_id) if not context.get('product'): raise Http404 q_string = {} containers = {} photos = {} sorted_photos = [] main_section = None z = 0 main_color = '0' product_color = ProductColor.objects.filter(product=product_id).first() if product_color: main_color = product_color.color # Разбивка фоток for photo in context.get('photos', []): if not photo.name: photo.name = '0' if not photo.name in photos: photos[photo.name] = [] photos[photo.name].append(photo) if photo.name in colors: ind = colors.index(photo.name) if not main_section == 0 or main_section > ind: main_section = z z += 1 sorted_photos = [{ 'section_id': color, 'photos': photos[color], } for color in colors if color in photos and color != live_photos_id] context['live_photos'] = photos.get(live_photos_id) context['photo_sections'] = sorted_photos if sorted_photos: context['photo_main_section_id'] = main_color or sorted_photos[0][ 'section_id'] if request.is_ajax(): return JsonResponse(context, safe=False) template = 'web/cat/%sproduct.html' % (mh_vars['template_prefix'], ) page = SearchLink(q_string, request, containers) context['page'] = page context['containers'] = containers return render(request, template, context)