## -*- coding: utf-8 -*- __author__ = 'SDE' from django.utils.html import strip_tags # from uuslug import slugify import json import os.path from PIL import Image from django.core.files.uploadedfile import InMemoryUploadedFile from BaseModels.mailSender import techSendMail from datetime import datetime, timedelta def get_near_work_day(DT): if DT.isoweekday() < 6: return DT return DT + timedelta(days=8 - DT.isoweekday()) def get_next_DT_for_monthes_delta_great(monthes_delta, fromDT=datetime.now()): DT = fromDT i = 0 cur_month = DT.month while cur_month == DT.month: DT = DT + timedelta(days=1) # подбираем ближайший день, существующий в месяце fail = True i = 0 while fail: try: DT = DT.replace(day=fromDT.day - i) fail = False except: i += 1 # DT = DT - timedelta(days=1) # DT = DT.replace(hour=23, minute=59, second=59) return DT def get_prev_DT_for_monthes_delta_less(monthes_delta, fromDT=datetime.now()): DT = fromDT i = 0 while i < monthes_delta: DT = DT.replace(day=1) DT = DT - timedelta(days=1) i += 1 # подбираем ближайший день, существующий в месяце fail = True i = 0 while fail: try: DT = DT.replace(day=fromDT.day - i) fail = False except: i += 1 # DT = DT - timedelta(days=1) # DT = DT.replace(hour=23, minute=59, second=59) return DT def correct_filter_name_for_filter_and_create(filter_kwargs): filter_Dict = {} create_Dict = {} filter_Dict.update(filter_kwargs) create_Dict.update(filter_kwargs) if 'name' in filter_kwargs: filter_Dict['name__iexact'] = filter_kwargs['name'] del filter_Dict['name'] if 'id' in filter_kwargs: del filter_Dict['id'] del create_Dict['id'] return filter_Dict, create_Dict def date_range_as_Dict(start_date, end_date): import datetime # for ordinal in range(start_date.toordinal(), end_date.toordinal()): # yield datetime.date.fromordinal(ordinal) return [{start_date + datetime.timedelta(n): {}} for n in range(int((end_date - start_date).days) + 1)] def sortByLength(inputStr): return len(inputStr) # def add_domain(request, url, add_lang=False): # domain = get_domain_by_request(request) # if add_lang: # cur_lang = get_cur_lang_by_request(request) # return '{0}/{1}/{2}'.format(domain, cur_lang, url) # else: # return '{0}{1}'.format(domain, url) # def get_domain_by_request(request): # from project_sets import domain # if request.query_params and 'domain' in request.query_params: # return request.query_params['domain'] # return domain # # # def get_cur_lang_by_request(request): # from project_sets import lang # if request.query_params and 'cur_lang' in request.query_params: # return request.query_params['cur_lang'] # return lang def get_img_type_by_request(request): if request.query_params and 'img_type' in request.query_params: return request.query_params['img_type'] return 'webp' def image_convert_to_png(photo_file, save_file_path=None): from io import BytesIO from PIL import Image as Img print('image_convert_to_png') try: fn_list = photo_file.name.split('.') if len(fn_list) > 1: fp = fn_list[0] + '.png' else: fp = photo_file.name + '.png' image = Img.open(photo_file) print('photo was uploaded') try: image.convert("RGB") print('photo was converted to RGB') except: print('!!! fail convert photo to RGB') if save_file_path: image.save(save_file_path, format="PNG") print('photo was saved') fileBytes = BytesIO() image.save(fileBytes, format="PNG") print('photo was preparing for streaming') memoryFile = InMemoryUploadedFile(fileBytes, None, fp, 'image/png', 1, None) return memoryFile except Exception as e: msg = 'image_convert_to_png error={0}'.format(str(e)) print(msg) techSendMail(msg, 'image_convert_to_png error') return {'error': msg} def image_convert_to_webP(photo_file, save_file_path=None): from io import BytesIO from PIL import Image as Img fn_list = photo_file.name.split('.') if len(fn_list) > 1: webP_fp = fn_list[0] + '.webp' else: webP_fp = photo_file.name + '.webp' image = Img.open(photo_file) image.convert("RGB") if save_file_path: image.save(save_file_path, format="WEBP") fileBytes = BytesIO() image.save(fileBytes, format="WEBP") memoryFile = InMemoryUploadedFile(fileBytes, None, webP_fp, 'image/webp', 1, None) return memoryFile def get_thumb_path(full_filepath, img_type): if img_type == 'webp': convert_to_webP = True else: convert_to_webP = False icon_path = None full_filepath = full_filepath.replace('\\', '/') if not os.path.exists(full_filepath): return None path_list = full_filepath.split('/') filename = path_list[-1] filepath = '/'.join(path_list[:-1]) if convert_to_webP: fn_list = filename.split('.') if len(fn_list) > 1: filename = fn_list[0] + '.webp' else: filename = filename + '.webp' icon_path = '{0}/icon-{1}'.format(filepath, filename) if not os.path.exists(icon_path): size = (300, 300) img = Image.open(full_filepath) if convert_to_webP: img.convert("RGB") img.thumbnail(size) if convert_to_webP: img.save(icon_path, 'WEBP') else: img.save(icon_path) return icon_path def get_filename_from_path(filepath, wo_ext=False): f_list = filepath.split('/') if len(f_list) > 1: filename = f_list[-1] else: filename = f_list[0] f_list = filename.split('\\') if len(f_list) > 1: filename = f_list[-1] else: filename = f_list[0] if filename and wo_ext: f_list = filename.split('.') filename = f_list[0] return filename def get_free_filename(filename, filepath): from os import path, access, R_OK # W_OK for write permission. full_path = filepath + filename i = 0 while path.exists(full_path) and path.isfile(full_path) and access(full_path, R_OK): i += 1 full_path = filepath + filename + '-{0}'.format(str(i)) return full_path def url_translit(value): value = translit(value).lower() # value = slugify_text(value).lower() # value = value.replace(u',', u'-') # value = value.replace(u'.', u'-') # value = value.replace(u'_', u'-') # value = value.replace(u'"', u'') # value = value.replace(u'“', u'') # value = value.replace(u'”', u'') # value = value.replace(u"'", u'') # value = value.replace(u'/', u'-') # value = value.replace(u'\\', u'-') # value = value.replace(u'(', u'') # value = value.replace(u')', u'') # value = value.replace(u'&', u'-and-') # value = value.replace(u' ', u'-') # value = value.replace(u'%', u'') # value = value.replace(u'*', u'-') # value = value.replace(u'±', u'-') allow_symbols = '0123456789abcdefghijklmnopqrstuvwxyz-' i = 0 while i < len(value): if not value[i] in allow_symbols: value = value.replace(value[i], '-') i += 1 while '--' in value: value = value.replace(u'--', u'-') if value[len(value) - 1] == '-': value = value[:-1] return value def translit(locallangstring): conversion = { u'\u0410': 'A', u'\u0430': 'a', u'\u0411': 'B', u'\u0431': 'b', u'\u0412': 'V', u'\u0432': 'v', u'\u0413': 'G', u'\u0433': 'g', u'\u0414': 'D', u'\u0434': 'd', u'\u0415': 'E', u'\u0435': 'e', u'\u0401': 'Yo', u'\u0451': 'yo', u'\u0416': 'Zh', u'\u0436': 'zh', u'\u0417': 'Z', u'\u0437': 'z', u'\u0418': 'I', u'\u0438': 'i', u'\u0419': 'Y', u'\u0439': 'y', u'\u041a': 'K', u'\u043a': 'k', u'\u041b': 'L', u'\u043b': 'l', u'\u041c': 'M', u'\u043c': 'm', u'\u041d': 'N', u'\u043d': 'n', u'\u041e': 'O', u'\u043e': 'o', u'\u041f': 'P', u'\u043f': 'p', u'\u0420': 'R', u'\u0440': 'r', u'\u0421': 'S', u'\u0441': 's', u'\u0422': 'T', u'\u0442': 't', u'\u0423': 'U', u'\u0443': 'u', u'\u0424': 'F', u'\u0444': 'f', u'\u0425': 'H', u'\u0445': 'h', u'\u0426': 'Ts', u'\u0446': 'ts', u'\u0427': 'Ch', u'\u0447': 'ch', u'\u0428': 'Sh', u'\u0448': 'sh', u'\u0429': 'Sch', u'\u0449': 'sch', u'\u042a': '', u'\u044a': '', u'\u042b': 'Y', u'\u044b': 'y', u'\u042c': '', u'\u044c': '', u'\u042d': 'E', u'\u044d': 'e', u'\u042e': 'Yu', u'\u044e': 'yu', u'\u042f': 'Ya', u'\u044f': 'ya', u'№': 'no', } translitstring = [] for c in locallangstring: translitstring.append(conversion.setdefault(c, c)) return ''.join(translitstring) def slugify_text(str_text): utf8_code = False try: str_text = str_text.encode('utf-8').decode('utf-8') utf8_code = True except: pass if utf8_code == False: try: str_text = str_text.decode('utf-8') except: pass str_text = del_bad_symbols(str_text) str_text = str_text.replace(u'"', u'') str_text = str_text.replace(u"'", u'') str_text = str_text.replace(u".", u'') str_text = str_text.replace(u",", u'') str_text = str_text.replace(u" -", u'-') str_text = str_text.replace(u"- ", u'-') str_text = str_text.replace(u"„", u'') str_text = str_text.replace(u"(", u'') str_text = str_text.replace(u")", u'') str_text = str_text.replace(u"{", u'') str_text = str_text.replace(u"}", u'') str_text = str_text.replace(u"<", u'') str_text = str_text.replace(u">", u'') str = translit(str_text) str = translit(str) if len(str) < 2 or len(str) + 3 < len(str_text): str = translit(str_text) str = translit(str) str = str.replace(u"'", u'') str = str.replace(u'"', u'') if len(str) < 2: str = u'' return str def get_price_from_string_w_del_tails(string): string = del_bad_symbols(string) while string.find(' ') > -1: string = string.replace(' ', '') string = string.replace(u'$', '') string = string.replace(u'USD', '') string = string.replace(u'Br', '') string = string.replace(u'руб.', '') string = string.replace(u',', '.') return string def kill_pretexts(txt): pretexts = [ 'в', 'без', 'до', 'из', 'к', 'на', 'по', 'о', 'от', 'перед', 'при', 'через', 'с', 'у', 'за', 'над', 'об', 'под', 'про', 'для' ] words = txt.split(' ') words = [item for item in words if not item in pretexts] return ' '.join(words) def stay_only_text_and_numbers(txt): bad_symbols = '"~`{}[]|!@#$%^&*()_+№;:?= ' nums = '0123456789' for symbol in bad_symbols: txt = txt.replace(symbol, ' ') symbols_for_check = ',.' i = 0 while i < len(txt): if txt[i] in ['.', ',']: if i < 1 or not txt[i - 1] in nums or i == len(txt) - 1 or not txt[i + 1] in nums: txt_list = list(txt) txt_list[i] = ' ' txt = ''.join(txt_list) # if txt[i] in ['"']: # if i < 1 or not txt[i - 1] in nums: # txt_list = list(txt) # txt_list[i] = ' ' # txt = ''.join(txt_list) i += 1 txt = txt.strip() while ' ' in txt: txt = txt.replace(' ', ' ') return txt def del_bad_symbols_and_enters_and_tags(string): # from string import maketrans try: string = strip_tags(string) string = string.replace('\r\n', '') del_bad_symbols(string) except: pass return string def del_bad_symbols(string): # from string import maketrans try: # string = strip_tags(string) # string = string.replace('\r\n','') string = string.strip() while string.find(' ') > -1: string = string.replace(' ', ' ') # table = maketrans(' ', ' ') # string = string.translate(table) while string.find(' ') > -1: string = string.replace(' ', ' ') except: pass return string # def get_offers_from_cookie(request): # if 'oknaplast_right_offers' in request.COOKIES: # order_list = json.loads(request.COOKIES['oknaplast_right_offers'], encoding='utf8') # return WindowOfferModel.objects.filter(id__in=order_list) # else: # return [] def del_nbsp(string): mapping = [ (""", u'"'), ('&', u'&'), ('<', u'<'), ('>', u'>'), (' ', u' '), ('¡', u'¡'), ('¢', u'¢'), ('£', u'£'), ('¤', u'¤'), ('¥', u'¥'), ('¦', u'¦'), ('§', u'§'), ('¨', u'¨'), ('©', u'©'), ('ª', u'ª'), ('«', u'«'), ('¬', u'¬'), ('®', u'®'), ('¯', u'¯'), ('°', u'°'), ('±', u'±'), ('²', u'²'), ('³', u'³'), ('´', u'´'), ('µ', u'µ'), ('¶', u'¶'), ('·', u'•'), ('¸', u'¸'), ('¹', u'¹'), ('º', u'º'), ('»', u'»'), ('¼', u'¼'), ('½', u'½'), ('¾', u'¾'), ('€', u'€'), ('\n', ''), ('\r', ''), ('\t', ' '), ('—', '-'), ] for pair in mapping: string = string.replace(pair[0], pair[1]) return string