Ejemplo n.º 1
0
def show_users(request, *args, **kwargs):
    """Вывод пользователей админки"""
    mh_vars = users_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP, disable_fas=True)
    mh.select_related_add('customuser')
    context = mh.context
    # -----------------------
    # Фильтрация и сортировка
    # -----------------------
    filters_and_sorters = tabulator_filters_and_sorters(
        request, custom_position_field='customuser__position')
    for rfilter in filters_and_sorters['filters']:
        mh.filter_add(rfilter)
    for rsorter in filters_and_sorters['sorters']:
        mh.order_by_add(rsorter)
    context['fas'] = filters_and_sorters['params']

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row, pass_fields=('password', ))
            item['actions'] = row.id
            if row.customuser.phone:
                item['customuser__phone'] = defiz_phone(row.customuser.phone)
            item['customuser__function'] = row.customuser.function
            # -------------------------------------
            # OneToOneField связь User с customUser
            # -------------------------------------
            item['customuser'] = object_fields(row.customuser,
                                               only_fields=('phone',
                                                            'function'))
            item['thumb'] = row.customuser.thumb()
            item['imagine'] = row.customuser.imagine()
            item['position'] = row.customuser.position
            result.append(item)

        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    context['import_xlsx_url'] = reverse('%s:%s' % (CUR_APP, 'import_xlsx'),
                                         kwargs={'action': 'users'})
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 2
0
def add_photo2gallery(photo, product, context):
    """Добавить фото к товару/услугу в галерею
       :param photo: ссылка или request.FILES.get('img')
       :param product: Товар/услуга
       :param context: результирующая информация о загрузке
    """
    new_photo = ProductsPhotos.objects.create(product=product)
    new_photo.upload_img(photo)
    context['photo'] = object_fields(new_photo, pass_fields=('product', ))
    context['photo']['folder'] = new_photo.get_folder()
    context['photo']['thumb'] = new_photo.thumb()
    context['photo']['imagine'] = new_photo.imagine()
    if not 'row' in context:
        context['row'] = object_fields(product)
    context['row']['is_gallery'] = True
Ejemplo n.º 3
0
def show_flattooltip(request, *args, **kwargs):
    """Вывод подсказок"""
    mh_vars = flattooltip_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('block')
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            result.append(item)
        if request.GET.get('page'):
            result = {'data': result,
                      'last_page': mh.raw_paginator['total_pages'],
                      'total_records': mh.raw_paginator['total_records'],
                      'cur_page': mh.raw_paginator['cur_page'],
                      'by': mh.raw_paginator['by'], }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 4
0
def show_dealers(request, *args, **kwargs):
    """Вывод дилеров
       :param request: HttpRequest
    """
    mh_vars = dealers_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('address')
    context = mh.context
    context['city_choices'] = Dealer.city_choices
    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            if row.address:
                item['address'] = row.address.address_str()
            result.append(item)
        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 5
0
def show_pickup_points(request, *args, **kwargs):
    """Вывод точек вывоза пользователей
       :param request: HttpRequest
    """
    mh_vars = pickup_points_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('shopper')
    mh.select_related_add('address')
    mh.select_related_add('order')
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        result = []
        rows = mh.standard_show(only_fields=pp_only_fields)
        for row in rows:
            item = object_fields(row,
                                 only_fields=pp_only_fields,
                                 fk_only_keys=pp_fk_keys)
            item['actions'] = row.id
            result.append(item)
        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 6
