Merge branch 'stable'

This commit is contained in:
jo 2023-12-18 19:22:54 +01:00
commit d2fc47941c
No known key found for this signature in database
GPG Key ID: B2FEC9B22722B984
12 changed files with 28 additions and 29 deletions

View File

@ -1,4 +1,4 @@
from .core.models import Role from .core.models.role import Role
GUEST_PERMISSIONS = [ GUEST_PERMISSIONS = [
"view_schedule", "view_schedule",

View File

@ -69,7 +69,7 @@ class Show(models.Model):
auto_playlist_enabled = models.BooleanField(db_column="has_autoplaylist") auto_playlist_enabled = models.BooleanField(db_column="has_autoplaylist")
auto_playlist_repeat = models.BooleanField(db_column="autoplaylist_repeat") auto_playlist_repeat = models.BooleanField(db_column="autoplaylist_repeat")
hosts = models.ManyToManyField( hosts = models.ManyToManyField( # type: ignore[var-annotated]
"core.User", "core.User",
through="ShowHost", through="ShowHost",
) )

View File

@ -10,6 +10,7 @@ django-settings-module = "libretime_api.settings.testing"
[tool.pylint.messages_control] [tool.pylint.messages_control]
extension-pkg-whitelist = "pydantic" extension-pkg-whitelist = "pydantic"
disable = [ disable = [
"duplicate-code",
"fixme", "fixme",
"missing-class-docstring", "missing-class-docstring",
"missing-function-docstring", "missing-function-docstring",

View File

@ -1,11 +1,11 @@
# Please do not edit this file, edit the setup.py file! # Please do not edit this file, edit the setup.py file!
# This file is auto-generated by tools/extract_requirements.py. # This file is auto-generated by tools/extract_requirements.py.
django-cors-headers>=3.14.0,<4.4 django-cors-headers>=3.14.0,<4.4
django-filter>=2.4.0,<23.4 django-filter>=2.4.0,<23.6
django>=4.2.0,<4.3 django>=4.2.0,<4.3
djangorestframework>=3.14.0,<3.15 djangorestframework>=3.14.0,<3.15
drf-spectacular>=0.22.1,<0.27 drf-spectacular>=0.22.1,<0.28
gunicorn>=20.1.0,<21.3 gunicorn>=20.1.0,<21.3
psycopg[c]>=3.1.8,<3.2 psycopg[c]>=3.1.8,<3.2
requests>=2.31.0,<2.32 requests>=2.31.0,<2.32
uvicorn[standard]>=0.17.6,<0.24.0 uvicorn[standard]>=0.17.6,<0.25.0

View File

@ -25,17 +25,17 @@ setup(
}, },
install_requires=[ install_requires=[
"django-cors-headers>=3.14.0,<4.4", "django-cors-headers>=3.14.0,<4.4",
"django-filter>=2.4.0,<23.4", "django-filter>=2.4.0,<23.6",
"django>=4.2.0,<4.3", "django>=4.2.0,<4.3",
"djangorestframework>=3.14.0,<3.15", "djangorestframework>=3.14.0,<3.15",
"drf-spectacular>=0.22.1,<0.27", "drf-spectacular>=0.22.1,<0.28",
"requests>=2.31.0,<2.32", "requests>=2.31.0,<2.32",
], ],
extras_require={ extras_require={
"prod": [ "prod": [
"gunicorn>=20.1.0,<21.3", "gunicorn>=20.1.0,<21.3",
"psycopg[c]>=3.1.8,<3.2", "psycopg[c]>=3.1.8,<3.2",
"uvicorn[standard]>=0.17.6,<0.24.0", "uvicorn[standard]>=0.17.6,<0.25.0",
], ],
"dev": [ "dev": [
"django-coverage-plugin>=3.0.0,<4", "django-coverage-plugin>=3.0.0,<4",

View File

@ -253,7 +253,7 @@ class PlaylistController extends Zend_Controller_Action
Logging::info("Currently active {$type} {$obj_sess->id}"); Logging::info("Currently active {$type} {$obj_sess->id}");
if (in_array($obj_sess->id, $ids)) { if (in_array($obj_sess->id, $ids)) {
Logging::info("Deleting currently active {$type}"); Logging::info("Deleting currently active {$type}");
// Application_Model_Library::changePlaylist(null, $type); // Application_Model_Library::changePlaylist(null, $type);
} else { } else {
Logging::info("Not deleting currently active {$type}"); Logging::info("Not deleting currently active {$type}");
$obj = new $objInfo['className']($obj_sess->id); $obj = new $objInfo['className']($obj_sess->id);
@ -562,7 +562,7 @@ class PlaylistController extends Zend_Controller_Action
$bl->saveSmartBlockCriteria($params['data']); $bl->saveSmartBlockCriteria($params['data']);
$this->createUpdateResponse($bl, true); $this->createUpdateResponse($bl, true);
$this->view->result = 0; $this->view->result = 0;
// $result['html'] = $this->createFullResponse($bl, true, true); // $result['html'] = $this->createFullResponse($bl, true, true);
} else { } else {
$this->view->form = $form; $this->view->form = $form;
$this->view->unsavedName = $params['name']; $this->view->unsavedName = $params['name'];
@ -601,7 +601,7 @@ class PlaylistController extends Zend_Controller_Action
$result = $bl->generateSmartBlock($params['data']); $result = $bl->generateSmartBlock($params['data']);
$this->view->result = $result['result']; $this->view->result = $result['result'];
$this->createUpdateResponse($bl, true); $this->createUpdateResponse($bl, true);
// $this->_helper->json->sendJson(array("result"=>0, "html"=>$this->createFullResponse($bl, true, true))); // $this->_helper->json->sendJson(array("result"=>0, "html"=>$this->createFullResponse($bl, true, true)));
} else { } else {
$this->view->obj = $bl; $this->view->obj = $bl;
$this->view->id = $bl->getId(); $this->view->id = $bl->getId();

View File

@ -69,7 +69,7 @@ class PreferenceController extends Zend_Controller_Action
$this->view->statusMsg = "<div class='success'>" . _('Preferences updated.') . '</div>'; $this->view->statusMsg = "<div class='success'>" . _('Preferences updated.') . '</div>';
$form = new Application_Form_Preferences(); $form = new Application_Form_Preferences();
$this->view->form = $form; $this->view->form = $form;
// $this->_helper->json->sendJson(array("valid"=>"true", "html"=>$this->view->render('preference/index.phtml'))); // $this->_helper->json->sendJson(array("valid"=>"true", "html"=>$this->view->render('preference/index.phtml')));
} else { } else {
$this->view->form = $form; $this->view->form = $form;
// $this->_helper->json->sendJson(array("valid"=>"false", "html"=>$this->view->render('preference/index.phtml'))); // $this->_helper->json->sendJson(array("valid"=>"false", "html"=>$this->view->render('preference/index.phtml')));

View File

@ -1652,12 +1652,12 @@ SQL;
if (isset($criteria['extra'])) { if (isset($criteria['extra'])) {
$spCriteriaExtra = $criteria['extra'] * 1000; $spCriteriaExtra = $criteria['extra'] * 1000;
} }
/* /*
* If user is searching for an exact match of length we need to * If user is searching for an exact match of length we need to
* search as if it starts with the specified length because the * search as if it starts with the specified length because the
* user only sees the rounded version (i.e. 4:02.7 is 4:02.761625 * user only sees the rounded version (i.e. 4:02.7 is 4:02.761625
* in the database) * in the database)
*/ */
} elseif (in_array($spCriteria, ['length', 'cuein', 'cueout']) && $spCriteriaModifier == 'is') { } elseif (in_array($spCriteria, ['length', 'cuein', 'cueout']) && $spCriteriaModifier == 'is') {
$spCriteriaModifier = 'starts with'; $spCriteriaModifier = 'starts with';
$spCriteria .= '::text'; $spCriteria .= '::text';

View File

@ -63,8 +63,10 @@ class Application_Model_Preference
$paramMap = []; $paramMap = [];
if ($result > 1) { if ($result > 1) {
// this case should not happen. // this case should not happen.
$caller = debug_backtrace()[1]['function'];
throw new Exception('Invalid number of results returned. Should be ' . throw new Exception('Invalid number of results returned. Should be ' .
"0 or 1, but is '{$result}' instead"); "0 or 1, but is '{$result}' instead, caller={$caller}");
} }
if ($result == 1) { if ($result == 1) {
// result found // result found

View File

@ -595,7 +595,7 @@ SQL;
$this->deleteAllInstances($showId); $this->deleteAllInstances($showId);
$this->deleteAllShowDays($showId); $this->deleteAllShowDays($showId);
// when repeating by day of the month (1st, 2nd, etc.) we do not store the repeat week days // when repeating by day of the month (1st, 2nd, etc.) we do not store the repeat week days
} elseif ($currentRepeatType != 2) { } elseif ($currentRepeatType != 2) {
// repeat type is the same, check if the days of the week are the same // repeat type is the same, check if the days of the week are the same
$repeatingDaysChanged = false; $repeatingDaysChanged = false;
@ -881,10 +881,10 @@ SQL;
CcShowQuery::create() CcShowQuery::create()
->filterByDbId($showId) ->filterByDbId($showId)
->delete(); ->delete();
// There is only one cc_show_instance if the user selects 'Delete This Instance' // There is only one cc_show_instance if the user selects 'Delete This Instance'
// There is more than one cc_show_instance if the user selects 'Delete This // There is more than one cc_show_instance if the user selects 'Delete This
// Instance and All Following'. We only need to set the last_show value // Instance and All Following'. We only need to set the last_show value
// when 'Delete This Instance and All Following' has been selected // when 'Delete This Instance and All Following' has been selected
} elseif (count($ccShowInstances) > 1) { } elseif (count($ccShowInstances) > 1) {
$this->setLastRepeatingShowDate($showId); $this->setLastRepeatingShowDate($showId);
} }

View File

@ -1,6 +1,6 @@
{ {
"require": { "require": {
"php": "^7.4", "php": "^7.4",
"friendsofphp/php-cs-fixer": "<3.35.2" "friendsofphp/php-cs-fixer": "<3.41.2"
} }
} }

View File

@ -8,15 +8,11 @@ CPU_CORES := $(shell N=$$(nproc); echo $$(( $$N > 4 ? 4 : $$N )))
# BANDIT_ARG = # BANDIT_ARG =
# PYTEST_ARG = # PYTEST_ARG =
# SETUPTOOLS_ENABLE_FEATURES=legacy-editable is required to work
# around https://github.com/PyCQA/pylint/issues/7306
VENV = .venv VENV = .venv
install: $(VENV) install: $(VENV)
$(VENV): $(VENV):
python3 -m venv $(VENV) python3 -m venv $(VENV)
$(VENV)/bin/pip install --upgrade pip setuptools wheel $(VENV)/bin/pip install --upgrade pip setuptools wheel
SETUPTOOLS_ENABLE_FEATURES=legacy-editable \
$(VENV)/bin/pip install \ $(VENV)/bin/pip install \
--requirement ../tools/python-requirements.txt \ --requirement ../tools/python-requirements.txt \
$(PIP_INSTALL) $(PIP_INSTALL)