Example #1
0
def ajax_reports_brands(request):
    """Отчёт по потреблённым наименованиям
    """
    from common.helpers import del_leding_zero
    import operator
    context = dict()
    form = UseProducts(request.POST)
    if form.is_valid():
        data_in_post = form.cleaned_data
        start_date = data_in_post.get('start_date')
        end_date = data_in_post.get('end_date')
        org = data_in_post.get('org')
        unit = data_in_post.get('unit')
    else:
        context['error'] = '3'
        context['text'] = form.errors.as_json()
        return JsonResponse(context)

    if unit:
        child = unit
        root_ou = False
        #family = root_ou.get_descendants(include_self=True)
    else:
        root_ou = org
        root_ou = root_ou.pk
        child = False
        #family = root_ou.get_descendants(include_self=False)

    result = list()
    conf = SevercartConfigs()
    time_offset = datetime.datetime.now(pytz.timezone(
        conf.time_zone)).strftime('%z')
    start_date = start_date + time_offset
    if end_date:
        end_date = end_date + time_offset

    if child and start_date and not (end_date):
        # если определена дата начала анализа, дата окончания пропущена
        SQL_QUERY = """SELECT 
                            cart_type, COUNT(cart_type) as cart_count 
                        FROM 
                            events_events 
                        WHERE
                            event_type = 'TR' AND event_org = '%s' AND 
                            date_time >= '%s'
                        GROUP BY 
                            cart_type
                        ORDER BY cart_count DESC;
                    """ % (
            child,
            start_date,
        )
    if child and not (start_date) and end_date:
        # если проеделена крайняя дата просмотра, а дата начала
        # не определена
        SQL_QUERY = """SELECT 
                            cart_type, 
                            COUNT(cart_type) as cart_count
                        FROM 
                            events_events 
                        WHERE
                            event_type = 'TR' AND event_org = '%s' AND 
                            date_time <= '%s'
                        GROUP BY 
                            cart_type
                        ORDER BY cart_count DESC;
                    """ % (
            child,
            end_date,
        )

    if child and start_date and end_date:
        SQL_QUERY = """SELECT 
                            cart_type, COUNT(cart_type) as cart_count
                        FROM 
                            events_events
                        WHERE 
                            event_type = 'TR' AND event_org = '%s' AND 
                            date_time >= '%s' AND date_time <= '%s'
                        GROUP BY
                            cart_type
                        ORDER BY cart_count DESC;
                    """ % (
            child,
            start_date,
            end_date,
        )
    # ветка для SQL запросов если выбран депртамент, а орг. подразделение нет
    if root_ou and start_date and not (end_date):
        # если определена дата начала анализа, дата окончания пропущена
        SQL_QUERY = """SELECT 
                            cart_type, COUNT(cart_type) as cart_count 
                        FROM 
                            events_events 
                        WHERE
                            event_type = 'TR' AND departament = %s AND 
                            date_time >= '%s'
                        GROUP BY 
                            cart_type
                        ORDER BY cart_count DESC;
                    """ % (
            root_ou,
            start_date,
        )
    if root_ou and not (start_date) and end_date:
        # если проеделена крайняя дата просмотра, а дата начала
        # не определена
        SQL_QUERY = """SELECT 
                            cart_type, 
                            COUNT(cart_type) as cart_count
                        FROM 
                            events_events 
                        WHERE
                            event_type = 'TR' AND departament = %s AND 
                        date_time <= '%s'
                        GROUP BY 
                            cart_type
                        ORDER BY cart_count DESC;
                    """ % (
            root_ou,
            end_date,
        )

    if root_ou and start_date and end_date:
        SQL_QUERY = """SELECT 
                            cart_type, COUNT(cart_type) as cart_count
                        FROM 
                            events_events
                        WHERE 
                            event_type = 'TR' AND departament = %s AND 
                            date_time >= '%s' AND date_time <= '%s'
                        GROUP BY
                            cart_type
                        ORDER BY cart_count DESC;
                    """ % (
            root_ou,
            start_date,
            end_date,
        )

    #####
    cursor = connection.cursor()
    cursor.execute(SQL_QUERY)
    result = cursor.fetchall()
    # сохраняем результаты работы скрипта в csv файле
    csv_full_name, csv_file_name = rotator_files(request, file_type='csv')
    encoding = 'cp1251'
    with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
        fieldnames = ['name', 'amount']
        writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
        writer.writerow({'name': '', 'amount': ''})
        writer.writerow({'name': '', 'amount': ''})
        writer.writerow({'name': '', 'amount': ''})
        writer.writerow({'name': _('Start range'), 'amount': start_date})
        writer.writerow({'name': _('End range'), 'amount': end_date})
        writer.writerow({'name': '', 'amount': ''})
        writer.writerow({'name': '', 'amount': ''})
        writer.writerow({'name': _('Name'), 'amount': _('Items count')})
        for item in result:
            writer.writerow({'name': item[0], 'amount': item[1]})

    context['text'] = render_to_string('reports/brands_ajax.html',
                                       context={'result': result})
    context['url'] = settings.STATIC_URL + 'csv/' + csv_file_name
    context['error'] = '0'
    return JsonResponse(context)