0
def edit_robot(request, action: str, row_id: int = None, *args, **kwargs):
    """Создание/редактирование роботов
       :param request: HttpRequest
       :param action: действие над объектом (создание/редактирование/удаление)
       :param row_id: ид записи
    """
    mh_vars = robots_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP, action)
    row = mh.get_row(row_id)
    context = mh.context
    if mh.error:
        return redirect('%s?error=not_found' % (mh.root_url, ))
    if request.method == 'GET':
        if action == 'create':
            mh.breadcrumbs_add({
                'link': mh.url_create,
                'name': '%s %s' % (mh.action_create, mh.rp_singular_obj),
            })
        elif action == 'edit' and row:
            mh.breadcrumbs_add({
                'link': mh.url_edit,
                'name': '%s %s' % (mh.action_edit, mh.rp_singular_obj),
            })
        elif action == 'drop' and row:
            if mh.permissions['drop']:
                row.delete()
                mh.row = None
                context['success'] = '%s удален' % (mh.singular_obj, )
            else:
                context['error'] = 'Недостаточно прав'
    elif request.method == 'POST':
        pass_fields = ()
        mh.post_vars(pass_fields=pass_fields)
        if action == 'create' or (action == 'edit' and row):
            if action == 'create':
                if mh.permissions['create']:
                    mh.row = mh.model()
                    mh.save_row()
                    context['success'] = 'Данные успешно записаны'
                else:
                    context['error'] = 'Недостаточно прав'
            if action == 'edit':
                if mh.permissions['edit']:
                    mh.save_row()
                    context['success'] = 'Данные успешно записаны'
                else:
                    context['error'] = 'Недостаточно прав'
        elif action == 'img' and request.FILES:
            mh.uploads()
    if mh.row:
        context['row'] = object_fields(mh.row, pass_fields=('password', ))
        context['row']['folder'] = mh.row.get_folder()
        context['row']['thumb'] = mh.row.thumb()
        context['row']['imagine'] = mh.row.imagine()
        context['redirect'] = mh.get_url_edit()

    if request.is_ajax() or action == 'img':
        return JsonResponse(context, safe=False)
    template = '%sedit.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 7
0
def show_seances(request, *args, **kwargs):
    """Вывод сеансов для Афиши"""
    mh_vars = seances_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('place')
    mh.select_related_add('event')
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            if row.place:
                item['place__name'] = row.place.name
            if row.event:
                item['event__name'] = row.event.name
            result.append(item)

        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 8
0
def show_email_accounts(request, *args, **kwargs):
    """Вывод Email аккаунтов"""
    mh_vars = email_accounts_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.breadcrumbs.insert(0, root_breadcrumbs)
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            result.append(item)

        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    context['import_xlsx_url'] = reverse('%s:%s' % (CUR_APP, 'import_xlsx'),
                                         kwargs={'action': 'email_accounts'})
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 9
0
def show_black_list(request, *args, **kwargs):
    """Вывод Черного списка emails"""
    mh_vars = black_list_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.breadcrumbs.insert(0, root_breadcrumbs)
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            result.append(item)

        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 10
0
def show_holding_kss(request, *args, **kwargs):
    """Вывод проведений КСС"""
    mh_vars = holding_kss_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('welder')
    mh.select_related_add('welder__subject')
    mh.select_related_add('certification')
    context = mh.context
    context['insert_breadcrumbs'] = insert_breadcrumbs
    context['welding_types'] = WELDING_TYPES
    context['materials'] = MATERIALS
    context['group_choices'] = CertSections.group_choices
    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        ids_certs = {
            row.certification.id: []
            for row in rows if row.certification
        }
        # Вытаскиваем группы для удостоверений
        cert_sections = CertSections.objects.filter(
            certification__in=ids_certs.keys()).values('certification',
                                                       'group', 'points')
        for cert_section in cert_sections:
            ids_certs[cert_section['certification']].append(cert_section)

        for row in rows:
            item = object_fields(row)
            item['sections'] = []
            if row.certification:
                item['sections'] = ids_certs.get(row.certification.id, [])
            welding_view = 'ТТ'
            with_tt = False
            with_mk = False
            for section in item['sections']:
                if section['group'] == 12:
                    with_mk = True
                else:
                    with_tt = True
            if with_mk:
                welding_view = 'МК'
            if with_mk and with_tt:
                welding_view = 'ТТ/МК'
            item['certification__certsections__group'] = welding_view
            item['actions'] = row.id
            result.append(item)
        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 11
0
def api(request, action: str = 'users'):
    """Апи-метод для получения всех данных"""
    mh_vars = users_vars.copy()
    #if action == 'users':
    #    mh_vars = users_vars.copy()

    mh = create_model_helper(mh_vars, request, CUR_APP)
    # Принудительные права на просмотр
    #mh.permissions['view'] = True
    mh.select_related_add('customuser')
    context = mh.context

    rows = mh.standard_show()

    result = []
    for row in rows:
        item = object_fields(row, pass_fields=('password', ))
        item['folder'] = row.customuser.get_folder()
        item['thumb'] = row.customuser.thumb()
        item['name'] = str(row.customuser)
        item['phone'] = row.customuser.phone
        item['function'] = row.customuser.function
        result.append(item)

    result = {
        'data': result,
        'last_page': mh.raw_paginator['total_pages'],
        'total_records': mh.raw_paginator['total_records'],
        'cur_page': mh.raw_paginator['cur_page'],
        'by': mh.raw_paginator['by'],
    }
    return JsonResponse(result, safe=False)
