예제 #1
0
def get_messages(request, order, next_messages=0):

    dict_addition_for_message={}
    last_messages = int(next_messages)+20

    # dbl.log("22" )
    dbl.log("22 некст аалааьа     " + str(next_messages))
    chat_list = Chat.objects.filter(order_id = order.id).order_by('-date')[int(next_messages):last_messages]

    count = len(chat_list)

    # Лист приложений 
    list_additions = []

    for one_message in chat_list:

        # dbl.log("4444" )

        addition_list = Chat_Addition.objects.filter(chat_id=one_message.id)

        # Добавление элемента в словарь 
        dict_addition_for_message[one_message] = addition_list

    message_block = render_message_block( request, dict_addition_for_message )

    return message_block, count
예제 #2
0
def client_feedback(request):

    #  ЗДЕСЬ БУДЕТ ПРОВЕРКА АУТЕНТИФИКАЦИИ
    # if request.user.is_authenticated:
    #     pass
    #     client = User.objects.get(user=request.user)
    # else:
    #     client = ''

    client = ''

    # Получение данных из формы в переменную
    form = FeedbackForm(request.POST)

    #  Получение данных из формы и сохранение в бд
    if request.method == "POST":
        try:

            # Здесь автоматически проверяются все поля формы методами clean_...
            if form.is_valid():

                # Сохранение запроса (происходит тогда, когда все поля валидны)
                form.save()
                return redirect('feedback:feedback_success')

        except Exception as error:
            pass
            dbl.log("Ошибка работы с фидбеком" + str(error))

    return render(request, 'review/feedback.html', {
        'client': client,
        'form': form
    })
예제 #3
0
def add_pay(request):

    # Получение данных из формы в переменную
    form = PayForm(request.GET)
    data = {'status': 'no'}

    if form.is_valid():

        try:
            pay = Pay()

            # Заполнение полей модели
            order_id = form.cleaned_data['order_id']
            order = Order.objects.get(id=int(order_id))
            pay.order = order
            pay.amount = form.cleaned_data['amount']
            pay.save()

            # Получения суммы оплат по данному заказу и обновление paid_amount
            amount = Pay.get_payment_of_order(order.id)
            order.paid_amount = amount
            order.save()
            data = {'status': 'ok'}

        # except :
        #     pass

        except Exception as error:
            pass
            dbl.log("Ошибка работы " + str(error))

    return HttpResponse(json.dumps(data), content_type='application/json')
예제 #4
0
def software_download(request, software_id):

    form = Register_by_email_phone_Form()
    url_to_download = ""

    try:
        # Объявление начальных значений
        user = None
        cookie = {}

        # Получение текущего пользователя
        user, cookie = CustomUser.get_user_or_create(request)

        if user:

            software = Software.objects.get(id=int(software_id))

            # if software:
            # Строка запроса к платежной системе
            # url_to_download = "/software_id=" + str(software.pk) + "&amount=" + str(software.cost)

            response = render(request, 'soft/download.html', {
                'software': software,
                'user': user
            })
            response = util.views.wrap_cookie(response, cookie)
            return response

    except Exception as error:
        pass
        dbl.log("Ошибка работы " + str(error))

    return redirect('software:catalog')
예제 #5
0
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})
예제 #6
0
    def clean_date_from(self):
        
        date_from = self.cleaned_data['date_from']
        dbl.log('звездыыыыы'+str(date_from))
        if date_from is not None:

            return util.forms.clean_date(date_from)
예제 #7
0
def request_to_order(request):

    # Добавление клиента в заявку, если пользователь авторизован
    if request.user.is_authenticated:
        client = request.user
    else:
        client = ''

    # Получение данных из формы в переменную
    form = RequestForm(request.POST)

    #  Получение данных из формы и сохранение в бд
    if request.method == "POST":
        try:

            # Здесь автоматически проверяются все поля формы методами clean_...
            if form.is_valid():

                # Сохранение запроса (происходит тогда, когда все поля валидны)
                form.save()
                return redirect('order:request_success')

        except Exception as error:
            pass
            dbl.log("Ошибка работы" + str(error))

    return render(request, 'order/request_to_order.html', {'client':client, 'form': form})