Example #2
0
def ajax_report_stale(request):
    """Отчёт по залежавшимся РМ.
    """
    context = dict()
    form = NoUse(request.POST)
    if form.is_valid():
        data_in_post = form.cleaned_data
        org = data_in_post.get('org', '')
        diap = data_in_post.get('diap', '')
        if (diap == 10) or (diap == 20):
            old_cart = CartridgeItem.objects.filter(departament=org)
            result = old_cart.order_by('cart_date_change')[:diap]
        elif diap == 0:
            conf = SevercartConfigs()
            cur_date = timezone.now()
            old_cart = CartridgeItem.objects.filter(departament=org)
            last_year = datetime.datetime(year=cur_date.year - 1,
                                          month=cur_date.month,
                                          day=cur_date.day,
                                          hour=0,
                                          minute=0,
                                          second=0,
                                          microsecond=0,
                                          tzinfo=pytz.timezone(conf.time_zone))

            result = old_cart.filter(
                cart_date_change__lte=last_year).order_by('cart_date_change')
        else:
            pass
    else:
        context['error'] = '3'
        context['text'] = form.errors.as_json()
        return JsonResponse(context)

    # показываем форму, если произошли ошибки
    #    context['form'] = form
    csv_full_name, csv_file_name = rotator_files(request, file_type='csv')
    encoding = 'cp1251'
    with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
        fieldnames = ['number', 'name', 'date', 'amount', 'status']
        writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
        writer.writerow({
            'number': '',
            'name': '',
            'date': '',
            'amount': '',
            'status': ''
        })
        writer.writerow({
            'number': '',
            'name': '',
            'date': '',
            'amount': '',
            'status': ''
        })
        writer.writerow({
            'number': '',
            'name': '',
            'date': '',
            'amount': '',
            'status': ''
        })
        writer.writerow({
            'number': '',
            'name': '',
            'date': '',
            'amount': '',
            'status': ''
        })
        writer.writerow({
            'number': '',
            'name': '',
            'date': '',
            'amount': '',
            'status': ''
        })
        writer.writerow({
            'number': _('Number'),
            'name': _('Name'),
            'date': _('Date of last cases'),
            'amount': _('Number refills'),
            'status': _('Status')
        })
        for item in result:
            writer.writerow({
                'number':
                item.cart_number,
                'name':
                item.cart_itm_name,
                'date':
                formats.date_format(item.cart_date_change, 'd.m.Y'),
                'amount':
                item.cart_number_refills,
                'status':
                pretty_status(item.cart_status)
            })

    context['text'] = render_to_string('reports/report_stale_ajax.html',
                                       context={'result': result})
    context['url'] = settings.STATIC_URL + 'csv/' + csv_file_name
    context['error'] = '0'
    return JsonResponse(context)