Ejemplo n.º 12
0
def create_double(product):
    """Создать дубль товара/услуги
       TODO: если несколько цен
       :param product: Product model instance
    """
    pass_fields = ('id', 'created', 'updated', 'position', 'parents', 'code')
    new_product = Products()
    for field in object_fields(product, pass_fields=pass_fields):
        value = getattr(product, field)
        setattr(new_product, field, value)
    code = '%s-DOUBLE' % product.code
    new_product.code = code
    new_product.save()

    # Изображение
    if product.img:
        imga = os.path.join(product.get_folder(), product.img)
        if not check_path(imga):
            new_imga = os.path.join(new_product.get_folder(), product.img)
            copy_file(imga, new_imga)

    # Галерея
    gallery = ProductsPhotos.objects.filter(
        product=product).order_by('position')
    for photo in gallery:
        imga = os.path.join(photo.get_folder(), photo.img)
        if not check_path(imga):
            params = {
                'name': photo.name,
                'product': new_product,
                'img': photo.img,
            }
            new_photo = ProductsPhotos.objects.create(**params)
            new_imga = os.path.join(new_photo.get_folder(), photo.img)
            copy_file(imga, new_imga)

    # Рубрики
    cats = ProductsCats.objects.select_related('cat').filter(product=product)
    for cat in cats:
        ProductsCats.objects.create(product=new_product, cat=cat.cat)

    # SEO
    seo_block = product.get_seo()
    if seo_block:
        seo = {
            'seo_title': seo_block.title,
            'seo_description': seo_block.description,
            'seo_keywords': seo_block.keywords,
        }
        new_product.fill_seo(**seo)

    # Свойства товара
    props = ProductsProperties.objects.select_related('prop').filter(
        product=product)
    for prop in props:
        ProductsProperties.objects.create(product=new_product, prop=prop.prop)

    return new_product
Ejemplo n.º 13
0
def show_groups(request, *args, **kwargs):
    """Вывод групп пользователей админки"""
    mh_vars = groups_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    context = mh.context
    # -----------------------
    # Фильтрация и сортировка
    # -----------------------
    filters_and_sorters = tabulator_filters_and_sorters(request)
    for rfilter in filters_and_sorters['filters']:
        mh.filter_add(rfilter)
    for rsorter in filters_and_sorters['sorters']:
        mh.order_by_add(rsorter)
    context['fas'] = filters_and_sorters['params']

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        ids_groups = {row.id: {} for row in rows}
        # Достаем пользователей групп
        users = User.objects.select_related('customuser').filter(
            groups__in=ids_groups.keys())
        for user in users:
            groups = user.groups.all().values_list('id', flat=True)
            for group in groups:
                if not user.id in ids_groups[group]:
                    ids_groups[group][user.id] = '%s (%s id=%s)' % (str(
                        user.customuser), user.username, user.id)

        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['users'] = '<br>'.join(ids_groups[row.id].values())
            result.append(item)

        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 14
0
def export_templates():
    """Экспорт шаблонов"""
    templates = Containers.objects.filter(state__in=(99, 100),
                                          tag__isnull=False)
    for template in templates:
        make_folder('export')
        path = os.path.join('export', template.tag)
        make_folder(path)
        if template.img:
            copy_file(os.path.join(template.get_folder(), template.img),
                      os.path.join(path, template.img))
        obj = object_fields(template)
        obj['blocks'] = []
        blocks = template.blocks_set.all()
        blocks_path = os.path.join(path, 'blocks')
        make_folder(blocks_path)
        for block in blocks:
            if block.img:
                copy_file(os.path.join(block.get_folder(), block.img),
                          os.path.join(blocks_path, block.img))
            obj['blocks'].append(
                object_fields(block, pass_fields=('container', )))

        json_path = os.path.join(path, 'template.json')
        with open_file(json_path, 'w+', encoding='utf-8') as f:
            f.write(json.dumps(obj))

        template_fname = '%s.html' % template.tag
        template_src = os.path.join(settings.BASE_DIR,
                                    'apps/site/templates/web/containers/',
                                    template_fname)
        template_dest = os.path.join(settings.MEDIA_ROOT, path, template_fname)
        if os.path.exists(template_src):
            shutil.copy2(template_src, template_dest)
        else:
            logger.info('template not found %s' % template_src)