예제 #8
0
def Login(request):
    if request.user.is_authenticated:
        return redirect('software:catalog')
    else:
        form = LoginForm()
        message = ''
        if request.method == 'POST':
            form = LoginForm(request.POST)
            dbl.log('вью форма  ' + str(form))
            if form.is_valid():
                email = form.cleaned_data.get('email_phone')
                password = form.cleaned_data.get('password')
                dbl.log('вью  ' + str(email) + str(password))
                user = authenticate(email=email, password=password)
                dbl.log('вью юзер ' + str(user))
                if user is not None:
                    dbl.log('вью юзер не ноль ' + str(user) + str())
                    if user.is_active:
                        dbl.log('вью юзер активный' + str(user) + str())
                        login(request, user)
                        return redirect('software:catalog')
                else:
                    message = 'Проверьте логин и пароль, и попробуйте снова'
        return render(request, 'registration/login.html', {
            'form': form,
            'message': message
        })
예제 #9
0
    def clean_email(self):
        dbl.log(str(self.cleaned_data['email']))

        if self.cleaned_data['email'] is not None:
            dbl.log("aaa")

        return util.forms.clean_email(self)
예제 #10
0
def render_horizontal_widgets(list_soft,
                              id_widget=None,
                              display_type="",
                              widget_shell=True,
                              show_more=""):
    # list_soft - список ПО, id_widget - id блока виджетов, display_type - скрытий или видимы блок, widget_shell - true/false наличие большого контейнера виджета

    photo_dict = {}
    result = ''

    try:
        for soft in list_soft:

            soft_photo = soft.get_main_photo()

            # Добавляем ключ и значение в словарь
            if soft_photo is not None:
                for s in soft_photo:
                    photo_dict[soft.id] = s

    except Exception as error:
        pass
        dbl.log("Ошибка работы " + str(error))

    result = render_to_string(
        'common/pattern_horizontal_widgets.html', {
            'list_soft': list_soft,
            'photo_dict': photo_dict,
            'id_widget': id_widget,
            'display_type': display_type,
            'widget_shell': widget_shell,
            'show_more': show_more
        })
    return result
예제 #11
0
    def clean_star(self):
        star = self.cleaned_data['star']
        dbl.log('звезда !'+str(star))
        # Проверка валидности значения рейтинга
        if star == "":
            dbl.log('звездыыыыы'+str(star))
            raise ValidationError("Пожалуйста поставьте оценку")

        return star
예제 #12
0
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
        })
예제 #13
0
def Registration(request):
    form = RegisterForm()

    # Если пользователь авторизирован, то отправляем его на главную страницу
    if request.user.is_authenticated:
        return redirect('software:catalog')
    else:
        message = ''
        if request.method == 'POST':
            form = RegisterForm(request.POST)
            dbl.log('вью форма  ' + str(form))
            if form.is_valid():
                # form.save()
                email = form.cleaned_data.get('email_phone')
                # password = CustomUser.objects.make_random_password(length=8, allowed_chars="abcdefghjkmnpqrstuvwxyz01234567889")
                # user.set_password(password)

                password = form.cleaned_data.get('password')
                # dbl.log('вью  '+str(email)+str(password))
                # user = CustomUserManager().get_user_by_email_phone(email_or_phone=email)
                user = CustomUser.get_user_by_email_phone(email_or_phone=email)

                # Пользователя с такими данными нет, значит можно регистрировать
                if user is None or str(user) is None:
                    # new_user = CustomUser()
                    email_phone = form.cleaned_data['email_phone']
                    # dbl.log('емайл '+str(email_phone))
                    is_email_bool = is_email(email_phone=email_phone)
                    # dbl.log('емайл 2 '+str(email_phone))

                    if is_email_bool:

                        # Сохранение запроса (происходит тогда, когда все поля валидны)
                        new_user = CustomUser.objects.create_user(
                            email=email_phone, phone=None, password=password)
                    else:

                        # Сохранение запроса (происходит тогда, когда все поля валидны)
                        new_user = CustomUser.objects.create_user(
                            email=None, phone=email_phone, password=password)

                    login(request,
                          new_user,
                          backend='user.authentication.Email_PhoneAuthBackend')

                    return redirect('software:catalog')
                else:
                    message = 'Пользователь с такими данными уже есть'
        # else:
        #     form = RegisterForm()
        return render(request, 'registration/registration.html', {
            'form': form,
            'message': message
        })