Example #3
0
def ajax_firm(request):
    """
    """
    context = dict()
    form = Firms(request.POST)
    context['error'] = '0'
    if form.is_valid():
        data_in_post = form.cleaned_data
        start_date = data_in_post.get('start_date')
        end_date = data_in_post.get('end_date')
        common_select = RefillingCart.objects.filter(doc_type=2).filter(
            departament=request.user.departament)
        if start_date and not (end_date):
            common_select = common_select.filter(date_created__gte=start_date)
        if not (start_date) and end_date:
            common_select = common_select.filter(date_created__lte=end_date)
        if start_date and end_date:
            common_select = common_select.filter(
                Q(date_created__gte=start_date)
                & Q(date_created__lte=end_date))

        save_select = copy.copy(common_select)
        firms = common_select.values('firm').distinct().order_by('-pk')
        # убираем повторения, множества не годятся потому что каждая генерация меняет порядок
        unique_firms = list()
        for i in firms:
            if i['firm'] not in unique_firms:
                unique_firms.append(i['firm'])
        firms = None
        result = dict()
        # unique_firms = ['ГитХаб', 'Мегабит', 'Стиль']
        for f1 in unique_firms:
            if f1 == 'None':
                continue
            m1 = save_select.filter(firm=f1)
            for f2 in m1:
                # m1 = [<RefillingCart: 2016_65>, <RefillingCart: 2016_64>]
                act_data = f2.json_content
                act_data = json.loads(act_data)
                tmp_firm = result.get(f1, None)
                cl = len(act_data)
                last_count = cl if cl else 0
                last_money = f2.money if f2.money else 0
                if tmp_firm:
                    bufer_count = result[f1]['count'] if result[f1][
                        'count'] else 0
                    bufer_money = result[f1]['money'] if result[f1][
                        'money'] else 0
                    result[f2.firm] = {
                        'count': last_count + bufer_count,
                        'money': last_money + bufer_money
                    }
                else:
                    result[f1] = {'count': last_count, 'money': last_money}

        # генерируем CSV документ для последующей работы
        csv_full_name, csv_file_name = rotator_files(request, file_type='csv')
        encoding = 'cp1251'
        with open(csv_full_name, 'w', newline='',
                  encoding=encoding) as csvfile:
            fieldnames = ['name', 'amount', 'money']
            writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
            writer.writerow({'name': '', 'amount': '', 'money': ''})
            writer.writerow({'name': '', 'amount': '', 'money': ''})
            writer.writerow({'name': '', 'amount': '', 'money': ''})
            writer.writerow({
                'name': _('Start range'),
                'amount': start_date,
                'money': ''
            })
            writer.writerow({
                'name': _('End range'),
                'amount': end_date,
                'money': ''
            })
            writer.writerow({'name': '', 'amount': '', 'money': ''})
            writer.writerow({'name': '', 'amount': '', 'money': ''})
            writer.writerow({
                'name':
                _('Firm name'),
                'amount':
                _('The number of serviced objects'),
                'money':
                '%s, %s' % (_('The money paid'), _('Currency'))
            })
            for key, value in result.items():
                writer.writerow({
                    'name': key,
                    'amount': value['count'],
                    'money': value['money'] / 100
                })

        context['error'] = '0'
        context['url'] = settings.STATIC_URL + 'csv/' + csv_file_name
        context['text'] = render_to_string('reports/worket_firms.html',
                                           context={'result': result})

    else:
        context['text'] = form.errors.as_text()
        context['error'] = '1'

    return JsonResponse(context)
Example #4
0
def ajax_report(request):
    """Отчёт по амортизации РМ (количество перезаправок)
    """
    result = {}
    action_type = request.POST.getlist('type')[0]
    if action_type == 'amortizing':
        org = request.POST.getlist('org')[0]
        cont = request.POST.getlist('cont')[0]
        org = str2int(org)
        try:
            cont = int(cont)
        except ValueError:
            cont = 1
        try:
            root_ou = request.user.departament
            des = root_ou.get_descendants()
        except:
            des = ''

        try:
            OrganizationUnits.objects.get(pk=org)
        except OrganizationUnits.DoesNotExist:
            result['error'] = 'Organization unit not found.'
        else:
            list_cart = CartridgeItem.objects.filter(
                Q(departament__in=des) | Q(departament=root_ou))
            list_cart = list_cart.filter(
                cart_number_refills__gte=cont).order_by('-cart_number_refills')
            html = render_to_string('reports/amortizing_ajax.html',
                                    context={'list_cart': list_cart})
            result['html'] = html

            # формируем выгрузку CSV файл
            csv_full_name, csv_file_name = rotator_files(request,
                                                         file_type='csv')
            encoding = 'cp1251'
            with open(csv_full_name, 'w', newline='',
                      encoding=encoding) as csvfile:
                fieldnames = ['number', 'name', 'date', 'amount', 'status']
                writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
                writer.writerow({
                    'number': '',
                    'name': '',
                    'date': '',
                    'amount': '',
                    'status': ''
                })
                writer.writerow({
                    'number': '',
                    'name': '',
                    'date': '',
                    'amount': '',
                    'status': ''
                })
                writer.writerow({
                    'number': '',
                    'name': '',
                    'date': '',
                    'amount': '',
                    'status': ''
                })
                writer.writerow({
                    'number': '',
                    'name': '',
                    'date': '',
                    'amount': '',
                    'status': ''
                })
                writer.writerow({
                    'number': '',
                    'name': '',
                    'date': '',
                    'amount': '',
                    'status': ''
                })
                writer.writerow({
                    'number': _('Number'),
                    'name': _('Name'),
                    'date': _('Date of last cases'),
                    'amount': _('Number refills'),
                    'status': _('Status')
                })
                for item in list_cart:
                    writer.writerow({
                        'number':
                        item.cart_number,
                        'name':
                        item.cart_itm_name,
                        'date':
                        formats.date_format(item.cart_date_change, 'd.m.Y'),
                        'amount':
                        item.cart_number_refills,
                        'status':
                        pretty_status(item.cart_status)
                    })

            result['url'] = settings.STATIC_URL + 'csv/' + csv_file_name
    return JsonResponse(result, safe=False)