Ejemplo n.º 15
0
def get_pickup_point(request, *args, **kwargs):
    """Получение точки вывоза для пользователя
       :param request: HttpRequest
    """
    result = {}
    shopper = get_shopper(request)
    if shopper:
        pickup_point = PickupPoint.objects.select_related(
            'shopper', 'order', 'address').filter(order__isnull=True,
                                                  shopper=shopper).first()
        if pickup_point:
            result = object_fields(pickup_point,
                                   only_fields=pp_only_fields,
                                   fk_only_keys=pp_fk_keys)
    return JsonResponse(result, safe=False)
Ejemplo n.º 16
0
def show_welding_joint_state(request, *args, **kwargs):
    """Вывод истории изменений статусов заявок на стыки"""
    mh_vars = welding_joint_state_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('welding_joint')
    mh.select_related_add('user')
    mh.order_by_add('-date')
    context = mh.context
    context['state_choices'] = WELDING_JOINT_STATES
    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        only_fields = (
            'id',
            'welding_joint__request_number',
            'date',
            'from_state',
            'to_state',
            'user__username',
        )
        rows = mh.standard_show(only_fields=only_fields)
        fk_keys = {
            'welding_joint': ('request_number', ),
            'user': ('username'),
        }
        result = []
        for row in rows:
            item = object_fields(
                row,
                only_fields=only_fields,
                fk_only_keys=fk_keys,
            )
            item['actions'] = row.id
            result.append(item)
        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 17
0
 def to_dict(self):
     return object_fields(self,
                          only_fields=(
                              'id',
                              'name',
                              'first_name',
                              'last_name',
                              'middle_name',
                              'email',
                              'phone',
                              'phone_confirmed',
                              'address',
                              'login',
                              'discount',
                              'balance',
                              'ip',
                          ))
Ejemplo n.º 18
0
def show_cdrcsv(request, *args, **kwargs):
    """Вывод звонков"""
    mh_vars = cdrcsv_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    context = mh.context

    # -----------------------
    # Фильтрация и сортировка
    # -----------------------
    if not mh.filters_and_sorters['sorters']:
        mh.filters_and_sorters['params']['sorters']['created'] = 'desc'
        for rsorter in mh.filters_and_sorters['sorters']:
            mh.order_by_add(rsorter)

    cache_var_sip_codes = 'sip_codes_cache'
    cache_time_sip_codes = 3600
    sip_codes = cache.get(cache_var_sip_codes)
    if not sip_codes:
        sip_codes = CdrCsv.objects.values_list('state', flat=True).distinct()
        cache.set(cache_var_sip_codes, sip_codes, cache_time_sip_codes)
    context['sip_codes'] = sip_codes

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            #item['folder'] = row.created.strftime('%Y-%m-%d')
            item['record'] = row.get_record_path()
            result.append(item)

        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 19
0
def get_welding_joint_analog(joint, new_joint: dict):
    """Ищем аналог joint по словарю new_joint
       :param joint: экземпляр модели WeldingJoint
       :param new_joint: словарь для новой заявки на стык
    """
    show_diff = False
    analog = WeldingJoint.objects.filter(joint=joint).first()
    if analog:
        # Пишем различия
        if show_diff:
            print(" ### analog ### ")
            analog_obj = object_fields(analog)
            for key, value in analog_obj.items():
                new_value = new_joint.get(key)
                if not value == new_value:
                    print('diff %s %s' % (value, new_value))
        return analog
    return None
Ejemplo n.º 20
0
def inform_server(request):
    """Апи-метод для получения всех данных по роботу
       :param request: HttpRequest
    """
    result = {}
    if not request.headers.get('token') == settings.FS_TOKEN:
        return JsonResponse(result, safe=False)
    body = json.loads(request.body)
    versions = body.get('versions', {})
    hostname = body.get('hostname')
    free_space = body.get('free_space', {})
    robot = Robots.objects.filter(server_name=hostname).first()
    if not robot:
        robot = Robots(server_name=hostname)
    robot.ip = get_request_ip(request)
    robot.selenium_version = versions.get('selenium')
    robot.chrome_version = versions.get('chrome')
    robot.server_free_space = int(free_space.get('free', 0)) / 1024
    robot.save()
    profile = body.get('profile')
    if profile and profile.get('name'):
        robot_profile = RobotProfiles.objects.filter(robot=robot, name=profile['name']).first()
        if not robot_profile:
            robot_profile = RobotProfiles(robot=robot, name=profile['name'])
        profile_fields = (
            'user_agent',
            'resolution',
            'yandex_login',
            'yandex_passwd',
        )
        needSave = False
        for field in profile_fields:
            if not getattr(robot_profile, field) == profile.get(field):
                setattr(robot_profile, field, profile.get(field))
                needSave = True
        if needSave:
            robot_profile.save()

    result['success'] = True
    result['robot'] = object_fields(robot)
    return JsonResponse(result, safe=False)