예제 #14
0
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})
예제 #15
0
def index(request):

    # Блок новинок
    new_soft = Software.get_new()
    dbl.log("0")

    # Ф-ия составления html кода горихонтальных виджетов
    block_new_soft = render_horizontal_widgets(new_soft,
                                               id_widget="new_software")

    # Блок видов ПО
    site_soft = Software.software_list_by_type(cl_val=2)
    block_site_soft = render_horizontal_widgets(
        site_soft,
        id_widget="site_software",
        display_type="style=display:none;",
        widget_shell=False,
        show_more="/softwares/?classification_1_value_2=2")

    desktop_soft = Software.software_list_by_type(cl_val=1)
    block_desktop_soft = render_horizontal_widgets(
        desktop_soft,
        id_widget="desktop_software",
        widget_shell=False,
        show_more="/softwares/?classification_1_value_1=1")

    mobile_soft = Software.software_list_by_type(cl_val=3)
    block_mobile_soft = render_horizontal_widgets(
        mobile_soft,
        id_widget="mobile_software",
        display_type="style=display:none;",
        widget_shell=False,
        show_more="/softwares/?classification_1_value_3=3")

    # Блок отзывов
    list_review = Review.objects.all().filter(
        date_of_delete=None, visibility=True,
        star__gte=4).order_by('-date')[:3]

    # Блок тегов
    list_tag = Tag.objects.all().filter(date_of_delete=None,
                                        visibility=True).order_by('name')

    return render(
        request, 'main/index.html', {
            'block_new_soft': block_new_soft,
            'block_site_soft': block_site_soft,
            'block_desktop_soft': block_desktop_soft,
            'block_mobile_soft': block_mobile_soft,
            'list_review': list_review,
            'list_tag': list_tag
        })
예제 #16
0
    def clean_order_id(self):

        order_id = self.cleaned_data['order_id']
        dbl.log("000  " + str(order_id))

        try:
            order = Order.objects.get(id=int(order_id))
            dbl.log("00000 " + str(order))
        except:
            raise ValidationError(
                "Такого заказа нет, вы не можете его оплатить")

        return order_id
예제 #17
0
    def create_user(self,
                    email=None,
                    phone=None,
                    password=None,
                    session=None,
                    expires=None,
                    **extra_fields):

        if session:
            dbl.log('сесиия ' + str(session))
            dbl.log("время " + str(expires))
            extra_fields.setdefault('is_superuser', False)
            user = self.model(guest_session=session, expires=expires)

            user.save()
            dbl.log('сесиия юзер до')
            # dbl.log('сесиия юзер' +str(user) )
            dbl.log('сесиия юзер после')
            return user

        extra_fields.setdefault('is_superuser', False)
        return self._create_user(email=email,
                                 phone=phone,
                                 password=password,
                                 **extra_fields)
예제 #18
0
def render_message_block(request, dict_addition_for_message):

    result='' # Переменная шаблона ответа

    dbl.log("===111" )

    if dict_addition_for_message :
        # dbl.log("===222" )
        result = render_to_string('order/pattern_block_message_for_chat.html', {'dictionary':dict_addition_for_message}, request=request)
        # dbl.log("===333" )
        # dbl.log("===333" + str(result))
    
    # result = render_to_string('discussion/pattern_block_discussion.html', {'discussions_list':discussions_list,
    # 'comments_dict':comments_dict,'software':software, 'show_more':show_more}, request=request)
    return result