Example #5
0
def ajax_reports_users(request):
    """
    """
    from common.helpers import del_leding_zero
    import operator
    context = dict()
    form = UsersCartridges(request.POST)
    if form.is_valid():
        data_in_post = form.cleaned_data
        start_date = data_in_post.get('start_date')
        end_date = data_in_post.get('end_date')
        org = data_in_post.get('org')
        unit = data_in_post.get('unit')
    else:
        context['error'] = '3'
        context['text'] = form.errors.as_json()
        return JsonResponse(context)

    if unit:
        root_ou = unit
        family = root_ou.get_descendants(include_self=True)

    else:
        root_ou = org
        family = root_ou.get_descendants(include_self=False)

    result = dict()
    if start_date and not (end_date):
        for child in family:
            m1 = Events.objects.all()
            m1 = m1.filter(event_org=child)
            m1 = m1.filter(event_type='TR')
            m1 = m1.filter(date_time__gte=start_date)
            m2 = m1
            m2 = m1.values('cart_type')
            m1 = m1.count()
            result[str(child)] = {
                'count': m1,
                'details': pretty_list(list(m2))
            }
    elif start_date and end_date:
        for child in family:
            m1 = Events.objects.all()
            m1 = m1.filter(event_org=child)
            m1 = m1.filter(event_type='TR')
            m1 = m1.filter(date_time__gte=start_date)
            m1 = m1.filter(date_time__lte=end_date)
            m2 = m1
            m2 = m1.values('cart_type')
            m1 = m1.count()
            result[str(child)] = {
                'count': m1,
                'details': pretty_list(list(m2))
            }
    else:
        result = 'Error'

    result = OrderedDict(sorted(result.items()))
    # сохраняем результаты работы скрипта в csv файле
    csv_full_name, csv_file_name = rotator_files(request, file_type='csv')
    encoding = 'cp1251'
    with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
        fieldnames = ['user', 'amount', 'details']
        writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
        writer.writerow({'user': '', 'amount': '', 'details': ''})
        writer.writerow({'user': '', 'amount': '', 'details': ''})
        writer.writerow({'user': '', 'amount': '', 'details': ''})
        writer.writerow({
            'user': _('Start range'),
            'amount': start_date,
            'details': ''
        })
        writer.writerow({
            'user': _('End range'),
            'amount': end_date,
            'details': ''
        })
        writer.writerow({'user': '', 'amount': '', 'details': ''})
        writer.writerow({'user': '', 'amount': '', 'details': ''})
        writer.writerow({
            'user': _('User'),
            'amount': _('Items count'),
            'details': _('Details')
        })
        for key, value in result.items():
            writer.writerow({
                'user': key,
                'amount': value['count'],
                'details': value['details']
            })

    context['text'] = render_to_string('reports/users_ajax.html',
                                       context={'result': result})
    context['url'] = settings.STATIC_URL + 'csv/' + csv_file_name
    context['error'] = '0'
    return JsonResponse(context)