Ejemplo n.º 21
0
def show_users(request, *args, **kwargs):
    """Вывод пользователей АТС"""
    mh_vars = users_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('user')
    mh.select_related_add('personal_user')
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            user = item['user']
            item['user'] = user['username']
            item['user__username'] = user['username']

            personal_user = item['personal_user']
            if personal_user:
                item['personal_user'] = personal_user['username']
                item['personal_user__username'] = personal_user['username']

            item['actions'] = row.id
            item['folder'] = row.get_folder()
            result.append(item)

        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 22
0
def show_purchases(request, *args, **kwargs):
    """Вывод покупок
       :param request: HttpRequest
    """
    mh_vars = purchases_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('shopper')
    mh.select_related_add('order')
    mh.select_related_add('cost_type')
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            item['shopper__id'] = '%s #%s' % (str(
                row.shopper), row.shopper.id) if row.shopper else ''
            item['order__id'] = '%s #%s' % (row.order.number or '',
                                            row.order.id) if row.order else ''
            item['cost_type__id'] = row.cost_type.name if row.cost_type else ''
            result.append(item)
        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 23
0
def show_struct(request, *args, **kwargs):
    """Вывод объектов
       :param request: HttpRequest
    """
    return show_view(
        request,
        model_vars=struct_vars,
        cur_app=CUR_APP,
        extra_vars=None,
    )

    mh_vars = struct_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    context = mh.context

    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            result.append(item)
        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 24
0
def translate_mode(request, *args, **kwargs):
    """Перевод текстов админки"""
    result = {}
    domain = get_domain(request, priority='session')

    # Если русский, то без перевода
    if domain.get('lang') == 'rus':
        result['error'] = 'Русский то не надо переводить!'
        if request.POST.get('old_value'):
            result['old_value'] = request.POST['old_value']
        return JsonResponse(result, safe=False)

    perms = get_user_permissions(request.user, UITranslate)
    if not perms['edit']:
        result['error'] = 'Недостаточно прав'
    elif not domain:
        result['error'] = 'Не выбран домен'
    else:
        domain_pk = domain.get('pk')
        class_name = request.POST.get('pk')
        value = request.POST.get('value', '')[:254]
        value = value.strip()
        analog = UITranslate.objects.filter(class_name=class_name,
                                            domain_pk=domain_pk).first()
        # Херим, если пустое поле
        if not value:
            if analog:
                analog.delete()
            result['success'] = 'Перевод удален'
            return JsonResponse(result, safe=False)
        if not analog:
            analog = UITranslate(class_name=class_name, domain_pk=domain_pk)
        analog.value = value
        analog.save()
        result['translate'] = object_fields(analog)
        result['success'] = 'Данные записаны'

    result['domain'] = domain
    return JsonResponse(result, safe=False)
Ejemplo n.º 25
0
def show_search_queries(request, *args, **kwargs):
    """Вывод поисковых запросов
       :param request: HttpRequest
    """
    mh_vars = search_queries_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP)
    mh.select_related_add('site')
    context = mh.context
    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show()
        result = []
        for row in rows:
            item = object_fields(row)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            result.append(item)
        if request.GET.get('page'):
            result = {'data': result,
                      'last_page': mh.raw_paginator['total_pages'],
                      'total_records': mh.raw_paginator['total_records'],
                      'cur_page': mh.raw_paginator['cur_page'],
                      'by': mh.raw_paginator['by'], }
        return JsonResponse(result, safe=False)

    context['import_xlsx_url'] = reverse(
        '%s:%s' % (CUR_APP, 'import_xlsx'),
        kwargs={'action': 'search_queries'}
    )

    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 26
