def order_page(request, id): # Объявление начальных значений переменных order_img = Q() main_photo = Q() list_note = [] order = None try: # Проверка принадлежности запрашиваемого заказа к текущему пользователю # Получения пользователя user = CustomUser.get_user(request) if user: # Получение заказа order = Order.get_order_by_client(id, user) if order != None: # Получаем список приложений данного ПО (ФАЙЛЫ, ФОТОГРАФИИ) if order.kind == "buy": software = Software.objects.get( order_software = id ) # Получение главного фото main_photo_query = software.get_main_photo() # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for photo in main_photo_query: main_photo = photo order_img = software.get_addition() else: # Получение главного фото main_photo_query = order.get_main_photo() # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for photo in main_photo_query: main_photo = photo order_img = order.get_addition() # Исключения главного фото (main_photo) из списка фото if order_img: order_img = order_img.exclude(pk=main_photo.id) # Для разрыва текста (скрытого и открытого) # Сплит строки по '\n' по первому вхождению - получаем массив элементов одной переменной if order.note: list_note = order.note.split('\n', 1) # Получение текущего пользователя user = CustomUser.get_user(request) return render(request, 'order/order.html', {'order':order, 'user':user, 'list_note':list_note, 'order_img':order_img, 'main_photo':main_photo}) except: raise Http404("Заказ не найден") raise Http404("Заказ не найден")
def render_block_software(request, soft_list): # Хэш классификаций ПО tags_dict = {} photo_dict = {} for soft in soft_list: soft_tags_list = soft.get_tags() soft_photo = soft.get_main_photo() # Добавляем ключ и значение в словарь tags_dict[soft.id] = soft_tags_list if soft_photo is not None: # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for s in soft_photo: photo_dict[soft.id] = s # Получение текущего пользователя user = CustomUser.get_user(request) # Получение списка тегов похожих ПО result = '' result = render_to_string('soft/pattern_block_software.html', { 'soft_list': soft_list, 'photo_dict': photo_dict, 'user': user }) return result
def chat(request, id): # Объявление начальных значений переменных order = None try: # Проверка принадлежности запрашиваемого заказа к текущему пользователю # Получения пользователя user = CustomUser.get_user(request) if user: # Получение заказа order = Order.get_order_by_client(id, user) # Получение пременных из запроса next_messages = request.GET.get('next', None) # count_messages = request.GET.get('count', None) # Тогда просто отрисовывается страница чата с полседними 20 сообщениями if next_messages == None: dbl.log("111" ) next_messages = 0 message_block, count = get_messages(request, order, next_messages=next_messages) next_messages = 20 return render(request, 'order/chat.html', {'order':order, 'message_block':message_block}) # Догрузка сообщений else: dbl.log("444444444444444444" ) # Данные по умолчанию - код ответа data = {'status': 'error'} # dbl.log("111" ) message_block, count = get_messages(request, order, next_messages=next_messages) next_messages = int(next_messages)+20 dbl.log(str(next_messages) ) data['status'] = 'success' data['next'] = next_messages data['count'] = count data['result'] = message_block dbl.log("10101001" ) return HttpResponse(json.dumps(data), content_type='application/json') except Exception as error: pass dbl.log("Ошибка работы" + str(error)) return render(request, 'order/chat.html', {'order':order, 'chat':chat})
def favourites(request): # Получения пользователя user = CustomUser.get_user(request) dbl.log("1") if user: dbl.log("1") favourites = Software.get_favourites_by_user(user) dbl.log("1"+str(favourites)) # Словарь главных фото photo_dict = {} dbl.log("1") for soft in favourites: # Получение главного фото soft_photo = soft.get_main_photo() if soft_photo is not None: # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for s in soft_photo: dbl.log("1") photo_dict[soft.id] = s dbl.log("1") response= render(request, 'user/favourites.html', {'favourites':favourites, 'user':user, 'photo_dict':photo_dict}) return response
def review_page(request, id): # Объявление начальных значений переменных similar_block = "" similar_tags_block = "" user = None try: # Получение текущего пользователя user = CustomUser.get_user(request) this_object = Review.objects.get(id=id) # Получаем список приложений данного отзыва review_img = this_object.get_addition() software = Software() photo_dict = {} if this_object.software is not None: software = Software.objects.get(id=this_object.software.id) if software: soft_photo = software.get_main_photo() if soft_photo is not None: for s in soft_photo: photo_dict[software.id] = s # Второстепенные объекты - похожие ПО similar_block = software_views.render_similars( software, id_widget="same_software") similar_tags_block = software_views.render_similars_tags( software) # except: # raise Http404("Отзыв не найден") except Exception as error: pass dbl.log("Ошибка работы с отзывом" + str(error)) rating = [1, 2, 3, 4, 5] return render( request, 'review/review.html', { 'review': this_object, 'rating': rating, 'review_img': review_img, 'software': software, 'photo_dict': photo_dict, 'similar_block': similar_block, 'similar_tags_block': similar_tags_block, 'user': user })
def favourites_clean(request): # Получения пользователя user = CustomUser.get_user(request) if user: favourites = Favourite.get_favourites_by_user(user) for fav in favourites: fav.delete() return render(request, 'user/favourites.html', {'favourites':None})
def review_create(request): # Получение данных из формы в переменную form = ReviewForm(request.POST) dbl.log("Форма" + str(form)) # global list_crumb_for_software list_crumb_for_software = [['Главная', 'main:index'], ['Отзывы', 'review:list_review']] # Получение данных из формы и сохранение в бд if request.method == "POST": try: # Проверка принадлежности запрашиваемого заказа к текущему пользователю # Получения пользователя user = CustomUser.get_user(request) # Здесь автоматически проверяются все поля формы методами clean_... if form.is_valid(): new_review = Review() new_review.kind = 'com' if user: new_review.client = user new_review.content = form.cleaned_data['content'] new_review.star = form.cleaned_data['star'] new_review.name = form.cleaned_data['name'] new_review.email_phone = form.cleaned_data['email_phone'] new_review.save() addition_file = request.FILES.getlist('file') # Сохранение приложений файлов к отзыву (происходит тогда, когда все поля валидны) for file in addition_file: dbl.log("777") new_addition = Review_Addition() new_addition.review = new_review new_addition.photo = file new_addition.save() return redirect('review:review_success') except Exception as error: pass dbl.log("Ошибка работы с отзывом" + str(error)) rating = [5, 4, 3, 2, 1] return render(request, 'review/review_create.html', { 'form': form, 'rating': rating, 'list_crumb': list_crumb_for_software })
def add_download(request, software_id): message = "" download_link = "" list_crumb = [] try: # Получения пользователя user = CustomUser.get_user(request) if user: software = Software.objects.get(id=int(software_id)) Download.objects.get_or_create(client=user, software=software) message = "Благодарим вас за доверие! Через 5 секунд начнется автоматическая загрузка." # download_url = software.file # download_url = '/softwares/download?id='+str(software.id) download_url = '/softwares/' + str( software.id) + '/download/send_file' dbl.log(str(download_url)) h1 = "Успешная загрузка" list_crumb = [['Главная', 'software:catalog'], ['Каталог', 'software:catalog'], [ software.name, 'software:software_page', software.id ], [ 'Скачать бесплатно', 'software:software_download', software.id ]] return render( request, 'common/successfull.html', { 'message': message, 'download_link': download_link, 'h1': h1, 'list_crumb': list_crumb, 'download_url': download_url }) except Exception as error: pass dbl.log("Ошибка работы " + str(error)) message = "К сожалению, что-то пошло не так. Возможно вам стоит попробовать в следующий раз." return render(request, 'common/fail.html', {'message': message})
def downloads(request): # Получения пользователя user = CustomUser.get_user(request) if user: downloads = Software.get_downloads_by_user(user) # Словарь главных фото photo_dict = {} for soft in downloads: # Получение главного фото soft_photo = soft.get_main_photo() if soft_photo is not None: # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for s in soft_photo: photo_dict[soft.id] = s response= render(request, 'user/downloads.html', {'downloads':downloads, 'user':user, 'photo_dict':photo_dict}) return response
def software_page(request, id): # Объявление начальных значений переменных # Хэш классификаций ПО classif = {} software = Software() software_img = Q() main_photo = Q() software_tag = Q() list_descr = [] similar_block = "" similar_tags_block = "" discussion_comment_block = "" # Строка фильтра для хлебных крошек str_filter_for_breadcrumb = "" try: software = Software.objects.get(id=id) # Получение главного фото main_photo_query = software.get_main_photo() dbl.log("сойт 2 " + str(main_photo_query)) # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for photo in main_photo_query: main_photo = photo dbl.log("сойт 3 " + str(main_photo)) # Получаем список приложений данного ПО (ФАЙЛЫ, ФОТОГРАФИИ) software_img = software.get_addition() dbl.log("сойт 4 " + str(software_img)) # Исключения главного фото (main_photo) из списка фото if software_img: software_img = software_img.exclude(pk=main_photo.id) # Получаем список тегов данного ПО software_tag = software.get_tags() # Для разрыва текста (скрытого и открытого) # Сплит строки по '\n' по первому вхождению - получаем массив элементов одной переменной list_descr = software.description.split('\n', 1) # Получаем список классификаций данного ПО classif, str_filter_for_breadcrumb = software.get_classifications() # Второстепенные объекты - похожие ПО similar_block = render_similars(software, id_widget="same_software") similar_tags_block = render_similars_tags(software) discussion_comment_block = render_discussion_comment(software, request, limit=5) # Получение текущего пользователя user = CustomUser.get_user(request) return render( request, 'soft/software.html', { 'software': software, 'software_img': software_img, 'main_photo': main_photo, 'classif': classif, 'list_descr': list_descr, 'software_tag': software_tag, 'similar_block': similar_block, 'similar_tags_block': similar_tags_block, 'discussion_comment_block': discussion_comment_block, 'user': user, 'str_filter_for_breadcrumb': str_filter_for_breadcrumb }) # except: # raise Http404("ПО не найдено") except Exception as error: pass dbl.log("Ошибка работы " + str(error)) # return render(request, 'soft/software.html', {'software':software, 'software_img':software_img, 'main_photo':main_photo, 'classif':classif, # 'list_descr':list_descr, 'software_tag':software_tag, 'similar_block':similar_block, 'similar_tags_block':similar_tags_block, # 'discussion_comment_block':discussion_comment_block}) raise Http404("ПО не найдено")
def catalog(request): soft_list = Software.objects.all().filter(date_of_delete=None, visibility=True) dbl.log("mmmmm") dbl.log("бббб" + str(request)) # Получение пременных из формы поиска search_query_name = request.GET.get('soft_name', '') search_query_tags = request.GET.get('soft_tags', '') soft_price = request.GET.get('soft_price', '') soft_pricefrom = request.GET.get('soft_pricefrom', '') soft_priceto = request.GET.get('soft_priceto', '') modification = request.GET.get('modification', '') sort_param = request.GET.get('sort', '') if sort_param is None: sort_param = "" count = request.GET.get('count', '10') if count == "": count = 10 count = int(count) try: page = int(request.GET.get('page', '1')) except: page = 1 # Словарь для фильтра классификаций classification_dict = {} vertical_widget = None list_tags = [] # Перебор всех пришедших аргументов for req in request.GET.items(): # Проверка валидности значения имени (классификации) if re.match(r'classification_(\d+)_value_(\d+)', str(req[0])): # Проверка значения поля формы поиска if str(req[1]) != "" and str(req[1]).isdigit(): # Добавление значения в словарь classification_dict[str(req[0])] = str(req[1]) # Перменная составления запроса с фильтрами по классификациям cond = Q() # Перебор словаря классификаций for cl_val in classification_dict.values(): # Добавление условия фильтрации cond |= Q(classification_value=int(cl_val)) # Фильтрация списка всех ПО по выбранным классификациям soft_list = soft_list.filter(cond) # Исключение повторений ПО soft_list = soft_list.order_by('id').distinct() # Фильтрация по цене (бесплатные ПО) if soft_price == "soft_price_free": soft_list = soft_list.filter(price=0) # Фильтрация по цене (платные ПО) if soft_price == "soft_price_paid": soft_list = soft_list.exclude(price=0) # Фильтрация по начальной цене if soft_pricefrom: soft_list = soft_list.filter(price__gte=soft_pricefrom) # Фильтрация по конечной цене if soft_priceto: soft_list = soft_list.filter(price__lte=soft_priceto) # Фильтрация по наименованию ПО if search_query_name: soft_list = soft_list.filter(name__icontains=search_query_name) # Фильтрация по полю доработки if modification: soft_list = soft_list.filter(modification=True) # Фильтрация по списку тегов ПО if search_query_tags: # Сплит строки запроса dbl.log("ввввввв " + str(search_query_tags)) list_tags = re.split(r'[ ,]+', search_query_tags) dbl.log("ртртртрт " + str(list_tags)) # Фильтрация ПО по списку тегов soft_list = Software.get_softwares_by_tags(soft_list, list_tags) dbl.log("ddddddddd " + str(soft_list)) # Хэш классификаций ПО tags_dict = {} photo_dict = {} vertical_widget_photo_dict = {} for soft in soft_list: soft_tags_list = soft.get_tags() soft_photo = soft.get_main_photo() # Добавляем ключ и значение в словарь tags_dict[soft.id] = soft_tags_list if soft_photo is not None: # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for s in soft_photo: photo_dict[soft.id] = s # Получение текущего пользователя user = CustomUser.get_user(request) # Получение списка всех видов ПО classifications = Classification.objects.all().filter( date_of_delete=None, visibility=True).order_by('id') # if request.is_ajax(): # dbl.log("hhhh") # for soft in soft_list: # dbl.log("--- " + str(soft)) # response = sort( request, soft_list) # dbl.log("hhhh "+str(response)) # return response # Сортировка, показать по, перейти на страницу soft_list = util.views.sort_show_by(soft_list, sort_param, count, page) # Составление вертикального виджета # Список типов виджетов choice_widget_list = ['popular', 'new'] # Выбор типа choice_widget = random.choice(choice_widget_list) # dbl.log("виджеты " + str(choice_widget)) # Популярные ПО if choice_widget == "popular": vertical_widget_all = Software.get_popular() # dbl.log("виджеты " + str(vertical_widget_all)) if len(vertical_widget_all) > 6: vertical_widget = random.sample(vertical_widget_all, 6) else: vertical_widget = vertical_widget_all # dbl.log("виджеты " + str(vertical_widget)) # Новые ПО elif choice_widget == "new": vertical_widget = Software.get_new() for soft in vertical_widget: vertical_widget_soft_photo = soft.get_main_photo() if vertical_widget_soft_photo is not None: # Здесь перебор в цикле, но на самом деле в этом запросе всего 1 объект for s in vertical_widget_soft_photo: vertical_widget_photo_dict[soft.id] = s response = render( request, 'soft/catalog.html', { 'soft_list': soft_list, 'photo_dict': photo_dict, 'count': count, 'sort_param': sort_param, 'page': page, 'modification': modification, 'search_query_name': search_query_name, 'soft_price': soft_price, 'soft_pricefrom': soft_pricefrom, 'list_tags': list_tags, 'soft_priceto': soft_priceto, 'tags_dict': tags_dict, 'classifications': classifications, 'classification_dict': classification_dict, 'user': user, 'choice_widget': choice_widget, 'vertical_widget': vertical_widget, 'vertical_widget_photo_dict': vertical_widget_photo_dict }) return response
def message_add_for_chat(request, id): order = None chat = None result='' # Переменная шаблона ответа list_messages= [] # лист сообщений dict_addition_for_message = {} # словарь приложений к каждому сообщению ( id_сообщения: массив приложений ) dbl.log("111" ) if request.method == 'POST': form = ChatForm(request.POST, request.FILES) # dbl.log("222" ) try: # Проверка принадлежности запрашиваемого заказа к текущему пользователю # Получения пользователя user = CustomUser.get_user(request) # dbl.log("333" ) # Данные по умолчанию - код ответа data = {'status': 'error'} if user: # Получение заказа order = Order.get_order_by_client(id, user) if form.is_valid(): # dbl.log("444" ) new_chat = Chat() addition_file = request.FILES.getlist('file') new_chat.order = order # new_chat.order = form.cleaned_data['order_id'] new_chat.content = form.cleaned_data['content'] new_chat.sender = "cl" # Сохранение сообщения чата (происходит тогда, когда все поля валидны) new_chat.save() dbl.log("55" ) # Добавление сообщения в лист list_messages.append(new_chat) dbl.log("66" ) # Лист приложений list_additions = [] # Сохранение приложений файлов к сообщению чата (происходит тогда, когда все поля валидны) for file in addition_file: dbl.log("777" ) new_addition = Chat_Addition() new_addition.chat = new_chat new_addition.file = file new_addition.save() # Добавление приложения в массив list_additions.append(new_addition) # Добавление элемента в словарь # dict_addition_for_message[new_chat.pk] = list_additions dict_addition_for_message[new_chat] = list_additions dbl.log("888" ) # Составление шаблона сообщения с приложениями message_block = render_message_block( request, dict_addition_for_message ) dbl.log("999" ) data['status'] = 'success' data['result'] = message_block dbl.log("10101001" ) else: # !!! Если ошибка, то отправляем ошибочные данные # !!! Быстро и некрасиво добавляем ошибки в ответ. Желательно для этого сделать отдельную функцию, так как тебе в нескольких местах придется этот код повторять # data['error_text'] = '' # !!!! # for v in form.errors.values(): # !!!! # data['error_text'] += v[0] + "<br>" # !!!! data['status'] = 'error' # !!!! return HttpResponse(json.dumps(data), content_type='application/json') except Exception as error: pass dbl.log("Ошибка работы" + str(error)) return redirect('order:chat', id=order.id )
def orders(request): # Получения пользователя user = CustomUser.get_user(request) if user: # Получение неотфильтрованного списка заказов клиента orders = Order.get_orders_by_user(user) orders = orders.filter(date_of_delete=None, visibility=True) # Получение данных из формы в переменную form = Search_OrderForm(request.GET) if form.is_valid(): try: # Получение пременных из формы поиска date_type = form.cleaned_data['date_type'] date_from = form.cleaned_data['date_from'] date_to = form.cleaned_data['date_to'] month = form.cleaned_data['month'] status_order = form.cleaned_data['status_order'] type_order = form.cleaned_data['type_order'] type_soft = form.cleaned_data['type_soft'] number = form.cleaned_data['number'] name = form.cleaned_data['name'] unread_messages = form.cleaned_data['unread_messages'] sort_param = form.cleaned_data['sort'] if sort_param is None: sort_param = "" count = form.cleaned_data['count'] if count == "": count = 10 count = int(count) try: page = int(form.cleaned_data['page']) except: page = 1 # Получение поля фильтрации по типу даты date_type_for_db = "" if date_type == 'date_type_buy': date_type_for_db = "date" elif date_type == 'date_type_start': date_type_for_db = "starting_date" elif date_type == 'date_type_end': date_type_for_db = "ending_date" # Фильтрация по дате (при выборе типа даты поиска) if date_type and date_type != 'date_type_select_not_selected': # Фильтрация по дате начала фильтрации if date_from: date_from_for_db = datetime.datetime.strptime(date_from, '%d.%m.%Y') field_name = date_type_for_db+'__gte' # Переменная вида : {поле в бд для фильтрации: значение фильтра} kw = {field_name: date_from_for_db} orders = orders.filter(**kw) # Фильтрация по дате окончания фильтрации if date_to: date_to_for_db = datetime.datetime.strptime(date_to, '%d.%m.%Y') field_name = date_type_for_db+'__lte' # Переменная вида : {поле в бд для фильтрации: значение фильтра} kw = {field_name: date_to_for_db} orders = orders.filter(**kw) # Фильтрация по месяцу if month and month != '0': field_name = date_type_for_db+'__month' # Переменная вида : {поле в бд для фильтрации: значение фильтра} kw = {field_name: month} orders = orders.filter(**kw) # Фильтрация по типу заказа if type_order: # Получение типа заказа type_order_value = type_order.split('type_order_') orders = orders.filter(kind=type_order_value[1]) # СКОРЕЕ ВСЕГО НУЖНО ЭТО ПЕРЕДЕЛАТЬ ! ТАК КАК НАЗВАНИЯ ВИДА ПО могут измениться. # Фильтрация по типу ПО if type_soft and type_soft != 'type_soft_all': type_soft_for_db = "" if type_soft == 'type_soft_desc': type_soft_for_db = "Настольное приложение" elif type_soft == 'type_soft_site': type_soft_for_db = "Сайт" elif type_soft == 'type_soft_mobile': type_soft_for_db = "Мобильное приложение" orders = orders.filter(type_soft=type_soft_for_db) # Фильтрация по номеру(id) заказа if number and str(number).isdigit(): orders = orders.filter(pk=int(number)) # Фильтрация по наименованию заказа if name: orders = orders.filter(name__icontains=name) # Сортировка, показать по, перейти на страницу orders = util.views.sort_show_by(orders, sort_param, count, page ) except Exception as error: pass # ЗДЕСЬ НУЖНО БУДЕТ СДЛЕАТЬ РЕДИРЕКТ НА ОБЩУЮ СТРАНИЦУ С ОПИСАНЕИМ ОШИБКИ И ССЫЛКАМИ НА ЛК, КАТАЛОГ И ТД dbl.log("Ошибка работы с заказами" + str(error)) return render(request, 'order/orders.html', {'orders':orders, 'form':form, 'user':user}) else: return redirect('software:catalog')