예제 #19
0
    def _create_user(self,
                     email=None,
                     phone=None,
                     password=None,
                     **extra_fields):

        # if not email:
        #     raise ValueError('Введите email')
        if email:
            email = self.normalize_email(email)
            # extra_fields.setdefault('phone', No)
            user = self.model(email=email, **extra_fields)
        else:
            user = self.model(phone=phone, **extra_fields)
        dbl.log('манагер ' + str(email) + str(phone) + str(password))
        # user = self.model(email=email, phone=phone, **extra_fields)
        # dbl.log(str(user))
        user.set_password(password)
        user.save()
        return user
예제 #20
0
def software_send_file(request, software_id):

    # todo Осуществить проверку на правомочия скачивания файла
    software = Software.objects.get(id=int(software_id))
    if software:
        dbl.log("путь  1  " + str(settings.MEDIA_ROOT))
        path = str(settings.MEDIA_ROOT) + '/' + str(software.file)
        dbl.log("путь  " + str(path))

        file = open(
            path,
            'rb')  # Открываешь файл, который вытащила из БД по переданному ИД

        response = FileResponse(file)  # Формируеьш ответ.

        return response  # И выдаешь в браузер

    message = "К сожалению, что-то пошло не так. Возможно вам стоит попробовать в следующий раз."

    return render(request, 'common/fail.html', {'message': message})
예제 #21
0
def clean_date_of_birth(self):
    date_of_birth = self.cleaned_data['date_of_birth']
    # Проверка валидности значения имени
    # if re.match(r'^[A-zА-я]+\s?[A-zА-я]*\s?[A-zА-я]*$', patronymic) is None:
    #     raise ValidationError("Некорретное отчество. Введите имя еще раз или оставьте это поле пустым")
    if re.match(r'^\d{4}-\d{2}-\d{2}$', str(date_of_birth)) is None:
        raise ValidationError("Неверный тип даты")

    dbl.log(str(date_of_birth))
    years = 10
    days_per_year = 365.24
    dbl.log(
        str(datetime.date.today() -
            datetime.timedelta(days=(years * days_per_year))))
    if date_of_birth >= datetime.date.today() - datetime.timedelta(
            days=(years * days_per_year)):
        raise ValidationError(
            "Кажется выбрана нереальная дата рождения, просим вас поменять значение на реальное"
        )

    return date_of_birth
예제 #22
0
def add_favourite(request, software_id):

    try:
        # Объявление начальных значений
        user = None
        cookie = {}

        # Получение текущего пользователя
        user, cookie = CustomUser.get_user_or_create(request)

        if user:

            software = Software.objects.get(id=int(software_id))

            data = {'status': 'success'}

            fav = software.is_favourite(user)

            if fav:

                fav.delete()

                data['result'] = False

            else:
                Favourite.objects.create(client=user, software=software)

                data['result'] = True

            response = HttpResponse(json.dumps(data),
                                    content_type='application/json')
            response = util.views.wrap_cookie(response, cookie)
            return response

    except Exception as error:
        pass
        dbl.log("Ошибка работы " + str(error))

    return redirect('software:catalog')
예제 #23
0
    def clean_date_of_birth(self):
        dbl.log("rrr")
        dbl.log(str(self.cleaned_data['date_of_birth']))

        if self.cleaned_data['date_of_birth'] is not None:
            dbl.log("aaa")

            return util.forms.clean_date_of_birth(self)
        else:
            return self.cleaned_data['date_of_birth']
예제 #24
0
    def clean_surname(self):
        dbl.log("rrr")
        dbl.log(str(self.cleaned_data['surname']))

        if len(self.cleaned_data['surname']) > 0:
            dbl.log("aaa")

            return util.forms.clean_surname(self)
        else:

            return self.cleaned_data['surname']
예제 #25
0
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
    })
