From ec1bbef20c14fbc786ff02e51b84068e3c97e8cd Mon Sep 17 00:00:00 2001 From: Vitaly Bogomolov Date: Tue, 20 Feb 2024 21:36:50 +0400 Subject: [PATCH] Fix codacy issues (#17) * counts coverage in django5 --- .github/workflows/django3.yml | 3 -- .github/workflows/django5.yml | 3 ++ README.md | 76 +++++++++++++++++++---------------- READMEru.md | 75 ++++++++++++++++++---------------- 4 files changed, 86 insertions(+), 71 deletions(-) diff --git a/.github/workflows/django3.yml b/.github/workflows/django3.yml index ae9f960..ba5a237 100644 --- a/.github/workflows/django3.yml +++ b/.github/workflows/django3.yml @@ -49,6 +49,3 @@ jobs: python manage.py makemigrations --settings example.settings example python manage.py migrate --settings example.settings pytest -c pytest3.ini --cov=django_admin_filters --cov-report xml --cov-report term:skip-covered --durations=5 tests - if [ "$CODACY_PROJECT_TOKEN" != "" ]; then - python-codacy-coverage -r coverage.xml - fi diff --git a/.github/workflows/django5.yml b/.github/workflows/django5.yml index f557483..56d11cd 100644 --- a/.github/workflows/django5.yml +++ b/.github/workflows/django5.yml @@ -47,3 +47,6 @@ jobs: python manage.py makemigrations --settings example.settings example python manage.py migrate --settings example.settings pytest -c pytest5.ini --cov=django_admin_filters --cov-report xml --cov-report term:skip-covered --durations=5 tests + if [ "$CODACY_PROJECT_TOKEN" != "" ]; then + python-codacy-coverage -r coverage.xml + fi diff --git a/README.md b/README.md index 2f04b86..7f0db87 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # DjangoAdminFilters library + [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/vb64/django.admin.filters/pep257.yml?label=Pep257&style=plastic&branch=main)](https://github.com/vb64/django.admin.filters/actions?query=workflow%3Apep257) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/vb64/django.admin.filters/django3.yml?label=Django%203.2.23%20Python%203.7-3.10&style=plastic&branch=main)](https://github.com/vb64/django.admin.filters/actions?query=workflow%3Adjango3) [![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/vb64/django.admin.filters/django4.yml?label=Django%204.2.8%20Python%203.8-3.11&style=plastic&branch=main)](https://github.com/vb64/django.admin.filters/actions?query=workflow%3Adjango4) @@ -11,10 +12,10 @@ The free, open-source DjangoAdminFilters library is designed to filter objects in the Django admin site. The library provide few filters for this purpose. -- `MultiChoice`: multi choice selection with checkboxes for CharField and IntegerField fields with 'choices' option -- `MultiChoiceExt`: another version of previous filter, that allows filtering by custom defined properties -- `DateRange`: set a custom date range using `input` fields -- `DateRangePicker`: set a custom date range using javascript widget for select datetime from calendar +- `MultiChoice`: multi choice selection with checkboxes for CharField and IntegerField fields with 'choices' option +- `MultiChoiceExt`: another version of previous filter, that allows filtering by custom defined properties +- `DateRange`: set a custom date range using `input` fields +- `DateRangePicker`: set a custom date range using javascript widget for select datetime from calendar MultiChoice and MultiChoiceExt | DateRange | DateRangePicker :------:|:-----:|:----: @@ -52,6 +53,7 @@ Let's say we have a table in the database. The records contain follows fields. ```python # models.py + from django.db import models STATUS_CHOICES = ( @@ -86,8 +88,8 @@ class MyChoicesFilter(MultiChoice): BUTTON_LABEL = "Apply" ``` -- FILTER_LABEL: Filter title -- BUTTON_LABEL: Title for filter apply button +- FILTER_LABEL: Filter title +- BUTTON_LABEL: Title for filter apply button ## MultiChoice filter @@ -98,6 +100,7 @@ To use MultiChoice filter, you need to specify them in the `admin.py` file in th ```python # admin.py + from django.contrib import admin from django_admin_filters import MultiChoice from .models import Log @@ -129,12 +132,13 @@ For example, in the `Log` model of the source data, there are three boolean fiel For this model, we define the `color` property as follows. -- The `color` property has the value 'red' if the field `is_online == False`. -- If `is_online == True` and both `is_trouble1` and `is_trouble1` fields are False, then the value of the property is 'green'. -- If `is_online == True` and at least one of the fields `is_trouble1` and `is_trouble1` is True, then the property has the value 'yellow'. +- The `color` property has the value 'red' if the field `is_online == False`. +- If `is_online == True` and both `is_trouble1` and `is_trouble1` fields are False, then the value of the property is 'green'. +- If `is_online == True` and at least one of the fields `is_trouble1` and `is_trouble1` is True, then the property has the value 'yellow'. ```python # models.py + @property def color(self): status = 'red' @@ -151,9 +155,9 @@ In the `options` attribute, you need to specify a list of checkboxes that will b Each element of the list consists of three values. -- a unique string to be used in the GET request parameter -- checkbox label -- filtering expression applied to the DB model in the form of [Django Q-objects](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects) +- a unique string to be used in the GET request parameter +- checkbox label +- filtering expression applied to the DB model in the form of [Django Q-objects](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects) In the `parameter_name` attribute, you need to specify the name of the GET request parameter for sending filter data. @@ -161,6 +165,7 @@ For our example, the code will look like this. ```python # admin.py + from django.db.models import Q from django_admin_filters import MultiChoiceExt @@ -188,6 +193,7 @@ To use filters with a date interval, you need to specify them in the `admin.py` ```python # admin.py + from django.contrib import admin from django_admin_filters import DateRange, DateRangePicker from .models import Log @@ -203,6 +209,7 @@ admin.site.register(Log, Admin) ```python # admin.py + from django_admin_filters import DateRange class MyDateRange(DateRange): @@ -225,13 +232,13 @@ class MyDateRange(DateRange): You can override the following attributes. -- `FROM_LABEL`: The label of the start date field. -- `TO_LABEL`: The label of the end date field. -- `ALL_LABEL`: The label of the menu item for displaying all records. -- `CUSTOM_LABEL`: The label of the menu item when date range is set. -- `NULL_LABEL`: The label of the menu item for displaying records without date. -- `is_null_option`: Set this attribute to `False` to remove the option to display record without date from the filter menu. -- `DATE_FORMAT`: Hint about the format of the date and time fields. +- `FROM_LABEL`: The label of the start date field. +- `TO_LABEL`: The label of the end date field. +- `ALL_LABEL`: The label of the menu item for displaying all records. +- `CUSTOM_LABEL`: The label of the menu item when date range is set. +- `NULL_LABEL`: The label of the menu item for displaying records without date. +- `is_null_option`: Set this attribute to `False` to remove the option to display record without date from the filter menu. +- `DATE_FORMAT`: Hint about the format of the date and time fields. You can change the date/time input format to your own. However, you may need to override the `to_dtime` method as well. @@ -250,9 +257,9 @@ def to_dtime(text): The `options` attribute specifies filter menu items that allow you to select data from the current moment to an offset of a specified number of seconds in the past or future. Each element of the `options` list contains three values. -- A unique string to use in the GET request parameters. Except for the strings 'custom' and 'empty' which are used by the filter. -- The title of the item in the filter menu. -- Offset in seconds relative to the current moment. A negative value specifies an offset to the past. +- A unique string to use in the GET request parameters. Except for the strings 'custom' and 'empty' which are used by the filter. +- The title of the item in the filter menu. +- Offset in seconds relative to the current moment. A negative value specifies an offset to the past. ### Customization for DateRangePicker filter @@ -261,6 +268,7 @@ Also, additional attributes can be overridden in `DateRangePicker`. ```python # admin.py + from django_admin_filters import DateRangePicker class MyDateRangePicker(DateRangePicker): @@ -277,15 +285,15 @@ class MyDateRangePicker(DateRangePicker): WIDGET_END_LEFT = -400 ``` -- WIDGET_LOCALE: The language code for display the names of the months and days of the week. By default is the value of the `LANGUAGE_CODE` item in your project's `settings.py` file. -- WIDGET_BUTTON_LABEL: The label of the select button. -- WIDGET_WITH_TIME: Set this attribute to `False` if you only want to select a date without a time. -- WIDGET_START_TITLE: The title of the widget when selecting the start date of the interval. -- WIDGET_START_TOP: The vertical offset of the widget's calendar window when selecting the start date of the interval. -- WIDGET_START_LEFT: The horizontal offset of the widget's calendar window when selecting the start date of the interval. -- WIDGET_END_TITLE: The title of the widget when selecting the end date of the interval. -- WIDGET_END_TOP: The vertical offset of the widget's calendar window when selecting the end date of the interval. -- WIDGET_END_LEFT: The horizontal offset of the widget's calendar window when selecting the end date of the interval. +- WIDGET_LOCALE: The language code for display the names of the months and days of the week. By default is the value of the `LANGUAGE_CODE` item in your project's `settings.py` file. +- WIDGET_BUTTON_LABEL: The label of the select button. +- WIDGET_WITH_TIME: Set this attribute to `False` if you only want to select a date without a time. +- WIDGET_START_TITLE: The title of the widget when selecting the start date of the interval. +- WIDGET_START_TOP: The vertical offset of the widget's calendar window when selecting the start date of the interval. +- WIDGET_START_LEFT: The horizontal offset of the widget's calendar window when selecting the start date of the interval. +- WIDGET_END_TITLE: The title of the widget when selecting the end date of the interval. +- WIDGET_END_TOP: The vertical offset of the widget's calendar window when selecting the end date of the interval. +- WIDGET_END_LEFT: The horizontal offset of the widget's calendar window when selecting the end date of the interval. ## Usage example @@ -293,9 +301,9 @@ You can run an example of using the library on your local host. On the Windows platform, you must first install the following programs. -- [Python3](https://www.python.org/downloads/release/python-3712/) -- GNU [Unix Utils](http://unxutils.sourceforge.net/) for operations via makefile -- [Git for Windows](https://git-scm.com/download/win) to access the source code repository. +- [Python3](https://www.python.org/downloads/release/python-3712/) +- GNU [Unix Utils](http://unxutils.sourceforge.net/) for operations via makefile +- [Git for Windows](https://git-scm.com/download/win) to access the source code repository. Then clone the repository and run the installation, specifying the path to Python 3. diff --git a/READMEru.md b/READMEru.md index 5c33561..ac53de3 100644 --- a/READMEru.md +++ b/READMEru.md @@ -4,10 +4,10 @@ Бесплатная, с открытым исходным кодом библиотека DjangoAdminFilters позволяет использовать несколько дополнительных фильтров в таблицах админки Django. -- `MultiChoice`: множественный выбор с чекбоксами для полей типа CharField и IntegerField, имеющих опцию 'choices' -- `MultiChoiceExt`: другая версия предыдущего фильтра, который позволяет фильтровать по заданным пользователем свойствам -- `DateRange`: позволяет задавать пользовательский интервал дат с использованием полей `input` -- `DateRangePicker`: позволяет задавать пользовательский интервал дат с использованием javascript виджета выбора даты/времени из календаря +- `MultiChoice`: множественный выбор с чекбоксами для полей типа CharField и IntegerField, имеющих опцию 'choices' +- `MultiChoiceExt`: другая версия предыдущего фильтра, который позволяет фильтровать по заданным пользователем свойствам +- `DateRange`: позволяет задавать пользовательский интервал дат с использованием полей `input` +- `DateRangePicker`: позволяет задавать пользовательский интервал дат с использованием javascript виджета выбора даты/времени из календаря MultiChoice и MultiChoiceExt | DateRange | DateRangePicker :------------:|:-------------:|:------------: @@ -45,6 +45,7 @@ manage.py collectstatic ```python # models.py + from django.db import models STATUS_CHOICES = ( @@ -79,8 +80,8 @@ class MyChoicesFilter(MultiChoice): BUTTON_LABEL = "Применить" ``` -- FILTER_LABEL: Заголовок фильтра -- BUTTON_LABEL: Заголовок кнопки применения фильтра +- FILTER_LABEL: Заголовок фильтра +- BUTTON_LABEL: Заголовок кнопки применения фильтра ## Фильтр MultiChoice @@ -91,6 +92,7 @@ class MyChoicesFilter(MultiChoice): ```python # admin.py + from django.contrib import admin from django_admin_filters import MultiChoice from .models import Log @@ -123,12 +125,13 @@ admin.site.register(Log, Admin) Для этой модели мы определяем свойство `color` следующим образом. -- Свойство `color` имеет значение 'red', если поле `is_online == False`. -- Если `is_online == True` и оба поля `is_trouble1` и `is_trouble1` имеют значение False, то свойство имеет значение 'green'. -- Если `is_online == True` и хотя бы одно из полей `is_trouble1` и `is_trouble1` имеет значение True, то свойство имеет значение 'yellow'. +- Свойство `color` имеет значение 'red', если поле `is_online == False`. +- Если `is_online == True` и оба поля `is_trouble1` и `is_trouble1` имеют значение False, то свойство имеет значение 'green'. +- Если `is_online == True` и хотя бы одно из полей `is_trouble1` и `is_trouble1` имеет значение True, то свойство имеет значение 'yellow'. ```python # models.py + @property def color(self): status = 'red' @@ -145,9 +148,9 @@ admin.site.register(Log, Admin) Каждый элемент списка состоит из трех значений. -- уникальная строка, которая будет использоваться в параметре GET-запроса -- текст у чекбокса -- применяемое к таблице модели в БД выражение фильтрации в виде [Q-объектов Django](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects) +- уникальная строка, которая будет использоваться в параметре GET-запроса +- текст у чекбокса +- применяемое к таблице модели в БД выражение фильтрации в виде [Q-объектов Django](https://docs.djangoproject.com/en/dev/topics/db/queries/#complex-lookups-with-q-objects) В атрибуте `parameter_name` нужно указать имя параметра GET-запроса, в котором будут передаваться данные фильтра. @@ -155,6 +158,7 @@ admin.site.register(Log, Admin) ```python # admin.py + from django.db.models import Q from django_admin_filters import MultiChoiceExt @@ -182,6 +186,7 @@ admin.site.register(Log, Admin) ```python # admin.py + from django.contrib import admin from django_admin_filters import DateRange, DateRangePicker from .models import Log @@ -197,6 +202,7 @@ admin.site.register(Log, Admin) ```python # admin.py + from django_admin_filters import DateRange class MyDateRange(DateRange): @@ -219,13 +225,13 @@ class MyDateRange(DateRange): Можно переопределять следующие атрибуты. -- `FROM_LABEL`: Текст у поля начальной даты. -- `TO_LABEL`: Текст у поля конечной даты. -- `ALL_LABEL`: Текст пункта меню фильтра для отображения всех записей. -- `CUSTOM_LABEL`: Текст пункта меню фильтра при использовании интервала дат. -- `NULL_LABEL`: Текст пункта меню фильтра для отображения записей без даты. -- `is_null_option`: Установите этот атрибут в `False`, чтобы убрать из меню фильтра пункт отображения записей без даты. -- `DATE_FORMAT`: Текст подсказки о формате полей даты и времени. +- `FROM_LABEL`: Текст у поля начальной даты. +- `TO_LABEL`: Текст у поля конечной даты. +- `ALL_LABEL`: Текст пункта меню фильтра для отображения всех записей. +- `CUSTOM_LABEL`: Текст пункта меню фильтра при использовании интервала дат. +- `NULL_LABEL`: Текст пункта меню фильтра для отображения записей без даты. +- `is_null_option`: Установите этот атрибут в `False`, чтобы убрать из меню фильтра пункт отображения записей без даты. +- `DATE_FORMAT`: Текст подсказки о формате полей даты и времени. Вы можете изменить формат ввода даты/времени на собственный. Но при этом вам возможно будет необходимо также переопределить метод `to_dtime`. @@ -244,9 +250,9 @@ def to_dtime(text): Атрибут `options` задает пункты меню фильтра, позволяющие выбирать данные от текущего момента до смещения на заданное количество секунд в прошлом либо будущем. Каждый элемент списка `options` содержит три значения. -- Уникальная строка для использования в параметрах GET запроса. Кроме строк 'custom' и 'empty', которые используются фильтром. -- Заголовок пункта в меню фильтра. -- Смещение в секундах относительно текущего момента. Отрицательное значение задает смещение в прошлое. +- Уникальная строка для использования в параметрах GET запроса. Кроме строк 'custom' и 'empty', которые используются фильтром. +- Заголовок пункта в меню фильтра. +- Смещение в секундах относительно текущего момента. Отрицательное значение задает смещение в прошлое. ## Настройка фильтра DateRangePicker @@ -255,6 +261,7 @@ def to_dtime(text): ```python # admin.py + from django_admin_filters import DateRangePicker class MyDateRangePicker(DateRangePicker): @@ -271,15 +278,15 @@ class MyDateRangePicker(DateRangePicker): WIDGET_END_LEFT = -400 ``` -- WIDGET_LOCALE: Код языка, на котором виджет будет отображать названия месяцев и дней недели. По умолчанию используется значение параметра `LANGUAGE_CODE` файла `settings.py` вашего проекта. -- WIDGET_BUTTON_LABEL: Текст кнопки выбора виджета. -- WIDGET_WITH_TIME: Установите значение этого атрибута в `False`, если вам требуется только выбор даты без времени. -- WIDGET_START_TITLE: Заголовок виджета при выборе начальной даты интервала. -- WIDGET_START_TOP: Смещение по вертикали окна календаря виджета при выборе начальной даты интервала. -- WIDGET_START_LEFT: Смещение по горизонтали окна календаря виджета при выборе начальной даты интервала. -- WIDGET_END_TITLE: Заголовок виджета при выборе конечной даты интервала. -- WIDGET_END_TOP: Смещение по вертикали окна календаря виджета при выборе конечной даты интервала. -- WIDGET_END_LEFT: Смещение по горизонтали окна календаря виджета при выборе конечной даты интервала. +- WIDGET_LOCALE: Код языка, на котором виджет будет отображать названия месяцев и дней недели. По умолчанию используется значение параметра `LANGUAGE_CODE` файла `settings.py` вашего проекта. +- WIDGET_BUTTON_LABEL: Текст кнопки выбора виджета. +- WIDGET_WITH_TIME: Установите значение этого атрибута в `False`, если вам требуется только выбор даты без времени. +- WIDGET_START_TITLE: Заголовок виджета при выборе начальной даты интервала. +- WIDGET_START_TOP: Смещение по вертикали окна календаря виджета при выборе начальной даты интервала. +- WIDGET_START_LEFT: Смещение по горизонтали окна календаря виджета при выборе начальной даты интервала. +- WIDGET_END_TITLE: Заголовок виджета при выборе конечной даты интервала. +- WIDGET_END_TOP: Смещение по вертикали окна календаря виджета при выборе конечной даты интервала. +- WIDGET_END_LEFT: Смещение по горизонтали окна календаря виджета при выборе конечной даты интервала. ## Пример использования @@ -287,9 +294,9 @@ class MyDateRangePicker(DateRangePicker): На платформе Windows для этого нужно предварительно установить следующие программы. -- [Python3](https://www.python.org/downloads/release/python-3712/) -- GNU [Unix Utils](http://unxutils.sourceforge.net/) для операций через makefile -- [Git for Windows](https://git-scm.com/download/win) для доступа к репозитарию исходных кодов. +- [Python3](https://www.python.org/downloads/release/python-3712/) +- GNU [Unix Utils](http://unxutils.sourceforge.net/) для операций через makefile +- [Git for Windows](https://git-scm.com/download/win) для доступа к репозитарию исходных кодов. Затем склонировать репозитарий и запустить установку, указав путь на Python 3.