0
def show_view(request,
              model_vars: dict,
              cur_app: str,
              only_fields: list = None,
              fk_only_keys: dict = None,
              extra_vars: dict = None):
    """Вывод в таблицу записей модели
       :param request: HttpRequest
       :param model_vars: словарь с данными для модели,
           например,
               costs_vars = {
                   'singular_obj': 'Тип цены',
                   'plural_obj': 'Типы цен',
                   'rp_singular_obj': 'типа цены',
                   'rp_plural_obj': 'типов цен',
                   'template_prefix': 'costs_',
                   'action_create': 'Создание',
                   'action_edit': 'Редактирование',
                   'action_drop': 'Удаление',
                   'menu': 'products',
                   'submenu': 'costs',
                   'show_urla': 'show_costs',
                   'create_urla': 'create_cost',
                   'edit_urla': 'edit_cost',
                   'model': CostsTypes,
                   'custom_model_permissions': Products,
                   'select_related_list': ('user', ),
               }
       :param cur_app: CUR_APP во view.py,
           например,
               CUR_APP='products'
       :param only_fields: поля, которые нужно достать, остальные игнорируем,
           например,
               only_fields = (
                   'id',
                   'name',
                   'img',
                   'welding_joint__welding_date',
                   'welding_joint__side_thickness',
                   'line__titul__subject__company__name',
               )
       :param fk_only_keys: связанные поля ForeignKeys,
           если надо выбрать не все, а только нужные поля в связях,
           например,
               fk_keys = {
                   'line': ('name', ),
                   'titul': ('name', ),
                   'welding_joint': (
                       'welding_date',
                       'side_thickness',
                       'state', ),
               }
       :param extra_vars: дополнительные данные, которые нужно передать в контекст,
           а затем, через контекст для обработки в special_model_vars
    """
    if not extra_vars:
        extra_vars = {}
    mh_vars = model_vars.copy()
    mh = create_model_helper(mh_vars, request, cur_app)
    context = mh.context
    if extra_vars:
        context.update(extra_vars)
    special_model_vars(mh, mh_vars, context)
    # -----------------------------
    # Вся выборка только через аякс
    # -----------------------------
    if request.is_ajax():
        rows = mh.standard_show(only_fields=only_fields)
        result = []
        for row in rows:
            item = object_fields(row,
                                 only_fields=only_fields,
                                 fk_only_keys=fk_only_keys)
            item['actions'] = row.id
            item['folder'] = row.get_folder()
            item['thumb'] = row.thumb()
            item['imagine'] = row.imagine()
            result.append(item)
        if request.GET.get('page'):
            result = {
                'data': result,
                'last_page': mh.raw_paginator['total_pages'],
                'total_records': mh.raw_paginator['total_records'],
                'cur_page': mh.raw_paginator['cur_page'],
                'by': mh.raw_paginator['by'],
            }
        return JsonResponse(result, safe=False)
    template = '%stable.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 27
0
def edit_view(request,
              model_vars: dict,
              cur_app: str,
              action: str,
              row_id: int = None,
              pass_fields: list = None,
              extra_vars: dict = None):
    """Создание/редактирование записи для для модели
       :param request: HttpRequest
       :param model_vars: словарь с данными для модели
       :param cur_app: CUR_APP во view.py
       :param action: выполняемое действие
       :param row_id: ид записи
       :param pass_fields: поля, которые пропускаем при сохранении
       :param extra_vars: дополнительные данные,
                          которые надо передать в шаблон
    """
    if not extra_vars:
        extra_vars = {}
    if not pass_fields:
        pass_fields = ()
    mh_vars = model_vars.copy()
    mh = create_model_helper(mh_vars, request, cur_app, action)
    context = mh.context
    if extra_vars:
        context.update(extra_vars)
    special_model_vars(mh, mh_vars, context)
    row = mh.get_row(row_id)
    if mh.error:
        return redirect('%s?error=not_found' % (mh.root_url, ))
    if request.method == 'GET':
        if action == 'create':
            mh.breadcrumbs_add({
                'link':
                mh.url_create,
                'name':
                '%s %s' % (mh.action_create, mh.rp_singular_obj),
            })
        elif action == 'edit' and row:
            mh.breadcrumbs_add({
                'link':
                mh.url_edit,
                'name':
                '%s %s' % (mh.action_edit, mh.rp_singular_obj),
            })
        elif action == 'drop' and row:
            if mh.permissions['drop']:
                row.delete()
                mh.row = None
                context['success'] = '%s удален' % (mh.singular_obj, )
            else:
                context['error'] = 'Недостаточно прав'
    elif request.method == 'POST':
        mh.post_vars(pass_fields=pass_fields)
        if action == 'create' or (action == 'edit' and row):
            if action == 'create':
                if mh.permissions['create']:
                    mh.row = mh.model()
                    mh.save_row()
                    if mh.error:
                        context['error'] = mh.error
                    else:
                        context['success'] = 'Данные успешно записаны'
                else:
                    context['error'] = 'Недостаточно прав'
            if action == 'edit':
                if mh.permissions['edit']:
                    mh.save_row()
                    if mh.error:
                        context['error'] = mh.error
                    else:
                        context['success'] = 'Данные успешно записаны'
                else:
                    context['error'] = 'Недостаточно прав'

        elif not mh.error and action == 'img' and request.FILES:
            mh.uploads()
    if not mh.error and mh.row:
        if not 'row' in context:
            context['row'] = object_fields(mh.row)
        context['row']['folder'] = mh.row.get_folder()
        context['row']['thumb'] = mh.row.thumb()
        context['row']['imagine'] = mh.row.imagine()
        context['redirect'] = mh.get_url_edit()
    if request.is_ajax() or action == 'img':
        return JsonResponse(context, safe=False)
    template = '%sedit.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 28