예제 #26
0
    def clean_patronymic(self):
        dbl.log("rrr")
        dbl.log(str(self.cleaned_data['patronymic']))

        if len(self.cleaned_data['patronymic']) > 0:
            dbl.log("aaa")

            return util.forms.clean_patronymic(self)
        else:

            return self.cleaned_data['patronymic']
예제 #27
0
def software_buy(request, software_id):

    form = Register_by_email_phone_Form()

    try:
        # Объявление начальных значений
        user = None
        cookie = {}

        # Получение текущего пользователя
        user, cookie = CustomUser.get_user_or_create(request)
        dbl.log("заказ " + str(user))

        if user:

            # Объявление начальных значений
            order = None
            url_to_pay = ""

            software = Software.objects.get(id=int(software_id))

            # Создание заказа
            new_order = Order()
            new_order.software = software
            new_order.client = user
            new_order.cost = software.price
            new_order.name = software.name
            # todo
            # Еще добавить тип ПО надо!
            # Еще добавить тип заказа надо!

            order = new_order.get_order_or_create()
            dbl.log("заказ " + str(order))

            if order:
                # Строка запроса к платежной системе
                url_to_pay = "/order_id=" + str(order.pk) + "&amount=" + str(
                    order.cost)

            response = render(request, 'soft/buy.html', {
                'software': software,
                'user': user,
                'url_to_pay': url_to_pay
            })
            response = util.views.wrap_cookie(response, cookie)
            return response

    except Exception as error:
        pass
        dbl.log("Ошибка работы " + str(error))

    return redirect('software:catalog')
예제 #28
0
def list_review(request):
    review_list = Review.objects.all().filter(date_of_delete=None,
                                              visibility=True)

    # Получение данных из формы в переменную
    form = Search_ReviewForm(request.GET)

    try:
        # Здесь автоматически проверяются все поля формы методами clean_...
        if form.is_valid():
            pass

        # Получение пременных из формы поиска
        rating_to = form.cleaned_data['rating_to']
        rating_from = form.cleaned_data['rating_from']
        date_from = form.cleaned_data['date_from']
        date_to = form.cleaned_data['date_to']
        review_type = form.cleaned_data['review_type']
        dbl.log("мммм  " + str(date_from))
        dbl.log("мммм  " + str(date_to))
        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

        dbl.log("мммм  " + str(count))
        dbl.log("мммм  " + str(page))

        # review_type_name = "Дополнительные возможности..."
        dbl.log("111111111 ddkjdkd " +
                str(re.match(r'^\d{1,2}\.\d{2}\.\d{4}$', str(date_from))))

        # Фильтрация по дате начала отображения
        if date_from:

            # date_from_for_db = datetime.datetime.strptime(str(date_from), '%d.%m.%Y')

            review_list = review_list.filter(date__gte=date_from)

        # Фильтрация по дате окончания отображения
        if date_to:

            # date_to_for_db = datetime.datetime.strptime(str(date_to), '%d.%m.%Y')

            review_list = review_list.filter(date__lte=date_to)

        # Фильтрация по начальной границе рейтинга
        if rating_from:

            review_list = review_list.filter(star__gte=rating_from)

        # Фильтрация по конечной границе рейтинга
        if rating_to:

            review_list = review_list.filter(star__lte=rating_to)

        # Фильтрация по дополнительным фильтрам
        if review_type:

            if review_type == 'with_content':

                review_list = review_list.filter(~Q(content=''))
                # review_type='С текстом комментария'

            if review_type == 'without_content':

                review_list = review_list.filter(content='')
                # review_type='Без текста комментария'

        review_list = review_list.order_by('-date')

        # Сортировка, показать по, перейти на страницу
        review_list = util.views.sort_show_by(review_list, sort_param, count,
                                              page)

    except Exception as error:
        pass
        dbl.log("Ошибка работы с отзывом" + str(error))

    rating = [1, 2, 3, 4, 5]
    return render(request, 'review/reviews.html', {
        'review_list': review_list,
        'form': form,
        'rating': rating
    })
예제 #29
0
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("ПО не найдено")
예제 #30
0
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