def handle(self, *args, **options):
     addresses = Address.objects.all()
     for address in addresses:
         #if not address.latitude or not address.longitude:
         resp = ask_yandex_address_by_str(address.addressLines)
         print(json_pretty_print(resp))
         adr = parse_yandex_address(resp)
         print(json_pretty_print(adr))
         if not adr:
             continue
         kwargs = {
             k: v
             for k, v in adr.items() if not k in ('addressLines', )
         }
         Address.objects.filter(pk=address.id).update(**kwargs)
Exemple #2
0
    def create_deals(self, deals: list):
        """Добавить сделку
           name string Название сделки
           price int Бюджет сделки
           status_id int ID статуса
           pipeline_id int ID воронки
           created_by int ID пользователя, создающий сделку 0=робот
           updated_by int ID пользователя, изменяющий сделку 0=робот
           closed_at int Дата закрытия сделки, передается в Unix Timestamp
           created_at int Дата создания сделки, передается в Unix Timestamp
           updated_at int Дата изменения сделки, передается в Unix Timestamp
           loss_reason_id int ID причины отказа
           responsible_user_id int ID пользователя, ответственного за сделку
           custom_fields_values array Массив по дополнительным полям
                                      _embedded object вложенные теги
                                      _embedded[tags] array|null данные тегов
                                      _embedded[tags][0] object Модель тега id или name
                                      _embedded[tags][0][id] int ID тега
                                      _embedded[tags][0][name] string Название тега
           https://www.amocrm.ru/developers/content/crm_platform/custom-fields#cf-fill-examples

           request_id string вернется в ответе без изменений
           :param deals: список сделок
        """
        endpoint = '/api/v4/leads'
        r = self.s.post('%s%s' % (self.host, endpoint),
                        json=deals,
                        headers=self.headers)
        print(json_pretty_print(r.json()))
        return r.json()
Exemple #3
0
def build_symbols_dict(obj: dict):
    """Построить словарь контрактов
       :param obj: полученные контракты (get_active_symbols)
    """
    from apps.main_functions.catcher import json_pretty_print
    active_symbols = obj['active_symbols']
    markets = {}
    for item in active_symbols:
        market = markets.get(item['market'])
        if not market:
            market = {
                'market': item['market'],
                'name': item['market_display_name'],
                'submarkets': {},
            }
            markets[item['market']] = market
        submarket = market['submarkets'].get(item['submarket'])
        if not submarket:
            submarket = {
                'submarket': item['submarket'],
                'name': item['submarket_display_name'],
                'symbols': [],
            }
            market['submarkets'][item['submarket']] = submarket
        submarket['symbols'].append(item['symbol'])
    print(json_pretty_print(markets))
    return markets
Exemple #4
0
def test(request):
    """Апи-метод для получения ip-адреса"""
    method = request.GET if request.method == 'GET' else request.POST
    result = {
        'ip': method.get('REMOTE_ADDR'),
        'ip_forwarded': request.META.get('HTTP_X_FORWARDED_FOR'),
    }
    # на случай, если надо посмотреть тело json запроса
    if hasattr(request, 'body') and request.body:
        print(json_pretty_print(json.loads(request.body)))
        result = {
            'apiVersion': '1',
            'error': {
                'code':
                400,
                'message':
                'bad request',
                'errors': [{
                    'reason':
                    'requiredFieldMissing',
                    'message':
                    'pickup: required field pointOfServiceId missing',
                }]
            },
        }
        return JsonResponse(result, safe=False, status=400)
    return JsonResponse(result, safe=False)
Exemple #5
0
    def handle(self, *args, **options):
        Address.objects.all().delete()
        Dealer.objects.all().delete()

        #load_dealers2file()

        with open(DEALERS_FILE, 'r', encoding='utf-8') as f:
            addresses = json.loads(f.read())
        for adr in addresses:

            adr_info = ask_yandex_address_by_coords(adr['latitude'], adr['longitude'])
            details = parse_yandex_address(adr_info)
            print(json_pretty_print(details))
            adr.update({
                'country': details.get('country'),
                'city': details.get('city'),
                'state': details.get('state'),
                'county': details.get('county'),
                'street': details.get('street'),
                'subdistrict': details.get('subdistrict'),
                'houseNumber': details.get('houseNumber'),
                'postalCode': details.get('postalCode'),
            })

            address = Address.objects.create(**{
                k: v for k, v in adr.items() if not k in ('phone', )
            })

            dealer = Dealer.objects.create(**{
                'name': adr['addressLines'],
                'phone': adr['phone'],
                'address': address,
            })
