def upload_img(self, img): """Загрузка изображения""" new_img = None if self.img: self.drop_img() # --------------------------------------------------- # django.core.files.uploadedfile.InMemoryUploadedFile # --------------------------------------------------- if type(img) == InMemoryUploadedFile: ext = extension(img.name) if ext: media_folder = self.get_folder() if check_path(media_folder): make_folder(media_folder) new_img = "%s%s" % (self.id, ext) path = os.path.join(media_folder, new_img) if catch_file(img, path): imageThumb(path, 1920, 1280) # ------------------------------ # Загрузка изображения по ссылке # ------------------------------ elif type(img) == str: new_img = grab_image_by_url(img, self.get_folder(), str(self.id)) if new_img: path = os.path.join(self.get_folder(), new_img) img = imageThumb(path, 1920, 1280) if not img: self.drop_img() return None else: new_img = None # ---------------------------------------------------- # django.core.files.uploadedfile.TemporaryUploadedFile # ---------------------------------------------------- elif type(img) == TemporaryUploadedFile: path = img.temporary_file_path() tmp_file = open(path, 'rb') img_content = tmp_file.read() tmp_file.close() ext = extension(img.name) new_img = '{}{}'.format(str(self.id), ext) media_folder = self.get_folder() if check_path(media_folder): make_folder(media_folder) dest = os.path.join(media_folder, new_img) img_file = open_file(dest, 'wb+') img_file.write(img_content) img_file.close() img = imageThumb(dest, 1920, 1280) if not img: self.drop_img() return None else: logger.error('Unknown img type %s' % (type(img), )) assert False self.__class__.objects.filter(pk=self.id).update(img=new_img) self.img = new_img return new_img
def create_double(product): """Создать дубль товара/услуги TODO: если несколько цен :param product: Product model instance """ pass_fields = ('id', 'created', 'updated', 'position', 'parents', 'code') new_product = Products() for field in object_fields(product, pass_fields=pass_fields): value = getattr(product, field) setattr(new_product, field, value) code = '%s-DOUBLE' % product.code new_product.code = code new_product.save() # Изображение if product.img: imga = os.path.join(product.get_folder(), product.img) if not check_path(imga): new_imga = os.path.join(new_product.get_folder(), product.img) copy_file(imga, new_imga) # Галерея gallery = ProductsPhotos.objects.filter( product=product).order_by('position') for photo in gallery: imga = os.path.join(photo.get_folder(), photo.img) if not check_path(imga): params = { 'name': photo.name, 'product': new_product, 'img': photo.img, } new_photo = ProductsPhotos.objects.create(**params) new_imga = os.path.join(new_photo.get_folder(), photo.img) copy_file(imga, new_imga) # Рубрики cats = ProductsCats.objects.select_related('cat').filter(product=product) for cat in cats: ProductsCats.objects.create(product=new_product, cat=cat.cat) # SEO seo_block = product.get_seo() if seo_block: seo = { 'seo_title': seo_block.title, 'seo_description': seo_block.description, 'seo_keywords': seo_block.keywords, } new_product.fill_seo(**seo) # Свойства товара props = ProductsProperties.objects.select_related('prop').filter( product=product) for prop in props: ProductsProperties.objects.create(product=new_product, prop=prop.prop) return new_product
def analyze_css_file(self, css): """Отдельно пройтись по каждому css файлу :param css: путь к css файлу""" contents_css = '' # Для перезаписи css # Тащим файл contents = self.grab_file(css) if not contents: logger.warning('[ERROR]: bad file %s' % css) return css_name = os.path.split(css)[1] css_name = self.clean_path(css_name) css_file = os.path.join(self.css_path, css_name) if not check_path(css_file): now = str(time.time()).replace('.', '_') css_file = '%s-%s' % (css_file, now) with open_file(css_file, 'w+') as f: f.write(contents) self.stylizecss(css_file) # Парсим css файл css = self.clean_path(css) with open_file(css_file, 'r') as f: lines = f.readlines() for line in lines: line = self.parse_css_line(css, line) contents_css = contents_css + line with open_file(css_file, 'w+') as f: f.write(contents_css)
def upload_img(self, is_main, path): """Загрузка изображения на сервер""" if check_path(path): return None upload_img_url = self.get_upload_img_url(is_main) files = {'file': open_file(path, 'rb')} r = self.s.post(upload_img_url, files=files) imga = r.json() if 'error' in imga: logger.error(imga) return None method = 'photos.saveMarketPhoto' params = { 'group_id': self.group_id, 'photo': imga['photo'], 'server': imga['server'], 'hash': imga['hash'], 'crop_data': imga.get('crop_data', ''), 'crop_hash': imga.get('crop_hash', ''), } self.required_params(params) r = self.s.get('%s%s' % (self.API_URL, method), params=params) resp = r.json() if 'error' in resp: logger.error(resp) return None return resp['response'] # Массив
def get_categories(self): """Получаем список категорий для товаров""" fname = 'vkontakte_getCategories.txt' if not check_path(fname): with open_file(fname, 'r') as f: content = json.loads(f.read()) return content method = 'market.getCategories' params = { 'count': 100, 'offset': 0, } self.required_params(params) categories = [] while True: r = self.s.get('%s%s' % (self.API_URL, method), params=params) content = r.json() items = content['response']['items'] if not items: break categories += items params['offset'] += content['response']['count'] with open_file(fname, 'wb+') as f: f.write(json.dumps(categories).encode('utf-8')) return categories
def create_daemon(daemon_name, exec_script, port, pyenv: str = None, api_url: str = None): """Создаем демона :param daemon_name: название демона, например daemon_1.service :param exec_script: исполняемый файл, например, /home/jocker/sites/astwobytes/apps/ws_a223/wss_server.py :param port: параметр для передачи в испольняемый файл, например порт на котором должен запускаться демон скрипт должен принимать этот параметр, демон к этому не имеет отношения, просто передает :param pyenv: питонячий путь для запуска через python, например, /home/jocker/sites/astwobytes/env/bin/python :param api_url: endpoint, чтобы обращаться за настройками, отправлять обновления :return: -------- В демоне не нужно активировать виртуальное окружение, можно просто запускать исполняемый файл вирт. окружения, там уже содержатся все нужные пути - Проверить это можно через # python -m site сравниваем с # /home/jocker/sites/astwobytes/env/bin/python -m site - покажет базу и пути """ if check_path(DAEMON_FOLDER): make_folder(DAEMON_FOLDER) if not pyenv: pyenv = '%s/env/bin/python' % (settings.BASE_DIR.rstrip('/'), ) #daemon_path = '%s/%s.service' % (SYSTEM_FOLDER, daemon_name) #if os.path.exists(daemon_path): # logger.info('daemon already exists') # os.unlink(daemon_path) daemon_script = """[Unit] Description=%s After=multi-user.target ConditionPathExists=%s [Service] ExecStart=%s %s %s %s Restart=always Type=idle [Install] WantedBy=multi-user.target #Alias=%s # Алиас не должен быть таким же как имя сервсиа """ % (daemon_name, exec_script, pyenv, exec_script, port, api_url, daemon_name) daemon = '%s/%s' % (DAEMON_FOLDER, daemon_name) with open_file(daemon, 'w+') as f: f.write(daemon_script)
def handle(self, *args, **options): path = 'price/Price_{}.xml' # 28.01.2021 now = datetime.date.today() path = path.format(now.strftime('%d.%m.%Y')) if check_path(path): logger.info('[ERROR]: file %s not exists' % path) return parser = xml.sax.make_parser() handler = XMLHandler() parser.setContentHandler(handler) parser.parse(full_path(path)) logger.info('[UPDATED]: %s, %s' % (len(handler.updated), handler.updated))
def ReturnFile(request, link): """Возвращаем файл""" if not link.startswith('/'): link = '/%s' % link # Заебал этот фавикон, думаю, # одна проверка на него не напряжет if link == '/favicon.ico': path = '%s/img/favicon.ico' % settings.STATIC_ROOT.rstrip('/') with open(path, 'rb') as f: response = HttpResponse(f.read(), content_type='image/x-icon') response['Content-Length'] = file_size(path) response['Content-Disposition'] = 'inline; filename=%s' % (path, ) return response elif link == '/sitemap.xml': context = {} sitemap = SitemapXML() context['managers'] = sitemap.get_menu_managers() template = 'sitemap_index.html' return render(request, template, context, content_type='text/xml') elif link.startswith('/sitemap/'): context = {} sitemap = SitemapXML() context['blocks'] = sitemap.get_manager(link) template = 'sitemap_xml.html' return render(request, template, context, content_type='text/xml') search_files = Files.objects.filter(link=link, is_active=True) # Если мультидомен, # то ищем в том числе специфический для домена файл, # но если нету, то возвращаем без домена if settings.IS_DOMAINS: domain = get_domain(request) search_file_with_domain = search_files.filter( domain=domain['pk']).values_list('id', flat=True) if search_file_with_domain: search_files = search_files.filter(domain=domain['pk']) search_file = search_files.first() if search_file: path = '%s%s' % (search_file.get_folder(), search_file.path) if not check_path(path): with open(full_path(path), 'rb') as f: response = HttpResponse(f.read(), content_type=search_file.mime) response['Content-Length'] = file_size(path) response['Content-Disposition'] = 'inline; filename=%s' % (path, ) return response else: # файл не найден - лучше 404 отдать raise Http404 return redirect("/")
def import_templates(): """Импорт шаблонов""" import_path = 'import' if check_path(import_path): logger.info('[ERROR]: There is not folder import in media') return for item in ListDir(import_path): template_path = os.path.join(import_path, item) if isForD(template_path) == 'file': if template_path.startswith('.DS_Store'): drop_file(template_path) continue json_path = os.path.join(template_path, 'template.json') blocks_path = os.path.join(template_path, 'blocks') with open_file(json_path, 'r', encoding='utf-8') as f: json_obj = json.loads(f.read()) template = Containers.objects.filter(tag=json_obj['tag'], state=json_obj['state']).first() if not template: template = Containers() for k, v in json_obj.items(): if k in ('blocks', 'img', 'id', 'position'): continue setattr(template, k, v) template.save() if not template.img: imga = json_obj.get('img') if imga: src = os.path.join(template_path, imga) dest = os.path.join(template.get_folder(), imga) copy_file(src, dest) Containers.objects.filter(pk=template.id).update(img=imga) blocks = json_obj.get('blocks') if template.blocks_set.all().aggregate(Count('id'))['id__count'] > 0: #logger.info('pass template %s, it is already with blocks' % template.tag) pass else: recursive_fill_blocks(template, blocks, None, None, blocks_path) template_fname = '%s.html' % template.tag template_src = os.path.join(settings.MEDIA_ROOT, template_path, template_fname) template_dest = os.path.join(settings.BASE_DIR, 'apps/site/templates/web/containers/', template_fname) if not os.path.exists(template_dest): if os.path.exists(template_src): shutil.copy2(template_src, template_dest)
def drop_media(self): """Удаление папки экземпляра модели""" if not self.id: return folder = self.get_folder() drop_folder(folder) parent_folder = os.path.split(folder.rstrip('/'))[0] if check_path(parent_folder): return pass_items = ('.DS_Store', ) parent_folder_fp = full_path(parent_folder) items_in_folder = [ item for item in os.listdir(parent_folder_fp) if not item in pass_items ] if not items_in_folder: os.rmdir(parent_folder_fp)
def get_misc_files(self): """Получить misc файлы""" contents = self.load_file() # ----------------------- # search images in styles # ----------------------- rega_imaga_style = re.compile('(url["(]+([\.]*[^")]+)[")]+)', re.I + re.U + re.DOTALL) matches_imga_style = rega_imaga_style.findall(contents) # ---- # MISC # ---- rega_imga = re.compile('(<img[^>]+src[\s]*=[\s]*["\']([^>"\']+)[^>])', re.I + re.U + re.DOTALL) matches_imga = rega_imga.findall(contents) + matches_imga_style counter = 0 for item in matches_imga: counter += 1 imga = self.findpath(self.base_path, item[1]) imga_name = os.path.split(imga)[1] cur_imga = item[0].replace(item[1], 'misc/' + imga_name) contents = contents.replace(item[0], cur_imga) imga_contents = self.grab_file(imga, False) if imga_contents: imga_file_path = os.path.join(self.misc_path, imga_name) imga_file_path = self.clean_path(imga_file_path) # ----------------- # ПРОВЕРКА НА ДУБЛИ # ----------------- if not check_path(imga_file_path): if not imga in self.img_repeated: self.z += 1 imga_file_path = imga_file_path + str(self.z) if not imga in self.img_repeated: self.img_repeated.append(imga) try: with open_file(imga_file_path, 'wb+') as f: f.write(imga_contents) except: logger.warning('[ERROR]: image %s' % imga_file_path) with open_file(self.index_file, "w+") as f: f.write(contents)
def handle(self, *args, **options): """Создаем uwsgi файл, который нужно будет разместить в /etc/uwsgi/apps-available/, например, /etc/uwsgi/apps-available/astwobytes.ini""" logger.info("""please, do following: --------------------------------- --- INSTALL uwsgi for python3 --- --------------------------------- # apt-get install uwsgi-plugin-python3 # apt install uwsgi-plugin-python look at /usr/lib/uwsgi/plugins, check python3_plugin.so python_plugin.so if it does not exists if we have python LOWER 3.6, let is build ------------------------------- --- BUILD uwsgi for python3 --- ------------------------------- # sudo apt install python3.6 python3.6-dev uwsgi uwsgi-src uuid-dev libcap-dev libpcre3-dev libssl-dev $ cd ~ $ export PYTHON=python3.6 $ uwsgi --build-plugin "/usr/src/uwsgi/plugins/python python36" $ sudo mv python36_plugin.so /usr/lib/uwsgi/plugins/python36_plugin.so $ sudo chmod 644 /usr/lib/uwsgi/plugins/python36_plugin.so $ uwsgi --plugin python36 -s :0 """) folder = 'demonize' if check_path(folder): make_folder(folder) uwsgi_path = '%s/astwobytes.ini' % (folder, ) with open_file(uwsgi_path, 'w+') as f: f.write("""[uwsgi] processes = 1 master = true plugins = python36 chdir = /home/jocker/sites/astwobytes harakiri = 40 wsgi-file = /home/jocker/sites/astwobytes/conf/wsgi.py pythonpath = /home/jocker/sites/astwobytes/env/lib/python3.6/site-packages buffer-size = 8192 """) logger.info('created %s' % (uwsgi_path, ))
def save(self, *args, **kwargs): cid = kill_quotes(self.cid, 'int') if cid.startswith('7'): cid = '8%s' % (cid[1:], ) self.cid = cid super(FSUser, self).save(*args, **kwargs) if not self.is_active or not self.user or not self.passwd or not self.context or not self.cid: self.drop_extension() return extension = """ <include> <user id="{}"> <params> <param name="password" value="{}"/> </params> <variables> <variable name="toll_allow" value="domestic,international,local"/> <variable name="accountcode" value="{}"/> <variable name="user_context" value="{}"/> <variable name="effective_caller_id_name" value="{}"/> <variable name="effective_caller_id_number" value="{}"/> <variable name="outbound_caller_id_name" value="{}"/> <variable name="outbound_caller_id_number" value="{}"/> <variable name="callgroup" value="{}"/> </variables> </user> </include>""".format(self.user.username, self.passwd, self.user.username, self.context, self.user.username, self.user.username, self.cid, self.cid, self.callgroup) fname = full_path('%s/fs_user_%s.xml' % (self.FOLDER, self.id)) if check_path(fname): make_folder(self.FOLDER) with open(fname, 'w+') as f: f.write(extension) FreeswitchBackend(settings.FREESWITCH_URI).reloadxml()
def handle(self, *args, **options): """Работа с задачами Tasks""" # Вывод логов if options.get('log'): if check_path('tasks_errors.txt'): logger.info('empty file') return with open_file('tasks_errors.txt', 'r') as f: content = f.read() print(content) return is_running = search_process(q=('tasks', 'manage.py')) if is_running: logger.info('Already running %s' % (is_running, )) exit() now = datetime.datetime.today() tasks = Tasks.objects.filter(is_active=True).order_by('updated') for task in tasks: if task.updated <= now: run_task(task)
def __init__(self, **kwargs): """На примере mir-ins.ru https://directmir163ru.amocrm.ru Документация: https://www.amocrm.ru/developers/content/oauth/step-by-step """ self.file = 'amocrm_credentials.txt' self.redirect_uri = 'https://mir-ins.ru/amocrm/' self.host = 'https://directmir163ru.amocrm.ru' self.s = requests.Session() self.client_secret = 'Tpi94PsVqnwF7JRoJsi0KnnAG4Od3msqlqzGyflONkl5MZtyfCY5SPMQE49kLaSe' self.client_id = 'cd184f47-26b3-4011-9820-83f3ef5232e5' # Код из админки для получения access_token self.code = 'def502002981f459578c7f343c5e31acfa11de7e642733e27ca945a58e9b66b2ce44b5a993d2569422aa4c1c80d02e2936dfca0981870683e4ad40841cba1f6eff165349e2f8cca73097f970f8e676e0343de5526f1c071ee134b735e65592252e15a9e6ecb9271769c45b2e5f65f67d92d456a056773bdba0fa19f9392b01e7c2c7ea3ac67ccc7b7fafa17a916031cbf49bdee372d7d6544668740aa070500aced0e0d5453d2381cd7f305495670ce828386229fed61a7d86fb23329e8d399869f0eb187aaae39a6b7578049b1d3d9c86cb3277c1ce02c33d8e89d1e342997cceddd48cc93f3fc06f87320e6874b9e17b555003fa5cb153e056900753d79c797fa76e6dc94130d866a5f63e5ea414f239c9afc17c06c847c809ed305678e7d38d1979639c1c3cd36db77e703f93901f21c9998e2b2e4b27273aaaa00a9114e7f8e7faa7fb83938b8838bf368a1ee73b1e7941206c70eab4e3585b48708504ee0345878fc09cd6880fbfcaac65a274ee2024d3da337703c0b45007c8e924132231e98a924a90de2ebc8c9a4d0b50b2e7636a68e030d29fd7a7c2df2b61396cf008c407a3752478cac5cb15871a81c0083b7a78cb645f95ec973aa58e7bc65f2a9392a6ba25' self.access_token = 'eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsImp0aSI6IjNjOTY2ZmMxY2NmOGZmMzdmMGFmNzQwNGRmMDc2Njk2MTMwMjNjYWQwMzRhMWNjM2RkZmU5MmJiNjI1MTAxNTE3NWQ2NjAzMzBjOGI5MWJjIn0.eyJhdWQiOiJjZDE4NGY0Ny0yNmIzLTQwMTEtOTgyMC04M2YzZWY1MjMyZTUiLCJqdGkiOiIzYzk2NmZjMWNjZjhmZjM3ZjBhZjc0MDRkZjA3NjY5NjEzMDIzY2FkMDM0YTFjYzNkZGZlOTJiYjYyNTEwMTUxNzVkNjYwMzMwYzhiOTFiYyIsImlhdCI6MTYwNDkxOTk0MywibmJmIjoxNjA0OTE5OTQzLCJleHAiOjE2MDUwMDYzNDMsInN1YiI6Ijk5NTQ0NiIsImFjY291bnRfaWQiOjE5NDgwODEzLCJzY29wZXMiOlsicHVzaF9ub3RpZmljYXRpb25zIiwiY3JtIiwibm90aWZpY2F0aW9ucyJdfQ.a-rejYPPlCmJT4-A8cQZGdaOC3XVBmNugxLcn0hxKGKagndE5Q-PD3q7PhPl2bhJcRhW6EJS1AvB8lao07KqIkj7MZ9nlxI170ily1sivJbKCSyqeL8Rhen6f8Kx2032VD0dWCv2Zwy4eP1m-fpusTdvPwt5eYKmyXo5ig6haH1mwEbM2QRXPXPmMjZLAO6F-T4eKdYJPI2waFYFCWvMm3xhAco4wKfhjmkckRBEPPzaT0aFA3Gi8ivg8SsKfnRzfNgCKxWXHkPPjpj5HuLt5svBYzHUejcHEbq7d_YF3TT0RLN98dmKTrzzkb8B0XYScci9mRIVEZve12tG1UKi7Q' self.refresh_token = 'def502006b01bcf4b70f3b4988642c13f5544c079671d0d06bbc68beab4cda5d692370014b059037b13678e51f87d393eeba2a12683c2e874503ae5e0abc7698e335024e635426ce2f25ba2daa5d083758743e0d40a43bb4548aa24d5c190c263b350b29a34c3fe506a911669b92c15ee9562f6d55b2344c2bf74fe977d9d7cb8244f8fe6cf8696a40a26de81e11c8e0aebe2b452bf4e3ccd8822768acb9837dffa175abf8cf9eaf3f5921db5f974d5fda7c26ea2c28e2ad73f67d98c2be4ce666d3dc43b1f8906366778cb367994e29020128caf44f05f63e6b8b1f5266b6533fe0e6456b3529594f3cb08da758f56081363215f04915198af0ccbfa5ab3861382c08eb4a7d3a641dd328dfabe3212421da46f21174ed7d70c6c84e27daabf7be37bb26538920cf1c97b936ea73165a2a0a3612505fd7a4a3e200240d34cf78a20ad5c43c7c4ff10f292eae99c4672cd75d02d6dece6c6b086e9e882e7c45299b2716641ea1c24e6e297562087e126aa07f29445cb45c772d86108b4f9d1a636e98462aac7bd810d2a753561c4892151b6a95094d1da7cd5dfab81b66c036c7e31cd0388874554153ae5ead082b26524a906f0655a605a00fd086051469783e09b7bc81ee2441e180' self.headers = {'Authorization': 'Bearer %s' % self.access_token} if not check_path(self.file): with open_file(self.file, 'r') as f: content = json.loads(f.read()) self.set_credentials(content)
def save(self, *args, **kwargs): super(Redirects, self).save(*args, **kwargs) if not self.is_active: self.drop_extension() return extension = """ <extension name="redirect_{}"> <condition field="destination_number" expression="^([78]{})$"> <action application="set" data="effective_caller_id_number={}"/> <action application="set" data="effective_caller_id_name={}"/> <action application="set" data="ringback={}"/> <action application="export" data="hold_music={}"/> <action application="set" data="ignore_early_media=true" /> <action application="set" data="record_file_name={}"/> <action application="set" data="media_bug_answer_req=true"/> <action application="export" data="execute_on_answer=record_session {}"/> <action application="set" data="sip_h_Diversion="{}" <sip: {}@{}>;reason=unconditional;"/> <action application="bridge" data="sofia/gateway/{}/{}"/> </condition> </extension>""".format(self.phone, kill_quotes(self.phone[1:], 'int'), '${caller_id_number}', '${caller_id_number}', '${us-ring}', '$${hold_music}', '$${base_dir}/${context}/${strftime(%Y-%m-%d)}/${destination_number}_${uuid}.wav', '${record_file_name}', '${diversion_phone}', '${diversion_phone}', '${diversion_domain}', self.gw, kill_quotes(self.dest, 'int')) fname = full_path('%s/redirect_%s.xml' % (self.FOLDER, self.id)) if check_path(fname): make_folder(self.FOLDER) with open(fname, 'w+') as f: f.write(extension) FreeswitchBackend(settings.FREESWITCH_URI).reloadxml()
def upload_file(self, fname, field: str, additional_update: dict = None): """Загрузка файла в нужное поле :param fname: файл :param field: поле в которое загружаем файл :param additional_update: доп. поля, которые хотим обновить у модели, например, {'name': '123.txt'} """ new_fname = None if not hasattr(self, field): return None if not additional_update: additional_update = {} self.drop_file(field) media_folder = self.get_folder() if check_path(media_folder): make_folder(media_folder) ext = fname.name.split(".")[-1] if len(ext) > 5: return None # --------------------------------------------- # field подставляем, чтобы не заменило картинку # или чтобы не совпало с другими ибучими полями # --------------------------------------------- new_fname = "%s_%s.%s" % (field, self.id, ext) path = os.path.join(media_folder, new_fname) params = { field: new_fname, } params.update(additional_update) if catch_file(fname, path): self.__class__.objects.filter(pk=self.id).update(**params) setattr(self, field, new_fname) else: self.__class__.objects.filter(pk=self.id).update(**{field: None}) setattr(self, field, None) return new_fname
def get_attrs(self): """Получить связи свойств с товарами""" pvalues = {} fname = 'simaland_pvalues.json' if not check_path(fname): f = open_file(fname) content = json.loads(f.read()) pvalues = {int(k): v for k, v in content.items()} f.close() if not pvalues: logging.info('receiving values') params = {'p': 1} resp_count = 1 while(resp_count > 0): r = self.s.get('%s/option' % self.api_url, params=params) if not r.status_code == 200: break resp = r.json() resp_count = len(resp) params['p'] += 1 for item in resp: pvalues[item['id']] = item['name'] f = open_file(fname, 'w+') f.write(json.dumps(pvalues)) f.close() pvalues[0] = 'Да' lazy_props = {} logging.info('%s values received, receiving attrs' % len(pvalues)) params = {'p': 1} resp_count = 1 while(resp_count > 0): r = self.s.get('%s/item-attribute' % self.api_url, params=params) if not r.status_code == 200: break resp = r.json() resp_count = len(resp) params['p'] += 1 # Обрабытываем каждую пачку свойств for item in resp: product_id = item['item_id'] prop_id = item['attribute_id'] option_value = item['option_value'] if not option_value in pvalues: #logging.info('%s not in pvalues' % item) continue product = Products.objects.filter(code='simaland_%s' % product_id).only('id').first() if not product: continue if prop_id in lazy_props: prop = lazy_props[prop_id] else: prop = Property.objects.filter(code='simaland_%s' % prop_id).only('id').first() lazy_props[prop_id] = prop if not prop: logger.info('prop not found %s' % item) continue analog = PropertiesValues.objects.filter( prop=prop, str_value=pvalues[option_value], ).only('id').first() if not analog: analog = PropertiesValues.objects.create( prop=prop, str_value=pvalues[option_value], ) pvalue = ProductsProperties.objects.filter( product=product, prop=analog, ).only('id').first() if not pvalue: pvalue = ProductsProperties.objects.create( product=product, prop=analog, )
def edit_conclusion_file(request, action: str, row_id: int = None, *args, **kwargs): """Создание/редактирование файлов для заключений на заявку""" mh_vars = conclusion_files_vars.copy() mh = create_model_helper(mh_vars, request, CUR_APP, action) mh.select_related_add('joint_conclusion') mh.select_related_add('joint_conclusion__welding_joint') row = mh.get_row(row_id) context = mh.context if mh.error: return redirect('%s?error=not_found' % (mh.root_url, )) if request.method == 'GET': if action == 'create': mh.breadcrumbs_add({ 'link': mh.url_create, 'name': '%s %s' % (mh.action_create, mh.rp_singular_obj), }) elif action == 'edit' and row: mh.breadcrumbs_add({ 'link': mh.url_edit, 'name': '%s %s' % (mh.action_edit, mh.rp_singular_obj), }) elif action == 'drop' and row: if mh.permissions['drop']: if mh.row.joint_conclusion.welding_joint.state == 3: context['error'] = 'Нельзя изменить принятую заявку' else: row.delete() mh.row = None context['success'] = '%s удалено' % (mh.singular_obj, ) else: context['error'] = 'Недостаточно прав' elif action == 'download' and row: # Возвращаем файл по имени path = '%s%s' % (row.file.get_folder(), row.file.path) if not check_path(path): with open(full_path(path), 'rb') as f: response = HttpResponse(f.read(), content_type=row.file.mime) response['Content-Disposition'] = row.file.content_disposition_for_cyrillic_name(row.file.name) return response elif request.method == 'POST': pass_fields = () mh.post_vars(pass_fields=pass_fields) if action == 'create' or (action == 'edit' and row): if action == 'create': if mh.permissions['create']: mh.row = mh.model() mh.save_row() context['success'] = 'Данные успешно записаны' else: context['error'] = 'Недостаточно прав' if action == 'edit': if mh.permissions['edit']: if mh.row.welding_joint.state == 3: context['error'] = 'Нельзя изменить принятую заявку' else: mh.save_row() context['success'] = 'Данные успешно записаны' else: context['error'] = 'Недостаточно прав' elif action == 'img' and request.FILES: mh.uploads() if mh.row: context['row'] = object_fields(mh.row) if mh.row.file: context['row']['file'] = object_fields(mh.row.file) context['redirect'] = mh.get_url_edit() if request.is_ajax() or action == 'img': return JsonResponse(context, safe=False) template = '%sedit.html' % (mh.template_prefix, ) return render(request, template, context)
def parse_css_line(self, css: str, line: str): """Парсинг css строчки в файле css :param css: путь к css файлу :param line: строка в css файле""" # ----------------------------------- # SUPPORT for @import "css/main.css"; # ----------------------------------- matches_import = rega_import.search(line) if matches_import: old_path = matches_import.group(1) if old_path.endswith('.css'): # ------------------------------------------------------------- # Тут ремарка скажем @import url("../medica-parent/style.css"); # тогда надо брать путь относительно пути текущего css файла, # а не базового => смотрим в функцию findpath # css => http://demo.themefuse.com/medica-child/style.css?v=1 # Видно, что надо отбросить финальный элемент пути # ------------------------------------------------------------- if css.endswith('.css') and '/' in css: css = os.path.split(css)[0] temp_css_file = self.findpath(css, kill_quotes(old_path, 'quotes')) self.css_files.append(temp_css_file) temp_css_name = os.path.split(temp_css_file)[1] line = line.replace(old_path, '../css/%s' % temp_css_name) matches_img = rega_img.findall(line) for match_img in matches_img: old_path = match_img if old_path.endswith('.css"'): # SUPPORT FOR @import url(../css/xxx.css); temp_css_file = self.findpath(css, kill_quotes(old_path, 'quotes')) css_files.append(temp_css_file) temp_css_name = os.path.split(temp_css_file)[1] line = line.replace(old_path, '../css/%s' % temp_css_name) continue # ----------------------- # Бывает, что svg попался # ----------------------- if 'data:' in match_img: continue # ---------------------------------- # Какие-то долбаебы в картинку якорь # и бывает, что это все что там есть # ---------------------------------- if '#' in old_path: old_path = old_path.split('#')[0].strip() if not old_path: continue img = self.findpath(css, kill_quotes(old_path, 'quotes')) img_name = os.path.split(img)[1] # Меняем путь в css img_folder = os.path.split(img)[0] line = line.replace(old_path, '../img/%s' % img_name) # Тащим картинку contents = self.grab_file(img, False) if not contents: continue img_file_path = os.path.join(self.img_path, img_name) # --------------------------- # Фикс на имя с ? параметрами # --------------------------- img_file_path = self.clean_path(img_file_path) # ПРОВЕРКА НА ДУБЛИ if not check_path(img_file_path): if not img in self.img_repeated: self.z += 1 img_file_path = img_file_path + str(self.z) if not img in self.img_repeated: self.img_repeated.append(img) with open_file(img_file_path, 'wb+') as f: f.write(contents) return line
def drop_extension(self): """Удаление файла в случае удаления записи или отключения""" fname = '%s/fs_user_%s.xml' % (self.FOLDER, self.id) if not check_path(fname): drop_file(fname) FreeswitchBackend(settings.FREESWITCH_URI).reloadxml()