Example #6
0
def generate_return_act(request):
    """Генерация нового docx акта возврата картриджей. Вью возвращает Url с свежезгенерированным файлом. 
    """
    resp_dict = dict()
    # использование глобальных переменных не очень хороший приём
    # но он позволяет упростить программный код
    total_pages_count = 0

    def actions_decoder(actions_list):
        """Преобразует список мнемонических действий в человекочитаемые строки.
        """
        result = str()
        for elem in actions_list:
            if elem == 'regeneration':
                result += _('Regeneration')
            elif elem == 'filled':
                result += _('Filling and cleaning')
            elif elem == 'fotoreceptor':
                result += _('Replacing fotovala')
            elif elem == 'rakel':
                result += _('Replacement squeegee')
            elif elem == 'chip':
                result += _('Replacement chip')
            elif elem == 'magnit':
                result += _('Replacing the magnetic roller')
            else:
                result += _('Not implement')
            result += ', '

        return result

    doc_id = request.POST.get('doc_id', '')
    doc_id = str2int(doc_id)

    try:
        m1 = RefillingCart.objects.get(pk=doc_id)
    except RefillingCart.DoesNotExist:
        resp_dict['error'] = '1'
        resp_dict['text']  = _('The object with the ID is not found.')
        return JsonResponse(resp_dict, safe=False)

    jsontext = m1.json_content
    jsontext = json.loads(jsontext)

    pages_count = 0
    co = len(jsontext) # количество передаваемых картриджей на заправку

    if not os.path.exists(settings.STATIC_ROOT_DOCX):
        os.makedirs(settings.STATIC_ROOT_DOCX)

    # ротация файлов
    files = filter(os.path.isfile, glob.glob(settings.STATIC_ROOT_DOCX + '\*.docx'))
    files = list(files)
    files.sort(key=lambda x: os.path.getmtime(x))
    try:
        if len(files) > settings.MAX_COUNT_DOCX_FILES:
            os.remove(files[0])
    except:
        pass
    # производим инициализацию некоторых переменных начальными значениями    
    docx_full_file_name, docx_file_name = rotator_files(request, 'docx')
    # генерация печатной версии документа без группировки наименований
    document = Document()
    
    # добавляем шапку для документа
    doc_number = str(m1.number) + '/' + str(request.user.pk)
    act_number_string = _('The act of receiving cartridges # %(doc_number)s from  %(date_created)s') % {'doc_number': doc_number, 'date_created': localize_date(m1.date_created)}
    hh1 = document.add_heading(act_number_string, level=2)
    
    hh2 = document.add_heading(str(request.user.departament), level=2)
    
    document.add_paragraph("") # добавляем оступ сверху
    document.add_paragraph(_('Contractor:  %(firm)s') % {'firm': m1.firm})

    # рисуем таблицу на первой странице
    table = document.add_table(rows=1, cols=4, style='Table Grid')
    obj_styles = document.styles
    obj_charstyle = obj_styles.add_style('FontSize', WD_STYLE_TYPE.PARAGRAPH)
    obj_font = obj_charstyle.font
    obj_font.size = Pt(8)
    #obj_font.name = 'Times New Roman'
    sum_money = 0
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = _('Number')
    hdr_cells[1].text = _('Name')
    hdr_cells[2].text = _('Ongoing work')
    hdr_cells[3].text = '%s, %s' % (_('The price'), _('Currency'))
    
    for item in jsontext:
        row_cells = table.add_row().cells
        row_cells[0].text = str(item[0])
        row_cells[1].text = str(item[1])
        
        # https://github.com/python-openxml/python-docx/issues/141
        paragraph = row_cells[2].paragraphs[0]
        paragraph.text = actions_decoder(item[2])
        paragraph.style = 'FontSize'
        money = float(item[3][-1])
        sum_money += money
        row_cells[3].text = str(money)

    sender_full_name = ""
    recipient_full_name = request.user.fio
    # добавляем место для подписей принимающих и передающих
    document.add_paragraph("") # добавляем оступ сверху
    document.add_paragraph(_('Just made: %(co)s pieces') % {'co': co})
    document.add_paragraph(_('The total amount of: %(sum_money)s dollars') % {'sum_money': sum_money})
    document.add_paragraph("")
    document.add_paragraph("%s       _________________      %s" % (_('Resipient'), recipient_full_name,))
    document.add_paragraph("")
    document.add_paragraph("%s       _________________      %s" % (_('Sender'), sender_full_name,))
    document.add_paragraph("")
    document.add_paragraph("")
    document.add_paragraph('www.severcart.org' + ' '*120)
    document.save(docx_full_file_name)
    
    resp_dict['error'] = '0'
    resp_dict['text']  = _('Document %(doc_number)s_%(user_id)s_3.docx generated') % { 'doc_number': m1.number, 'user_id': request.user.pk}
    resp_dict['url'] = settings.STATIC_URL + 'docx/' + docx_file_name
    return JsonResponse(resp_dict)
Example #7
0
def generate_pdf(request):
    """Генерация pdf файла с наклейками для печати.
    """ 
    from common.helpers import Sticker
    from service.helpers import SevercartConfigs
    resp_dict = dict()
    cart_type = request.POST.get('cart_type', '')    
    pdf_full_name, pdf_file_name = rotator_files(request, file_type='pdf')
    conf = SevercartConfigs()
    pagesize = conf.page_format
    print_bar_code = conf.print_bar_code
    pdf_doc = Sticker(file_name=pdf_full_name, pagesize=pagesize, print_bar_code=print_bar_code)
    
    if cart_type == 'full':
        session_data = request.session.get('cumulative_list')
    elif cart_type == 'empty':
        session_data = request.session.get('empty_cart_list')
    elif cart_type == 'bufer':
        try:
            root_ou   = request.user.departament
            children  = root_ou.get_family()
        except AttributeError:
            children = None
        all_items = CartridgeItem.objects.filter(departament__in=children).filter(bufer=True)
        for item in all_items:
            pdf_doc.add(ou_number=request.user.departament.pk, cartridge_name=item.cart_itm_name, cartridge_number=item.cart_number)
        pdf_doc.fin()
        resp_dict['url'] = settings.STATIC_URL + 'pdf/' + pdf_file_name
        return JsonResponse(resp_dict)        
    else:
        pass

    # если сессионные данные отсутствуют, то сразу возвращаем результат
    if not session_data:
        resp_dict['url'] = ''
        return JsonResponse(resp_dict)

    session_data = json.loads(session_data)
    # формат session_data [ [name, title,  numbers=[1,2,3,4]] ... ]
    simple_cache = dict()
    list_names = CartridgeItemName.objects.all()
    for elem in list_names:
        simple_cache[elem.pk] = elem.cart_itm_name

    # формируем текст для наклейки
    for elem in session_data:
        for stik in elem[2]:
            #cartridge_name = simple_cache.get(elem[0])
            cartridge_name = CartridgeItemName.objects.get(pk=elem[0])
            cartridge_name = str(cartridge_name)
            cartridge_name = cartridge_name.strip()
            cartridge_name = re.split('\s+', cartridge_name)
            # формат названия картриджа "HP RT565A"
            # если не соответсвует, то используем имя целиком.
            # если количество элементов в имени >=2 на наклейку попадёт другое имя
            if len(cartridge_name) == 1:
                cartridge_name = cartridge_name[0]
            else:
                cartridge_name = cartridge_name[-1]
            pdf_doc.add(ou_number=request.user.departament.pk, cartridge_name=cartridge_name, cartridge_number=stik)

    pdf_doc.fin()
    resp_dict['url'] = settings.STATIC_URL + 'pdf/' + pdf_file_name
    return JsonResponse(resp_dict)