Exemple #6
0
def load_dealers(country):
    """Загрузка дилеров
       :param country: страна
    """
    result = []
    domain = 'https://api.sur-ron.com/web/store/en/list'
    params = {
        'country': country,
        'page': 1,
        'size': 200,
    }
    r = requests.get(domain, params=params)
    resp = r.json()
    items = resp.get('data', {}).get('list', [])
    while items:
        print(json_pretty_print(params))
        params['page'] += 1
        result += [{
            'phone': item['contactPhone'],
            'place': item.get('storeName') or item.get('contactName'),
            'addressLines': item['address'],
            'latitude': item['latitude'],
            'longitude': item['longitude'],
        } for item in items]
        r = requests.get(domain, params=params)
        resp = r.json()
        items = resp.get('data', {}).get('list', [])
    return result
 def handle(self, *args, **options):
     parser = xml.sax.make_parser()
     xml_handler = XMLHandler()
     parser.setContentHandler(xml_handler)
     parser.parse('/home/jocker/Documents/SEVA/1cv8_unloading.xml')
     #print(json_pretty_print(xml_handler.all_tags))
     print(json_pretty_print(xml_handler.tags_tree))
Exemple #8
0
 def get_deal(self, deal_id: int):
     """Получить сделку"""
     endpoint = '/api/v4/leads/%s' % deal_id
     params = {}
     r = self.s.get('%s%s' % (self.host, endpoint),
                    params=params,
                    headers=self.headers)
     print(json_pretty_print(r.json()))
     return r.json()
Exemple #9
0
 def handle(self, *args, **options):
     """Получение данные по ИНН"""
     url = 'https://egrul.nalog.ru/'
     inn = ''
     if options.get('inn'):
         inn = options['inn']
     if not inn:
         logger.info('inn not set')
         return
     print(json_pretty_print(get_info_by_inn(inn)))
Exemple #10
0
def my_ip(request):
    """Апи-метод для получения ip-адреса"""
    method = request.GET if request.method == 'GET' else request.POST
    result = {
        'method': request.method,
        'ip': request.META.get('REMOTE_ADDR'),
        'ip_forwarded': request.META.get('HTTP_X_FORWARDED_FOR'),
    }
    # на случай, если надо посмотреть тело json запроса
    if hasattr(request, 'body') and request.body:
        logger.info(json_pretty_print(json.loads(request.body)))
    return JsonResponse(result, safe=False)
Exemple #11
0
    def handle(self, *args, **options):
        """Выгрузка товаров sima-land.ru"""
        #Products.objects.all().delete()

        simaland = SimaLand()
        simaland.get_jwt()
        #cart = simaland.get_cart()
        #print(json_pretty_print(cart))

        #print(simaland.add2cart(cart_id=cart['_cart']['cart_id'], items=[{'item_id': 8392, 'qty': 1}, ]))

        #simaland.get_categories()

        #started = time.time()
        #simaland.get_products()
        print(json_pretty_print(simaland.get_product(product_id=4119069)))
Exemple #12
0
 def handle(self, *args, **options):
     kwargs = {}
     token = options.get('token')
     if token:
         kwargs['token'] = token
     chat_id = options.get('chat_id')
     if chat_id:
         kwargs['chat_id'] = chat_id
     proxy = options.get('proxy')
     if proxy:
         kwargs['proxies'] = {
             'http': proxy,
             'https': proxy,
         }
     logger.info(kwargs)
     bot = TelegramBot(**kwargs)
     logger.info(json_pretty_print(bot.get_updates()))
Exemple #13
0
    def handle(self, *args, **options):

        params = {
            'amount': 100,
            'orderNumber': 'test_%s' % str(time.time()),
            'returnUrl': 'http://*****:*****@masterme.ru',
            'phone': '73952959223',
        }

        sber = SberPaymentProovider()
        register_order = sber.register_do(**params)
        print(json_pretty_print(register_order))
        print(register_order['errorCode'], type(register_order['errorCode']))