0
def edit_pickup_point(request,
                      action: str,
                      row_id: int = None,
                      *args,
                      **kwargs):
    """Создание/редактирование пункта вывоза пользователя
       :param request: HttpRequest
       :param action: действие над объектом (создание/редактирование/удаление)
       :param row_id: ид записи
    """
    mh_vars = pickup_points_vars.copy()
    mh = create_model_helper(mh_vars, request, CUR_APP, action)
    mh.select_related_add('shopper')
    mh.select_related_add('address')
    mh.select_related_add('order')
    row = mh.get_row(row_id)
    context = mh.context  # Контекст дозаполняется в get_row

    if mh.error:
        return redirect('%s?error=not_found' % (mh.root_url, ))
    if request.method == 'GET':
        if action == 'create':
            mh.breadcrumbs_add({
                'link':
                mh.url_create,
                'name':
                '%s %s' % (mh.action_create, mh.rp_singular_obj),
            })
        elif action == 'edit' and row:
            mh.breadcrumbs_add({
                'link':
                mh.url_edit,
                'name':
                '%s %s' % (mh.action_edit, mh.rp_singular_obj),
            })
        elif action == 'drop' and row:
            if mh.permissions['drop']:
                row.delete()
                mh.row = None
                context['success'] = '%s удален' % (mh.singular_obj, )
            else:
                context['error'] = 'Недостаточно прав'
    elif request.method == 'POST':
        pass_fields = ()
        mh.post_vars(pass_fields=pass_fields)
        if action == 'create' or (action == 'edit' and row):
            if action == 'create':
                if mh.permissions['create']:
                    mh.row = mh.model()
                    mh.save_row()
                    context['success'] = 'Данные успешно записаны'
                else:
                    context['error'] = 'Недостаточно прав'
            if action == 'edit':
                if mh.permissions['edit']:
                    mh.save_row()
                    context['success'] = 'Данные успешно записаны'
                else:
                    context['error'] = 'Недостаточно прав'
    if mh.row:
        context['row'] = object_fields(mh.row,
                                       only_fields=pp_only_fields,
                                       fk_only_keys=pp_fk_keys)
        context['redirect'] = mh.get_url_edit()
    template = '%sedit.html' % (mh.template_prefix, )
    return render(request, template, context)
