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)
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)
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)
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)
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)
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)
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)
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)
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)