Exemple #14
0
def app2settings(app_name):
    """Добавляем новое приложение в settings.py
       :param app_name: новое приложение"""
    settings_path = os.path.join(settings.BASE_DIR, 'conf', 'settings.py')
    with open(settings_path, 'r') as f:
        content = f.read()
    rega_custom_apps = re.compile('# CUSTOM_APPS_START\nCUSTOM_APPS = (.+)\n# CUSTOM_APPS_END', re.I + re.U + re.DOTALL)
    custom_apps_match = rega_custom_apps.search(content)
    CUSTOM_APPS = json.loads(custom_apps_match.group(1))
    CUSTOM_APPS.append('apps.%s' % (app_name, ))
    CUSTOM_APPS = list(set(CUSTOM_APPS))
    new_custom_apps = """
# CUSTOM_APPS_START
CUSTOM_APPS = %s
# CUSTOM_APPS_END""" % (json_pretty_print(CUSTOM_APPS), )
    content = rega_custom_apps.sub(new_custom_apps, content)
    with open(settings_path, 'w') as f:
        f.write(content)
Exemple #15
0
 def update_access_token(self):
     """Обновление access_token через refresh_token
     """
     endpoint = '/oauth2/access_token'
     params = {
         'client_id': self.client_id,
         'client_secret': self.client_secret,
         'grant_type': 'refresh_token',
         'refresh_token': self.refresh_token,
         'redirect_uri': self.redirect_uri,
     }
     r = self.s.post('%s%s' % (self.host, endpoint), data=params)
     resp = r.json()
     print(json_pretty_print(resp))
     self.set_credentials(resp)
     with open_file(self.file, 'w+') as f:
         f.write(json.dumps(resp))
     return resp
Exemple #16
0
 def create_contacts(self, contacts: list):
     """Добавление контактов
        name string Название контакта
        first_name string Имя контакта
        last_name string Фамилия контакта
        responsible_user_id int ID пользователя, ответственного за контакт
        created_by int ID пользователя, создавший контакт
        updated_by int ID пользователя, изменивший контакт
        created_at int Дата создания контакта, передается в Unix Timestamp
        updated_at int Дата изменения контакта, передается в Unix Timestamp
        custom_fields_values array Массив дополнительных полей
        request_id string Поле, которое вернется вам в ответе без изменений
     """
     endpoint = '/api/v4/contacts'
     r = self.s.post('%s%s' % (self.host, endpoint),
                     json=contacts,
                     headers=self.headers)
     print(json_pretty_print(r.json()))
     return r.json()
Exemple #17
0
    def get_access_token(self):
        """Получение access_token и refresh_token
           Если 3 мес не пользоваться access_token, то он просрется
           access_token надо обновлять по refresh_token,
           поэтому надо хранить в базе их, потому что тоже просрать легко

           Далее делаем запросы к апи и добавляем к headers
             'Authorization: Bearer ' . $access_token
        """
        endpoint = '/oauth2/access_token'
        params = {
            'client_id': self.client_id,
            'client_secret': self.client_secret,
            'grant_type': 'authorization_code',
            'code': self.code,
            'redirect_uri': self.redirect_uri,
        }
        r = self.s.post('%s%s' % (self.host, endpoint), data=params)
        print(json_pretty_print(r.json()))
        return r.json()
Exemple #18
0
 def link_deal2contact(self, deal_id: int, contact_id: int):
     """Привязать сделку к контакту
        to_entity_id int ID связанной сущности
        to_entity_type string Тип связанной сущности (leads, contacts)
        metadata object|null Метаданные связанной сущности
        metadata[catalog_id] int ID каталога
        metadata[quantity] int Количество прикрепленных элементов каталогов
        metadata[is_main] bool Является ли контакт главным
        metadata[updated_by] int ID пользователя, который прикрепил
        :param deal_id: id сделки
        :param contact_id: ид контакта
     """
     endpoint = '/api/v4/leads/%s/link' % deal_id
     params = [{
         'to_entity_id': contact_id,
         'to_entity_type': 'contacts',
     }]
     r = self.s.post('%s%s' % (self.host, endpoint),
                     json=params,
                     headers=self.headers)
     print(json_pretty_print(r.json()))
     return r.json()