Example #8
0
def generate_csv(request):
    import csv
    encoding = 'cp1251'
    def write_elem_with_group(all_items, csv_full_name):
        names_list = list()
        names_list = [str(cartridge.cart_itm_name) for cartridge in all_items]
        names_set = list(set(names_list))
        names_set.sort()
        tmp_list = []
        for name in names_set:
            tmp_list.append({name: names_list.count(name)})
        
        names_list = tmp_list
        tmp_list = names_set = None
        # формируется список из объектов-словарей, ключ - содержит имя, значение - количество повторений
        #name_list = [{'Q3312A': 3}, {'49/53A': 2}, {'505A': 5}]
        with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
            fieldnames = ['name', 'amount']
            writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
            writer.writerow({'name': _('Name'), 'amount': _('Amount items')})
            for name in names_list:
                key   = list(name.keys())[0]
                value = list(name.values())[0]
                writer.writerow({'name': key, 'amount': value})

    resp_dict = {}
    view = request.POST.get('view', '')
    gtype = request.POST.get('gtype', '')
    conf = SevercartConfigs()

    csv_full_name, csv_file_name = rotator_files(request, file_type='csv')
    all_items = CartridgeItem.objects.all().order_by('pk')
    if view == 'stock':
        all_items = all_items.filter(cart_status=1).filter(departament=request.user.departament)
        if gtype == 'exp_with_group':
            write_elem_with_group(all_items, csv_full_name)
        elif gtype == 'exp_without_group':
            with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
                fieldnames = ['number', 'name', 'refills', 'date', 'comment']
                writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
                writer.writerow({'number': _('Number'), 
                                'name': _('Name'), 
                                'refills': _('Amount<br/>recovery'), 
                                'date': _('Date add') + ' ' + _('on stock'), 
                                'comment': _('comment')})
                for cartridje in all_items:
                    cart_date_change = cartridje.cart_date_change
                    cart_date_change = do_timezone(cart_date_change, conf.time_zone)
                    cart_date_change = cart_date_change.strftime('%d.%m.%Y %H:%M')
                    writer.writerow({'number': cartridje.cart_number, 
                                    'name': cartridje.cart_itm_name, 
                                    'refills': cartridje.cart_number_refills, 
                                    'date': cart_date_change, 
                                    'comment': cartridje.comment})
        else:
            pass
    elif view == 'use':
        try:
            root_ou   = request.user.departament
            children  = root_ou.get_family()
        except AttributeError:
            children = ''
        all_items = all_items.filter(departament__in=children).filter(cart_status=2)
        if gtype == 'exp_with_group':
            write_elem_with_group(all_items, csv_full_name)
        elif gtype == 'exp_without_group':
            with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
                fieldnames = ['number', 'name', 'refills', 'date', 'org', 'comment']
                writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
                writer.writerow({'number': _('Number'), 
                                'name': _('Name'), 
                                'refills': _('Amount<br/>recovery'), 
                                'date': _('Date transfe'),
                                'org': _('User'),
                                'comment': _('comment')})
                for cartridje in all_items:
                    cart_date_change = cartridje.cart_date_change
                    cart_date_change = do_timezone(cart_date_change, conf.time_zone)
                    cart_date_change = cart_date_change.strftime('%d.%m.%Y %H:%M')
                    writer.writerow({'number': cartridje.cart_number, 
                                    'name': cartridje.cart_itm_name, 
                                    'refills': cartridje.cart_number_refills, 
                                    'date': cart_date_change,
                                    'org': cartridje.departament,
                                    'comment': cartridje.comment})
        else:
            pass
    elif view == 'empty':
        all_items = all_items.filter( Q(departament=request.user.departament) & Q(cart_status=3) )
        if gtype == 'exp_with_group':
            write_elem_with_group(all_items, csv_full_name)
        elif gtype == 'exp_without_group':
            with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
                fieldnames = ['number', 'name', 'refills', 'date', 'comment']
                writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
                writer.writerow({'number': _('Number'), 
                                'name': _('Name'), 
                                'refills': _('Amount<br/>recovery'), 
                                'date': _('Date return'), 
                                'comment': _('comment')})
                for cartridje in all_items:
                    cart_date_change = cartridje.cart_date_change
                    cart_date_change = do_timezone(cart_date_change, conf.time_zone)
                    cart_date_change = cart_date_change.strftime('%d.%m.%Y %H:%M')
                    writer.writerow({'number': cartridje.cart_number, 
                                    'name': cartridje.cart_itm_name, 
                                    'refills': cartridje.cart_number_refills, 
                                    'date': cart_date_change,
                                    'comment': cartridje.comment})
        else:
            pass
    elif view == 'at_work':
        all_items = all_items.filter(Q(cart_status=4) & Q(departament=request.user.departament))
        if gtype == 'exp_with_group':
            write_elem_with_group(all_items, csv_full_name)
        elif gtype == 'exp_without_group':
            with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
                fieldnames = ['number', 'name', 'refills', 'date', 'firm', 'comment']
                writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
                writer.writerow({'number': _('Number'), 
                                'name': _('Name'), 
                                'refills': _('Amount<br/>recovery'), 
                                'date': _('Date transfer on recovery'), 
                                'firm': _('Refueller'),
                                'comment': _('comment')})
                for cartridje in all_items:
                    cart_date_change = cartridje.cart_date_change
                    cart_date_change = do_timezone(cart_date_change, conf.time_zone)
                    cart_date_change = cart_date_change.strftime('%d.%m.%Y %H:%M')
                    writer.writerow({'number': cartridje.cart_number, 
                                    'name': cartridje.cart_itm_name, 
                                    'refills': cartridje.cart_number_refills, 
                                    'date': cart_date_change,
                                    'firm': cartridje.filled_firm,
                                    'comment': cartridje.comment})
        else:
            pass
    elif view == 'basket':
        all_items = all_items.filter( (Q(cart_status=5) | Q(cart_status=6)) & Q(departament=request.user.departament) )
        if gtype == 'exp_with_group':
            write_elem_with_group(all_items, csv_full_name)
        elif gtype == 'exp_without_group':
            with open(csv_full_name, 'w', newline='', encoding=encoding) as csvfile:
                fieldnames = ['number', 'name', 'refills', 'date', 'firm', 'comment']
                writer = csv.DictWriter(csvfile, fieldnames, delimiter=';')
                writer.writerow({'number': _('Number'), 
                                'name': _('Name'), 
                                'refills': _('Amount<br/>recovery'), 
                                'date': _('Date return in basket'), 
                                'comment': _('comment')})
                for cartridje in all_items:
                    cart_date_change = cartridje.cart_date_change
                    cart_date_change = do_timezone(cart_date_change, conf.time_zone)
                    cart_date_change = cart_date_change.strftime('%d.%m.%Y %H:%M')
                    writer.writerow({'number': cartridje.cart_number, 
                                    'name': cartridje.cart_itm_name, 
                                    'refills': cartridje.cart_number_refills, 
                                    'date': cart_date_change,
                                    'comment': cartridje.comment})
        else:
            pass
    else:
        return HttpResponse(resp_dict, status_code=501)
    
    resp_dict['url'] = settings.STATIC_URL + 'csv/' + csv_file_name
    return JsonResponse(resp_dict)
