def clean_start_date(self): """Проверят на пустоту введенные данные. """ if not self.cleaned_data.get('start_date', ''): raise ValidationError(_('Required field.')) start_date = self.cleaned_data.get('start_date', '').strip() start_date = start_date.split(r'/') conf = SevercartConfigs() if len(start_date) == 3: # если пользователь не смухлевал, то кол-во элементов = 3 date_value = start_date[0] month_value = start_date[1] year_value = start_date[2] date_value = str2int(date_value) month_value = str2int(month_value) year_value = str2int(year_value) gte_date = datetime.datetime(year=year_value, month=month_value, day=date_value, hour=0, minute=0, microsecond=0, tzinfo=pytz.timezone(conf.time_zone) ) else: raise ValidationError(_('Error in start date.')) return gte_date
def clean_end_date(self): """Проверят на пустоту введенные данные. """ # проверяем на корректность дату окончания просмотра списка end_date = self.cleaned_data.get('end_date', '').strip() end_date = end_date.split(r'/') if end_date and len(end_date) == 3: # если пользователь не смухлевал, то кол-во элементов = 3 date_value = end_date[0] #date_value = del_leding_zero(date_value) month_value = end_date[1] #month_value = del_leding_zero(month_value) year_value = end_date[2] #lte_date = '%s-%s-%s 23:59:59' % (year_value, month_value, date_value,) date_value = str2int(date_value) month_value = str2int(month_value) year_value = str2int(year_value) lte_date = datetime.datetime(year=year_value, month=month_value, day=date_value, ) else: return False return lte_date
def remove_from_bufer(request): ansver = dict() ar = request.POST.getlist('selected[]') ar = [str2int(i) for i in ar ] list_cplx = [] for ind in ar: node = CartridgeItem.objects.get(pk=ind) # проверяем принадлежность перемещаемого РМ департаменту # пользователя. if node.departament == request.user.departament: node.bufer = False node.save() return JsonResponse(ansver)
def org_suggests(request): """ """ ansver = dict() res = list() dept_id = str2int(request.POST.get('dept_id', 0)) root_ou = get_object_or_404(OrganizationUnits, pk=dept_id) children = root_ou.get_family() children = children[1:] # исключаем последний элемент for node in children: res.append({'id': node.pk, 'level': node.level, 'name': node.name}) ansver['res'] = res return JsonResponse(ansver)
def clean_set_date(self): """Возвращает словарь из дни, месяцы, годы. По-умолчанию возвращаем время с эпохи начала UNIX, если в входных данных ошибки. """ if not self.cleaned_data.get('set_date', 0): return {'day': 1, 'month': 1, 'year': 1970} prepare_list = self.cleaned_data.get('set_date').split(r'/') if len(prepare_list) == 3: # если пользователь не смухлевал, то кол-во элементов = 3 date_value = prepare_list[0] date_value = del_leding_zero(date_value) month_value = prepare_list[1] month_value = del_leding_zero(month_value) year_value = prepare_list[2] year_value = str2int(year_value) return {'day': date_value, 'month': month_value, 'year': year_value} else: return {'day': 1, 'month': 1, 'year': 1970}
def clean_set_date(self): """Возвращает словарь из дни, месяцы, годы. По-умолчанию возвращаем время с эпохи начала UNIX, если в входных данных ошибки. """ if not self.cleaned_data.get('set_date', 0): return {'day': 1, 'month': 1, 'year': 1970} prepare_list = self.cleaned_data.get('set_date').split(r'/') if len(prepare_list) == 3: # если пользователь не смухлевал, то кол-во элементов = 3 date_value = prepare_list[0] date_value = del_leding_zero(date_value) month_value = prepare_list[1] month_value = del_leding_zero(month_value) year_value = prepare_list[2] year_value = str2int(year_value) return { 'day': date_value, 'month': month_value, 'year': year_value } else: return {'day': 1, 'month': 1, 'year': 1970}
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 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_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)