Exemple #19
0
    def handle(self, *args, **options):
        kwargs = {}
        token = options.get('token')
        if token:
            kwargs['token'] = token
        chat_id = options.get('chat_id')
        if chat_id:
            kwargs['chat_id'] = chat_id
        proxy = options.get('proxy')
        if proxy:
            kwargs['proxies'] = {
                'http': proxy,
                'https': proxy,
            }
        logger.info(kwargs)

        bot = TelegramBot(**kwargs)

        test_msg = '%s - Тестовое сообщение' % (bot.get_emoji('clearSky'), )
        if options.get('text'):
            test_msg = options['text']

        logger.info(
            json_pretty_print(bot.send_message(test_msg, parse_mode='HTML')))
Exemple #20
0
def get_event(link, date):
    """Подтаскиваем событие
       Подтаскиваем место
       Подтаскиваем сеанс
       date передается для RSeances"""
    url = '{}{}'.format(root_url, link)
    logger.info('get_event => {}'.format(url))
    content = requests.get(url).text
    tree = html.fromstring(content)
    container = tree.xpath('.//*[@class="grid-inner"]')[0]

    tag = link.split('/')[-2]
    analogs = REvents.objects.filter(tag=tag)
    if analogs:
        analog = analogs[0]
    else:
        analog = REvents.objects.create(tag=tag)

    # /afisha/cinema/20190125/44696/
    # Разбиваем по первой цифре года
    rgenre = RGenres.objects.get(tag=link.split('2')[0])
    analog.rgenre = rgenre
    # --------------------
    # Загрузка изображения
    # --------------------
    if not analog.img:
        imgas = tree.xpath('.//link')
        for imga in imgas:
            if imga.attrib.get('rel') == 'image_src':
                href = imga.attrib.get('href')
                analog.upload_img(href)

    title = container.xpath('.//h1')[0].text.strip()
    analog.name = title

    seance = None
    place = None

    details = []
    info = container.xpath(
        './/*[@class="cinema-list__labels cinema-list__labels_read"]')[0]
    for item in info:
        if item.tag.lower() == 'span':
            detail = item.xpath('.//b')
            if detail:
                if detail[0].text:
                    if '+' in detail[0].text:
                        analog.label = detail[0].text.strip()
                t = detail[0].xpath('.//time')
                if t:
                    if t[0].text:
                        seance = t[0].text.strip()
            else:
                if item.text:
                    analog.genre = item.text.strip()
        # -------------------------
        # Это ссылка на место, надо
        # его найти или добавить
        # -------------------------
        elif item.tag.lower() == 'a':
            href = item.attrib.get('href')
            if not '/guide/' in href:
                continue
            tag = href.split("/")[-2]
            place_analogs = Places.objects.filter(tag=tag)
            if place_analogs:
                place = place_analogs[0]
            else:
                place = get_place(href, tag)

    if seance:
        hours, minutes = seance.split(':')
        RSeances.objects.create(place=place,
                                event=analog,
                                hours=hours,
                                minutes=minutes,
                                date=date)

    desc = ''
    description = container.xpath('.//*[@class="event-article"]/p')
    for item in description:
        if item.text:
            desc += '<p>{}</p>'.format(kill_html(item.text.strip()))
    analog.description = desc

    # -------------------------------
    # На удивление, тут нет картинки,
    # ее надо дергать с листинга
    # -------------------------------
    logger.info(json_pretty_print(object_fields(analog)))
    analog.save()

    if not seance:
        logger.error('---SEANCE NOT RECOGNIZED---')
    if not place:
        logger.error('---PLACE NOT RECOGNIZED---')
