• Как вычислить время на обработку диском запросов?

    @javedimka
    Хочу сока
    В заголовке одно, в вопросе другое, в комментах совсем иное. Не ну там все Хорошо?

    Делай свой веб-сервис, на компьютере в автозагрузку самым последним пунктом добавляй свой скрипт, который дёрнет твой веб сервис и скажет что все приложения запустились
    Ответ написан
  • Python и чтение из excel с записью в mysql как ускорить?

    @javedimka
    Хочу сока
    Преобразовать xlsx в csv, импортировать в mysql. Держи, ускорил, даже питон не нужен.
    Ответ написан
  • Как открыть все json файлы в директории?

    @javedimka
    Хочу сока
    Не ну ты че серьезно?
    posts_json = []
    for Posts in glob.glob('/mnt/f/data/*'):
        with open(Posts) as f:
            posts_json.append({'Post': json.load(f)})
    return jsonify(posts_json)
    Ответ написан
    1 комментарий
  • Используете ли вы annotations в Python?

    @javedimka
    Хочу сока
    Да, потому что сложно помнить все аттрибуты на твоих классах. А когда пишешь анотацию - IDE сама все подсветит и даст подсказки.
    Ответ написан
    3 комментария
  • Какие отличия классов VkBotEventType и VkEventType; VkBotLongPoll и VkLongPoll для бота вк?

    @javedimka
    Хочу сока
    То что с Bot в имени используется при работе с https://vk.com/dev/bots_longpoll
    Тот что без, используется при работе с https://vk.com/dev/using_longpoll
    Ответ написан
    Комментировать
  • DRF что по ViewSet?

    @javedimka
    Хочу сока
    Использовать нужно то, что соответствует твоим потребностям. Нужна самая простая и обычная функциональность - используй вью сет. Нужно что-то посложнее - используй то, что лежит на уровне ниже.
    Ответ написан
    Комментировать
  • Как вывести дерево категорий на Django?

    @javedimka
    Хочу сока
    Когда-то давно я сделал так. Получив удовлетворение я скачал django-mptt и переделал на mptt

    # Example model
    class Category(models.Model):
        parent = models.ForeignKey('Category',
                                   on_delete=models.CASCADE,
                                   verbose_name=_('Parent'),
                                   related_name='children',
                                   blank=True,
                                   null=True)
        title = models.CharField(_('Title'), max_length=64, unique=True)
        slug = models.SlugField(max_length=50)
        objects = CategoryManager()
    
        
    # Manager with method to build tree using directed graph
    class CategoryManager(models.Manager):
    
        def _traverse(self, hierarchy, graph, items):
            for item in items:
                hierarchy.append(item)
                hierarchy.append(self._traverse([], graph, graph[item.title]))
            return hierarchy
    
        def as_tree(self):
            """Returns FK hierarchy in form of nested lists."""
    
            qs = super().get_queryset().exclude(
                title='Unassigned'
            ).select_related('parent')
    
            roots = []
            children = []
            for item in qs:
                roots.append(item) if item.parent is None else children.append(item)
    
            graph = {item.title: set() for item in qs}
    
            sorted_children = sorted(children, key=lambda x: x.parent.title)
            grouped = groupby(children, key=lambda x: x.parent.title)
    
            for title, group in grouped:
                graph[title].update(group)
    
            return self._traverse([], graph, roots)
        
    
    # To render in template in form of simple nested unordered list use built-in filter:
    # https://docs.djangoproject.com/en/dev/ref/templates/builtins/#unordered-list
    
    {{ tree|unordered_lsit }}
    Ответ написан
    Комментировать
  • Почему python не видит {} в имени ключа реестра?

    @javedimka
    Хочу сока
    Потому что питон х32, а система x64:
    https://docs.python.org/3/library/winreg.html#bit-...
    https://docs.microsoft.com/ru-ru/windows/win32/win...
    import winreg
    winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, 'SOFTWARE\Microsoft\Windows\CurrentVersion\\Uninstall\{F57F0CBD-3260-4021-83E6-CA2224672634$}', 0, (winreg.KEY_WOW64_64KEY + winreg.KEY_READ))
    Ответ написан
  • Запуск тестов с опции командной строки?

    @javedimka
    Хочу сока
    import pytest
    
    @pytest.fixture()
    def fixture1():
        print "Fixture 1"
    
    @pytest.fixture()
    def fixture2():
       print "Fixture 2"

    В pytest_addoption в опциональных аргументах default убрать кавычки вокруг None и использовать
    Маркер skipif:
    import pytest
    
    def skip_non_matching_url(option):
        return pytest.mark.skipif(
            not getattr(pytest.config.option, option, None),
            reason="Url doesn't match command line option"
        )
    
    @skip_non_matching_url("url2")
    def test_my_url2(fixture2):
        print "Test my url2"
    
    @skip_non_matching_url("url1")
    def test_my_url1(fixture1):
        print "Test my ulr1"


    $ python -m pytest -vs --url1 ya.ru
    
    collected 2 items
    
    test_something.py::test_my_url2 SKIPPED
    test_something.py::test_my_url1 Fixture 1
    Test my ulr1
    PASSED
    
    
    $ python -m pytest -vs --url2 ya.ru
    
    collected 2 items
    
    test_something.py::test_my_url2 Fixture 2
    Test my url2
    PASSED
    test_something.py::test_my_url1 SKIPPED


    Или кастомные маркеры:

    import pytest
    
    @pytest.mark.url2
    def test_my_url2(fixture2):
        print "Test my url2"
    
    @pytest.mark.url1
    def test_my_url1(fixture1):
        print "Test my ulr1"


    $ python -m pytest -vs -m url2
    
    collected 2 items
    
    test_something.py::test_my_url2 Fixture 2
    Test my url2
    PASSED
    
    
    $ python -m pytest -vs -m url1
    
    collected 2 items
    
    test_something.py::test_my_url1 Fixture 1
    Test my ulr1
    PASSED
    Ответ написан
    2 комментария
  • Как так рисуют, что за техника, подход?

    @javedimka
    Хочу сока
    Вообще это еще инопланетяне в древнем Египте
    придумали:
    Plate-4.jpgPlate-7.jpg

    Ну а вообще гуглится, много чего люди написали по теме:
    https://graphicdesign.stackexchange.com/questions/...
    выдержка
    if TL;DR > It's called Grid Based Design.

    Да и вообще сам так делал когда руками программы на лазерный станок писал, каждый изгиб приходилось подгонять кругами, чтобы меньше движений лазер делал, а делалось это просто, берешь инструмент круг и максимально ровно прикладываешь на изображение. Тут же почти тоже самое
    Ответ написан
    1 комментарий
  • Как сделать так что бот реагировал только на текст?

    @javedimka
    Хочу сока
    У строк есть метод .isalpha() который возвращает True если в строке все символы являются символами алфавита и в строке есть хотя бы один символ.
    ''.isalpha()  # False
    '  '.isalpha()  # False
    '!@#'.isalpha()  # False
    'abc'.isalpha()  # True
    '123'.isalpha()  # False
    'abc123'.isalpha()  # False
    'абв'.isalpha()  # True
    'абв123'.isalpha()  # False

    Советую перейти по ссылке и посмотреть на другие, такие же замечательные, методы строк.
    Ответ написан
    Комментировать
  • Перевести символ после дефиса в верхний регистр?

    @javedimka
    Хочу сока
    По ссылке я конечно же переходить не буду, но:
    'санкт-петербург'.title()
    Ответ написан
    1 комментарий
  • Как сделать перестановки с заменой в python?

    @javedimka
    Хочу сока
    def my_comb(pattern, r):
        comb_list = combinations(pattern, r)
        for c in comb_list:
            yield ''.join(x if x in c else '-' for x in pattern)

    >>> list(my_comb('ABC', 2))
    ['AB-', 'A-C', '-BC']
    >>> list(my_comb('ABCDE', 3))
    ['ABC--', 'AB-D-', 'AB--E', 'A-CD-', 'A-C-E', 'A--DE', '-BCD-', '-BC-E', '-B-DE', '--CDE']
    Ответ написан
    1 комментарий
  • Как извлечь текст находящийся между тегами?

    @javedimka
    Хочу сока
    lxml
    >>> import lxml.etree
    >>> doc = """
    ... <?xml version="1.0" encoding="ANSI" ?>
    ... <data>
    ...      <items>
    ...          <item name="item1">1</item>
    ...          <item name="item2">2</item>
    ...          <item name="item3">3</item>
    ...          <item name="item4">4</item>
    ...      </items>
    ... </data>
    ... .----------------------------------------------------------
    ... """
    >>> parser = lxml.etree.XMLParser(recover=True)
    >>> tree = lxml.etree.fromstring(doc, parser)
    >>> [element.text for element in tree.iter('item')]
    ['1', '2', '3', '4']

    Без lxml можно так:
    >>> import xml.etree.ElementTree as ET
    >>> doc = """
    ... <?xml version="1.0" encoding="ANSI" ?>
    ... <data>
    ...      <items>
    ...          <item name="item1">1</item>
    ...          <item name="item2">2</item>
    ...          <item name="item3">3</item>
    ...          <item name="item4">4</item>
    ...      </items>
    ... </data>
    ... .----------------------------------------------------------
    ... """
    >>> tree = ET.fromstring(doc.strip('\n-.'))
    >>> [element.text for element in tree.iter('item')]
    ['1', '2', '3', '4']
    Ответ написан
    5 комментариев
  • Как исправить ошибку при записи в БД (связанные таблицы)?

    @javedimka
    Хочу сока
    К сожалению не помогло, ошибка та же:

    Вариант раз, подходит для вложенных сериалайзеров

    Пишешь два сериалайзера, один для GET, с твоим, расширенным представлением для связанного Place, другой для POST/PUT с стандартной реализацией которая сериализует связанный объект как его id, потом во вью возвращаешь либо первый либо второй, т.е.:

    class EventGETSerializer(serializers.ModelSerializer):
        place = PlaceSerializer(read_only=True)
        class Meta:
            model = Event
            fields = ('id', 'title', 'description', 'price', 'place', 'link', 'date', 'time')
    
    class EventSerializer(serializers.ModelSerializer):
        class Meta:
            model = Event
            fields = ('id', 'title', 'description', 'price', 'place', 'link', 'date', 'time')

    В вью переопределяешь get_serializer_class метод:
    from rest_framework import permissions
    
    
    class EventList(generics.ListCreateAPIView):
        queryset = Event.objects.all()
    
        def get_serializer_class(self):
            if self.request.method in permissions.SAFE_METHODS:
                return EventGETSerializer
            else:
                return EventSerializer



    update:
    Вариант два, странно работает, но не нарушает принципов DRY и возможно подходит если устраивает стандартное представление данных с depth=1

    Развивая тему с depth, решил попробовать:
    Без блока else не корректно себя ведет, не знаю почему.
    Необходимо использовать дженерики/вьюсеты или самому передавать объект запроса в сериалайзер.
    from rest_framework.permissions import SAFE_METHODS
    
    
    class EventSerializer(serializers.ModelSerializer):
    
        def __init__(self, *args, **kwargs):
            request = kwargs.get('context', {}).get('request')
            if request is not None and request.method not in SAFE_METHODS:
                self.Meta.depth = 0
            else:
                self.Meta.depth = 1
            super().__init__(*args, **kwargs)
    
        class Meta:
            model = Event
            fields = ('id', 'title', 'description', 'price', 'place', 'link',
                      'date', 'time')

    Ответ написан
    1 комментарий
  • Django: как установить запрет на удаление объекта через админку?

    @javedimka
    Хочу сока
    к тому же delete_model как и save нельзя использовать для блокирования удаления объекта, только для добавления действий до и после удаления.

    Это абсолютно не верно. Модель будет удалена если при переопределении этого метода явно вызвать super().delete_model(request, obj), иначе - нет.
    Можно сделать так чтобы messages framework не захватывал стандартное сообщение об успешном удалении которое посылается админкой с промежуточной страницы и добавить свое:

    from django.contrib import messages
    
    
    def delete_model(self, request, obj):
        """Если какая-то проверка успешна - удалить объект, если нет, то показать сообщение об ошибке."""
        if check_permission(obj):
            return super().delete_model(request, obj)
        # При следующем запросе захватываем только ошибки.
        # Так после нажатия на кнопку удаления не будет захвачено ложное сообщение
        # об успешном удалении.
        messages.set_level(request, messages.ERROR)
        message = "You cant delete this!"
        # Посылаем свое сообщение об ошибке.
        self.message_user(request, message, level=messages.ERROR)


    Ну еще сделать что-то с логированием, потому что "удаление" все равно попадет в "недавние действия" на главной странице админки, хоть объект и не был удален.
    Ответ написан
  • Проблема в DRF при работе с dynamically modifying fields. Что можно сделать?

    @javedimka
    Хочу сока
    Оригинальный ответ
    from rest_framework.response import Response
    
    
    class TrainingDetailAPIView(RetrieveAPIView):
        queryset = Training.objects.all()
        serializer_class = TrainingSerializer
        lookup_field = 'slug'
        
        def retrieve(self, request, *args, **kwargs):
            instance = self.get_object()
            serializer = self.get_serializer(instance, fields=('title', 'description'))
            return Response(serializer.data)

    При работе с drf рекомендую на отдельной вкладке держать открытым гитхаб с сорцами.

    UPD:
    Оригинальное решение хоть и работает, но слегка кривоватое(первое что пришло в голову), правильнее будет переписать метод get_serializer():
    class TrainingDetailAPIView(RetrieveAPIView):
        queryset = Training.objects.all()
        serializer_class = TrainingSerializer
        lookup_field = 'slug'
        
        def get_serializer(self, *args, **kwargs):
            kwargs['fields'] = ('title', 'description')
            return super().get_serializer(*args, **kwargs)

    Меньше кода и не происходит его дупликации как в первом варианте при переписывании метода из retrieve миксина.
    Если такая вью не единственная, то следует пойти дальше и написать свой миксин:
    class ShowFieldsMixin:
    
        def get_serializer(self, *args, **kwargs):
            if getattr(self, 'fields_to_show', None) is not None:
                kwargs['fields'] = self.fields_to_show
            return super().get_serializer(*args, **kwargs)
    
    
    class TrainingDetailAPIView(ShowFieldsMixin, RetrieveAPIView):
        queryset = Training.objects.all()
        serializer_class = TrainingSerializer
        lookup_field = 'slug'
        fields_to_show = ('title', 'description')
    
    class TrainingListAPIView(ShowFieldsMixin, ListAPIView):
        # bla-bla-bla
        serializer_class = TrainingSerializer
        fields_to_show = ('name', 'description', 'url', 'slug')
    Ответ написан
    3 комментария
  • Как вывести таблицу в *.html?

    @javedimka
    Хочу сока
    Подготовить данные во вьюхе чтобы с ними было удобно работать в темплейте, я вот не понимаю зачем и список, и словарь когда можно сделать вложенный список типо такого:
    table = [
        ['header1', 'header2', 'header3', 'header4'],
        ['value1.1', 'value2.1', 'value3.1', 'value4.1'],
        ['value1.2', 'value2.2', 'value3.2', 'value4.2']
    ]


    C моделью даже подготавливать почти ничего не нужно:
    table = [('header1', 'header2', 'header3', 'header4')]
    table += Model.objects.all().values_list('value1', 'value2', 'value3', 'value4')
    context['table'] = table


    А потом в темплейте:
    <table>
    {% for v1, v2, v3, v4 in table %}
        {% if forloop.first %}
            <tr>
                <th>{{ v1 }}</th>
                <th>{{ v2 }}</th>
                <th>{{ v3 }}</th>
                <th>{{ v4 }}</th>
            </tr>
        {% else %}
            <tr>
                <td>{{ v1 }}</td>
                <td>{{ v2 }}</td>
                <td>{{ v3 }}</td>
                <td>{{ v4 }}</td>
            </tr>
        {% endif %}
    {% endfor %}
    </table>
    Ответ написан
  • Как реальные данные подставить в google chart?

    @javedimka
    Хочу сока
    Нужно передать аргументы в функцию
    function drawChart(chartData, lineChartId) {
    
            var data = new google.visualization.DataTable();
            data.addColumn('date', 'Time of Day');
            data.addColumn('number', 'KWR');
            data.addColumn('number', 'BSR');
    
            data.addRows(chartData);
    
    
            var options = {
                colors: ['#000000','#ff9000'],
                hAxis: {
                    format: 'M/d/yy',
                    gridlines: {count: 10}
                },
                vAxis: {
                    direction: -1
                }
            };
    
            var chart = new google.visualization.LineChart(document.getElementById(lineChartId));
    
            chart.draw(data, options);
        }
    Ответ написан
    Комментировать
  • Как проще разпарсить email на Python?

    @javedimka
    Хочу сока
    Гуглится по запросу “Python poplib Unicode”:
    >>> from email.header import decode_header
    >>> s = '=?UTF-8?B?0KHQsdC10YDQsdCw0L3QuiDQntC90LvQsNC50L0uINCe0LTQvdC+0YDQsNC3?='
    >>> bytes, encoding = decode_header(s)[0]
    >>> bytes.decode(encoding)
    'Сбербанк Онлайн. Однораз'

    https://stackoverflow.com/questions/12527655/how-t...
    Ответ написан
    1 комментарий