Ejemplo n.º 29
0
def import_from_excel(model, excel_file, required_names: list = None):
    """Импорт данных из excel
       :param model: модель, в которую импортируем данные
       :param excel_file: экселька, например, request.FILES.get("excel_file")
       :param required_names: список обязательных полей в шапке
    """
    if not required_names:
        required_names = []
    result = {'errors': []}
    if not excel_file:
        result['errors'].append('Не передан файл')
        return result
    wb = load_workbook(BytesIO(excel_file.read()))
    sheet = wb.active

    rows = list(sheet.rows)
    if not len(rows) > 0:
        result['errors'].append('Файл пустой')
        return result

    # ----------------
    # Обработка ошибок
    # ----------------
    errors = []
    names = [cell.value for cell in rows[0]]
    for name in required_names:
        if not name in names:
            result['errors'].append('обязательное поле %s' % name)

    if result['errors']:
        return result

    template = object_fields(model(), only_fields=names)
    indexes = {name: names.index(name) for name in names if name in template}

    # Добавить foreign keys в шапку
    with_fk = [name for name in names if '__' in name]
    if with_fk:
        fkeys = object_foreign_keys(model())
        for name in with_fk:
            wrong_key = False
            name_parts = name.split('__')
            for i in range(len(name_parts) - 1):
                if i == 0:
                    prev_fkeys = fkeys
                else:
                    prev_fkeys = object_foreign_keys(prev_fkeys[name_parts[i]])
                if not name_parts[i] in prev_fkeys:
                    wrong_key = True
            if not wrong_key:
                indexes[name] = names.index(name)

    def fill_fkey(item: dict, name: str, value: str):
        """Перезаполнить выходящее значение из строки в словарь
           :param item: словарь с текущими значениями
           :param name: Название поля
           :param value: Значение поля в виде словаря
        """
        parts = name.split('__')
        prev = item
        # Последняя вложенность - строкой (не словарем)
        for part in parts[:-1]:
            if not part in prev:
                prev[part] = {}
            prev = prev[part]
        prev[parts[-1]] = value

    data = []
    for row in rows:
        item = {}
        is_empty = True
        # В первой записи будут названия полей
        for name, ind in indexes.items():
            value = row[ind].value
            if value:
                is_empty = False
            # Будет дубль и key1__key2 и [key1][key2]
            item[name] = value

            # Спец обработка в словарь, если это foreign_key
            if name in with_fk:
                fill_fkey(item, name, value)
                continue

        if not is_empty:
            data.append(item)
    result['data'] = data[1:]
    return result
Ejemplo n.º 30
0
def ApiHelper(request,
              model_vars: dict,
              CUR_APP: str,
              reverse_params: dict = None,
              restrictions: list = None):
    """Апи-метод для получения всех данных
       :param request: HttpRequest
       :param model_vars: по какой модели отдаем данные
       :param CUR_APP: текущее приложение
       :param reverse_params: словарь для параметров в urls.py
       :param restrictions: аналог filters (массив Q() условий),
                            только уже из вьюхи, а по GET/POST
    """
    # Если нету метода, то не надо мучать жопу
    model = model_vars['model']
    with_get_folder = hasattr(model, 'get_folder')

    if not reverse_params:
        reverse_params = {}
    mh_vars = model_vars.copy()
    mh = create_model_helper(mh_vars,
                             request,
                             CUR_APP,
                             reverse_params=reverse_params)
    # Принудительные права на просмотр
    mh.permissions['view'] = True

    # Независимо от метода
    params = request.GET if request.method == 'GET' else request.POST

    model_fields = object_fields(model())

    only_fields = []
    get_only_fields = params.get('only_fields')
    if get_only_fields:
        get_only_fields = [
            field.strip() for field in get_only_fields.split(',')
        ]
        only_fields = [
            field for field in get_only_fields if field in model_fields
        ]

    # Параметры фильтрации через filter__field = ''
    # filter__ означает, что мы хотим отфильтровать по какому то полю,
    # например, ?filter__id=1&filter__is_active=1
    filters = {
        k.replace('filter__', ''): v
        for k, v in params.items() if k.startswith('filter__')
    }
    if filters:
        mh.filter_add(Q(**filters))
    if restrictions:
        for restriction in restrictions:
            mh.filter_add(restriction)
    orders_by = {
        k.replace('order__', ''): v
        for k, v in params.items() if k.startswith('order__')
    }
    for order_by, direction in orders_by.items():
        if direction == 'asc':
            mh.order_by_add(order_by)
        elif direction == 'desc':
            mh.order_by_add('-%s' % order_by)

    context = mh.context
    rows = mh.standard_show(only_fields=only_fields)

    result = []
    for row in rows:
        item = object_fields(row, only_fields=only_fields)
        if not only_fields or 'folder' in only_fields:
            if with_get_folder:
                item['folder'] = row.get_folder()
        result.append(item)
    result = {
        'data': result,
        'last_page': mh.raw_paginator['total_pages'],
        'total_records': mh.raw_paginator['total_records'],
        'cur_page': mh.raw_paginator['cur_page'],
        'by': mh.raw_paginator['by'],
    }
    return JsonResponse(result, safe=False)