Exemple #21
0
def get_place(link, tag):
    """Подтаскиваем место, если его нет"""
    url = '{}{}'.format(root_url, link)
    logger.info('get_place => {}'.format(url))
    content = requests.get(url).text
    tree = html.fromstring(content)
    containers = tree.xpath('.//*[@class="grid-inner"]')
    if containers:
        container = containers[0]
    else:
        return None

    place_card = container.xpath('.//*[@class="place-card"]')[0]

    analogs = Places.objects.filter(tag=tag)
    if analogs:
        analog = analogs[0]
    else:
        analog = Places.objects.create(tag=tag)

    title = place_card.xpath('.//h1')[0].text.strip()
    analog.name = title

    imga = place_card.xpath('.//*[@class="place-card__image"]/img')
    if imga:
        imga = imga[0].attrib.get('src')
        analog.upload_img(imga)

    info = place_card.xpath('.//*[@class="place-card__info"]')[0]
    place_phones = []
    for item in info:
        class_item = item.attrib.get('class')
        if 'column_tel' in class_item:
            phones = item.xpath('.//p')
            for phone in phones:
                if phone.text:
                    place_phones.append(phone.text.strip())
        elif 'column_pl' in class_item:
            details = item.xpath('.//p')
            for detail in details:
                worktime = detail.xpath('.//b')
                address = detail.xpath('.//a')
                if worktime:
                    analog.worktime_str = worktime[0].text.strip()
                elif address:
                    analog.address_str = address[0].attrib.get(
                        'data-map-address')
        elif 'column_right' in class_item:
            details = item.xpath('.//p/a')
            for item in details:
                href = item.attrib.get('href')
                if 'mailto' in href:
                    analog.email_str = item.text.strip()
                else:
                    analog.site_str = href

    if place_phones:
        analog.phone_str = ', '.join(place_phones)

    logger.info(json_pretty_print(object_fields(analog)))
    analog.save()
    return analog
Exemple #22
0
def get_cinema_event(link, imga_link):
    """Подтаскиваем событие, если его нет"""
    url = '{}{}'.format(root_url, link)
    logger.info('get_cinema_event => {}'.format(url))
    content = requests.get(url).text
    tree = html.fromstring(content)
    container = tree.xpath('.//*[@class="grid-inner"]')[0]

    tag = link.split('/')[-2]
    analogs = REvents.objects.filter(tag=tag)
    if analogs:
        analog = analogs[0]
    else:
        analog = REvents.objects.create(tag=tag)

    # /afisha/cinema/20190125/44696/
    # Разбиваем по первой цифре года
    rgenre = RGenres.objects.get(tag=link.split('2')[0])
    analog.rgenre = rgenre
    # --------------------
    # Загрузка изображения
    # --------------------
    if imga_link:
        analog.upload_img(imga_link)

    title = container.xpath('.//h1')[0].text.strip()
    analog.name = title
    details = []
    info = container.xpath(
        './/*[@class="cinema-list__labels cinema-list__labels_read"]')[0]
    for item in info:
        if item.tag.lower() == 'span':
            detail = item.xpath('.//b')
            if detail:
                details.append(detail[0].text.strip())
            else:
                details.append(item.text.strip())
    if len(details) == 4:
        analog.duration = details[0]
        analog.label = details[1]
        analog.genre = details[2]
        analog.country = details[3]
    else:
        logger.error('--- INFO NOT RECOGNIZED ---')

    desc = ''
    description = container.xpath(
        './/*[@class="cinema-desc__item cinema-desc__item_text"]/p')
    for item in description:
        if item.text:
            desc += '<p>{}</p>'.format(kill_html(item.text.strip()))
    analog.description = desc

    trailer = container.xpath('.//*[@class="g-video"]/iframe')
    if trailer:
        src = trailer[0].attrib.get('src')
        trailer = html.tostring(trailer[0])
        if '//www.youtube.com' in src:
            analog.trailer = trailer.decode('utf-8')

    actors = container.xpath(
        './/*[@class="cinema-desc__item cinema-desc__item_aside"]/dl')

    if actors:
        field = None
        values = []
        for actor in actors[0]:
            if actor.tag.lower() == 'dt':
                if field and values:
                    setattr(analog, field, ', '.join(values))
                    values = []
                    field = None
                if 'Режиссер' in actor.text:
                    field = 'producer'
                else:
                    field = 'actors'
            elif actor.tag.lower() == 'dd':
                values.append(actor.text.strip())
        if field and values:
            setattr(analog, field, ', '.join(values))

    # -------------------------------
    # На удивление, тут нет картинки,
    # ее надо дергать с листинга
    # -------------------------------
    logger.info(json_pretty_print(object_fields(analog)))
    analog.save()
    return analog
Exemple #23
0
 def handle(self, *args, **options):
     bot = TelegramBot()
     with open_file('misc/logo.png') as f:
         logger.info(json_pretty_print(bot.send_photo(f)))