Example #9
0
def generate_act(request):
    """Генерация нового docx документа. Вью возвращает Url с свежезгенерированным файлом. 
    """
    resp_dict = dict()
    # использование глобальных переменных не очень хороший приём
    # но он позволяет упростить программный код
    total_pages_count = 0

    def add_footer(page_num=1):
        # форматирование нижнего колонтитула копирайтом и количеством страниц
        for i in range(4):
            document.add_paragraph("")

        page_number_string = _('Page %(num)s from %(total)s') % {'num': page_num, 'total': total_pages_count}
        p = document.add_paragraph('www.severcart.org' + ' '*100 + page_number_string)
        
    doc_id = request.POST.get('doc_id', '')
    doc_action = request.POST.get('doc_action', '')

    pages_count = 0
    doc_id = str2int(doc_id)

    try:
        m1 = RefillingCart.objects.get(pk=doc_id)
    except RefillingCart.DoesNotExist:
        resp_dict['error'] = '1'
        resp_dict['text']  = _('The object with the ID is not found.')
        return JsonResponse(resp_dict, safe=False)

    jsontext = m1.json_content
    jsontext = json.loads(jsontext)

    co = len(jsontext) # количество передаваемых картриджей на заправку

    file_full_name, docx_file_name = rotator_files(request, file_type='docx')
    # производим инициализацию некоторых переменных начальными значениями
    sender_full_name    = request.user.fio
    recipient_full_name = ' '*50

    if not((doc_action == "docx_with_group") or (doc_action == "docx_without_group")):
        # если действие указано не верное, сообщаем об это и прекращаем работу 
        # скрипта
        resp_dict['error'] = '1'
        resp_dict['text']  = _('This action is not implemented.')
        return JsonResponse(resp_dict)
    

    if doc_action == 'docx_with_group':
        jsontext = group_names(jsontext)
        header_cell_one = _('The name of the cartridge')
        header_cell_two = _('Amount cartridges')
        
    if doc_action == 'docx_without_group':
        header_cell_one = _('Cartridge number')
        header_cell_two = _('The name of the cartridge')

    # генерация печатной версии документа без группировки наименований
    document = Document()
    
    # добавляем шапку для документа
    doc_number = str(m1.number) + '/' + str(request.user.pk)
    act_number_string = _('The act of transferring cartridges # %(doc_number)s from  %(date_created)s') % {'doc_number': doc_number, 'date_created': localize_date(m1.date_created)}
    hh1 = document.add_heading(act_number_string, level=2)
    
    hh2 = document.add_heading(str(request.user.departament), level=2)
    
    document.add_paragraph("") # добавляем оступ сверху
    document.add_paragraph("")

    # рисуем таблицу на первой странице
    table = document.add_table(rows=1, cols=2, style='Table Grid')
    hdr_cells = table.rows[0].cells
    hdr_cells[0].text = header_cell_one
    hdr_cells[1].text = header_cell_two
    if (len(jsontext) <= settings.MAX_TABLE_ROWS_FIRST_PAGE):
        for item in jsontext:
            row_cells = table.add_row().cells
            row_cells[0].text = str(item[0])
            row_cells[1].text = str(item[1])
        total_pages_count = 1

    if (len(jsontext) > settings.MAX_TABLE_ROWS_FIRST_PAGE):
        first_part  = jsontext[0:settings.MAX_TABLE_ROWS_FIRST_PAGE-1]
        second_part = jsontext[settings.MAX_TABLE_ROWS_FIRST_PAGE:]
        
        p = Paginator(second_part, settings.MAX_TABLE_ROWS)
        total_pages_count = 1 + p.num_pages

        for item in first_part:
            row_cells = table.add_row().cells
            row_cells[0].text = str(item[0])
            row_cells[1].text = str(item[1])

        pages_count += 1    
        add_footer(pages_count)
        document.add_page_break()
        # далее с каждой новой страницы рисуем новую таблицу с 
        # продолжением печати данных
        for pg in range(p.num_pages):
            stranica = p.page(pg + 1)
            # на каждой новой странице печатаем заново новый заголовок
            table = document.add_table(rows=1, cols=2, style='Table Grid')
            hdr_cells = table.rows[0].cells
            hdr_cells[0].text = header_cell_one
            hdr_cells[1].text = header_cell_two
            for item in stranica:
                row_cells = table.add_row().cells
                row_cells[0].text = str(item[0])
                row_cells[1].text = str(item[1])

            # если страница последняя то разрыв страницы не добавляем
            if  pg != (p.num_pages - 1):
                pages_count += 1
                document.add_page_break()
                add_footer(pages_count)

    # добавляем место для подписей принимающих и передающих
    document.add_paragraph("") # добавляем оступ сверху
    document.add_paragraph(_('Total count - %(co)s') % {'co': co})
    document.add_paragraph("")
    document.add_paragraph("%s        %s           ______________" % (_('Sender'), sender_full_name,))
    document.add_paragraph("")
    document.add_paragraph("%s        %s           ______________" % (_('Resipient'), recipient_full_name,))

    pages_count += 1
    add_footer(pages_count)

    document.save(file_full_name)
    
    resp_dict['error'] = '0'
    resp_dict['text']  = _('Document %(doc_number)s_%(user_id)s_0.docx generated') % { 'doc_number': m1.number, 'user_id': request.user.pk}
    #resp_dict['url'] = request.META.get('HTTP_ORIGIN') + settings.STATIC_URL + 'docx/' + docx_file_name
    resp_dict['url'] = settings.STATIC_URL + 'docx/' + docx_file_name
    
    return JsonResponse(resp_dict)