Exemple #1
0
    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
Exemple #2
0
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
Exemple #3
0
    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)
Exemple #4
0
    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']  # Массив
Exemple #5
0
    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
Exemple #6
0
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))
Exemple #8
0
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("/")
Exemple #9
0
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)
Exemple #10
0
 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)
Exemple #11
0
    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, ))
Exemple #13
0
    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()
Exemple #14
0
    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)
Exemple #15
0
    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)
Exemple #16
0
    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=&quot;{}&quot; <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()
Exemple #17
0
 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
Exemple #18
0
    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)
Exemple #20
0
    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
Exemple #21
0
 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()