Exemple #24
0
def DefaultFeedback(request, **kwargs):
    """Контакты и форма обратной связи
       kwargs['fv']:
       fv => array дополнительной информации для письма
       ------------------------------------------------
       Любое количество полей с его описанием принимаем
       из main.views.FeedBack
       kwargs['fields'] = [{"name":"value"}, ...]
       name - название input/select...
       value - описание что за поле
       соответственно, вытаскиваем из POST по name и
       описание будет value:request.POST['name']
       -------------------------------------------------
       kwargs['additional_emails'] = True =>
       принимаем request.POST.get("additional_emails)
       kwargs['additional_emails_condition'] = "223.ru"
       => условие - в email должно быть это выражение
       -------------------------------------------------
       kwargs['additional_conds'] - доп. валидация
       kwargs['additional_conds'] = [
         {"name":"sms", "error":u"Неправильный смс-код", "value":"1234"},
         ..., ]
    """
    q_string = kwargs.get('q_string', {})
    breadcrumbs = kwargs.get('breadcrumbs', [])
    result = {'errors': []}
    # -----------------------------------
    # Принудительная попытка отправки,
    # даже если не все гладко - например,
    # не все поля заполнены
    # -----------------------------------
    force_send = kwargs.get('force_send') == True
    do_not_send = kwargs.get('do_not_send') == True

    isError = None
    if not breadcrumbs:
        breadcrumbs.append({
            'name': 'Обратная связь',
            'link': '/feedback/',
        })
    if request.method == "GET":
        product = kwargs.get('product')
        q_string['recall'] = kwargs.get('recall')
        containers = {}
        context = {}
        template = kwargs.get('template', 'web/main_stat.html')
        page = SearchLink(q_string, request, containers)
        context['page'] = page
        context['q_string'] = q_string
        context['breadcrumbs'] = breadcrumbs
        context['containers'] = containers
        context['product'] = product
        return render(request, template, context)
    # -------------------
    # Дополнительные поля
    # -------------------
    fields = kwargs.get('fields', [])

    feedback_vars = feedback_form(request, q_string, fields=fields)
    for required_key in ('name', 'phone', 'msg'):
        if not required_key in feedback_vars:
            result['error'] = required_key
            isError = 1

    # ------------------------------------
    # Принудительная отправка даже
    # при незаполненных обязательных полях
    # ------------------------------------
    if force_send:
        isError = None
        if 'error' in result:
            del result['error']

    # ------------------------
    # Проверка по доп условиям
    # ------------------------
    additional_conds = kwargs.get('additional_conds', [])
    for acond in additional_conds:
        v = request.POST.get(acond['name'])
        if not v == acond['value']:
            result['errors'].append(acond['error'])
            result['error'] = acond['name']
            isError = 1

    if not isError:
        result['success'] = 1
        title = kwargs.get('title')
        if title:
            feedback_vars['title'] = title

        fv = kwargs.get('fv', [])
        for item in fv:
            feedback_vars['result'] += item

        logger.info('\n[--- SENDING EMAIL ---]' +
                    '\n[TITLE]:%s' % feedback_vars['title'] +
                    '\n[MSG]: %s' % feedback_vars['result'] +
                    '\n[SENDER]: %s' % feedback_vars['sender'] +
                    '\n[EMAILS]: %s' % feedback_vars['emails'] +
                    '\n[---------------------]')

        mail = EmailMessage(feedback_vars['title'], feedback_vars['result'],
                            feedback_vars['sender'], feedback_vars['emails'])
        mail.content_subtype = 'html'
        if feedback_vars['file']:
            mail.attach(feedback_vars['file']['name'],
                        feedback_vars['file']['content'],
                        feedback_vars['file']['content_type'])
        if not do_not_send:
            try:
                mail.send()
            except Exception as e:
                result['error'] = str(e)
        else:
            logger.info(json_pretty_print(feedback_vars))
    # ---------------------------
    # Не возвращаем  HttpResponse
    # ---------------------------
    if kwargs.get('dummy'):
        return {'feedback_vars': feedback_vars, 'result': result}

    return JsonResponse(result, safe=False)
Exemple #25
0
 def handle(self, *args, **options):
     """Тестирование получения курса валют с центробанка"""
     date = None
     if options.get('date'):
         date = options['date']
     print(json_pretty_print(get_currency_cbr(date)))
Exemple #26
0
 def demo_explain():
     """Пример, как вывести параметры для
        тела документа,
        которые передаем в метод"""
     elements = get_elements()
     print(json_pretty_print(parse_elements(elements)))