From 285fded9d5c04c22d719e76ac03a6ba7a6170c4b Mon Sep 17 00:00:00 2001 From: Shivangi-ch <57783826+Shivangi-ch@users.noreply.github.com> Date: Mon, 18 Mar 2024 14:01:34 +0530 Subject: [PATCH] Removed MariaDB/MySQL Support (#49) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit cleanup: remove remaining mysql code, patch up dependencies, fix typos (#53) Co-authored-by: Martin Bähr --- Dockerfile | 2 -- doc/admin/config.rst | 11 ++----- .../migrations/0102_auto_20181017_0024.py | 29 +------------------ src/pretix/helpers/templatetags/jsonfield.py | 21 +------------- src/pretix/settings.py | 25 +++++----------- src/requirements/mysql.txt | 2 -- src/setup.py | 4 +-- src/tests/api/test_items.py | 5 +--- src/tests/travis_mysql.cfg | 7 ----- 9 files changed, 14 insertions(+), 92 deletions(-) delete mode 100644 src/requirements/mysql.txt delete mode 100644 src/tests/travis_mysql.cfg diff --git a/Dockerfile b/Dockerfile index 869df11e9..70d7fc9b7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,7 +3,6 @@ FROM python:3.8-bookworm RUN apt-get update && \ apt-get install -y --no-install-recommends \ build-essential \ - default-libmysqlclient-dev \ gettext \ git \ libffi-dev \ @@ -48,7 +47,6 @@ RUN pip3 install -U \ pip3 install \ -r requirements.txt \ -r requirements/memcached.txt \ - -r requirements/mysql.txt \ gunicorn django-extensions ipython && \ rm -rf ~/.cache/pip diff --git a/doc/admin/config.rst b/doc/admin/config.rst index 78dee6580..e0d5f4da6 100644 --- a/doc/admin/config.rst +++ b/doc/admin/config.rst @@ -135,7 +135,7 @@ Database settings Example:: [database] - backend=mysql + backend=postgresql name=pretix user=pretix password=abcd @@ -143,22 +143,15 @@ Example:: port=3306 ``backend`` - One of ``mysql``, ``sqlite3``, ``oracle`` and ``postgresql``. + One of ``sqlite3``, ``oracle`` and ``postgresql``. Default: ``sqlite3``. - If you use MySQL, be sure to create your database using - ``CREATE DATABASE CHARACTER SET utf8;``. Otherwise, Unicode - support will not properly work. - ``name`` The database's name. Default: ``db.sqlite3``. ``user``, ``password``, ``host``, ``port`` Connection details for the database connection. Empty by default. -``galera`` - Indicates if the database backend is a MySQL/MariaDB Galera cluster and - turns on some optimizations/special case handlers. Default: ``False`` .. _`config-replica`: diff --git a/src/pretix/base/migrations/0102_auto_20181017_0024.py b/src/pretix/base/migrations/0102_auto_20181017_0024.py index cbab44764..28c5ed78c 100644 --- a/src/pretix/base/migrations/0102_auto_20181017_0024.py +++ b/src/pretix/base/migrations/0102_auto_20181017_0024.py @@ -2,8 +2,6 @@ from django.core.exceptions import ImproperlyConfigured from django.db import migrations, models -from django_mysql.checks import mysql_connections -from django_mysql.utils import connection_is_mariadb def set_attendee_name_parts(apps, schema_editor): @@ -24,31 +22,6 @@ def set_attendee_name_parts(apps, schema_editor): ia.save(update_fields=['name_parts']) -def check_mysqlversion(apps, schema_editor): - errors = [] - any_conn_works = False - conns = list(mysql_connections()) - found = 'Unknown version' - for alias, conn in conns: - if connection_is_mariadb(conn) and hasattr(conn, 'mysql_version'): - if conn.mysql_version >= (10, 2, 7): - any_conn_works = True - else: - found = 'MariaDB ' + '.'.join(str(v) for v in conn.mysql_version) - elif hasattr(conn, 'mysql_version'): - if conn.mysql_version >= (5, 7): - any_conn_works = True - else: - found = 'MySQL ' + '.'.join(str(v) for v in conn.mysql_version) - - if conns and not any_conn_works: - raise ImproperlyConfigured( - 'As of pretix 2.2, you need MySQL 5.7+ or MariaDB 10.2.7+ to run pretix. However, we detected a ' - 'database connection to {}'.format(found) - ) - return errors - - class Migration(migrations.Migration): dependencies = [ ('pretixbase', '0101_auto_20181025_2255'), @@ -56,7 +29,7 @@ class Migration(migrations.Migration): operations = [ migrations.RunPython( - check_mysqlversion, migrations.RunPython.noop + migrations.RunPython.noop ), migrations.RenameField( model_name='cartposition', diff --git a/src/pretix/helpers/templatetags/jsonfield.py b/src/pretix/helpers/templatetags/jsonfield.py index bb04757ab..23ba60fe4 100644 --- a/src/pretix/helpers/templatetags/jsonfield.py +++ b/src/pretix/helpers/templatetags/jsonfield.py @@ -5,17 +5,6 @@ from django.db import NotSupportedError from django.db.models import Expression, JSONField -def mysql_compile_json_path(key_transforms): - path = ['$'] - for key_transform in key_transforms: - try: - num = int(key_transform) - path.append('[{}]'.format(num)) - except ValueError: # non-integer - path.append('.') - path.append(key_transform) - return ''.join(path) - def postgres_compile_json_path(key_transforms): return "{" + ','.join(key_transforms) + "}" @@ -41,17 +30,9 @@ def as_sql(self, compiler, connection, function=None, template=None, arg_joiner= params.append(json_path) template = '{} #> %s'.format(arg_sql) return template, params - elif '.mysql' in connection.settings_dict['ENGINE']: - params = [] - arg_sql, arg_params = compiler.compile(self.source_expression) - params.extend(arg_params) - json_path = mysql_compile_json_path(self.path) - params.append(json_path) - template = 'JSON_EXTRACT({}, %s)'.format(arg_sql) - return template, params else: raise NotSupportedError( - 'Functions on JSONFields are only supported on PostgreSQL and MySQL at the moment.' + 'Functions on JSONFields are only supported on PostgreSQL.' ) def copy(self): diff --git a/src/pretix/settings.py b/src/pretix/settings.py index 4f99360b8..2d06c2c94 100644 --- a/src/pretix/settings.py +++ b/src/pretix/settings.py @@ -5,6 +5,7 @@ from urllib.parse import urlparse from .settings_helpers import build_db_tls_config, build_redis_tls_config import django.conf.locale +from django.core.exceptions import ImproperlyConfigured from django.utils.crypto import get_random_string from kombu import Queue from pkg_resources import iter_entry_points @@ -71,17 +72,11 @@ db_backend = config.get('database', 'backend', fallback='sqlite3') if db_backend == 'postgresql_psycopg2': db_backend = 'postgresql' -DATABASE_IS_GALERA = config.getboolean('database', 'galera', fallback=False) -if DATABASE_IS_GALERA and 'mysql' in db_backend: - db_options = { - 'init_command': 'SET SESSION wsrep_sync_wait = 1;' - } -else: - db_options = {} +if db_backend == 'mysql': + raise ImproperlyConfigured("MySQL/MariaDB is not supported") -if 'mysql' in db_backend: - db_options['charset'] = 'utf8mb4' -JSON_FIELD_AVAILABLE = db_backend in ('mysql', 'postgresql') +JSON_FIELD_AVAILABLE = db_backend == 'postgresql' +db_options = {} db_tls_config = build_db_tls_config(config, db_backend) if (db_tls_config is not None): @@ -98,10 +93,7 @@ 'PORT': config.get('database', 'port', fallback=''), 'CONN_MAX_AGE': 0 if db_backend == 'sqlite3' else 120, 'OPTIONS': db_options, - 'TEST': { - 'CHARSET': 'utf8mb4', - 'COLLATION': 'utf8mb4_unicode_ci', - } if 'mysql' in db_backend else {} + 'TEST': {} } } DATABASE_REPLICA = 'default' @@ -116,10 +108,7 @@ 'PORT': config.get('replica', 'port', fallback=DATABASES['default']['PORT']), 'CONN_MAX_AGE': 0 if db_backend == 'sqlite3' else 120, 'OPTIONS': db_options, - 'TEST': { - 'CHARSET': 'utf8mb4', - 'COLLATION': 'utf8mb4_unicode_ci', - } if 'mysql' in db_backend else {} + 'TEST': {} } DATABASE_ROUTERS = ['pretix.helpers.database.ReplicaRouter'] diff --git a/src/requirements/mysql.txt b/src/requirements/mysql.txt deleted file mode 100644 index 93c8d852b..000000000 --- a/src/requirements/mysql.txt +++ /dev/null @@ -1,2 +0,0 @@ -mysqlclient - diff --git a/src/setup.py b/src/setup.py index ff69cf350..0121d0063 100644 --- a/src/setup.py +++ b/src/setup.py @@ -108,7 +108,7 @@ def run(self): 'Programming Language :: Python :: 3.6', 'Programming Language :: Python :: 3.7', 'Programming Language :: Python :: 3.8', - 'Framework :: Django :: 3.0' + 'Framework :: Django :: 3.2' ], keywords='tickets web shop ecommerce', @@ -125,6 +125,7 @@ def run(self): 'django-hierarkey==1.0.*,>=1.0.4', 'django-filter==2.4.*', 'django-scopes==1.2.*', + 'django-localflavor==3.0.*', 'reportlab>=3.5.65', 'Pillow==8.*', 'PyPDF2==1.26.*', @@ -203,7 +204,6 @@ def run(self): 'freezegun', ], 'memcached': ['pylibmc'], - 'mysql': ['mysqlclient'], }, packages=find_packages(exclude=['tests', 'tests.*']), diff --git a/src/tests/api/test_items.py b/src/tests/api/test_items.py index 6851444f0..f8fac49fe 100644 --- a/src/tests/api/test_items.py +++ b/src/tests/api/test_items.py @@ -718,10 +718,7 @@ def test_item_create_with_addon(token_client, organizer, event, item, category, format='json' ) assert resp.status_code == 400 - assert resp.content.decode() in [ - '{"addons":["The minimum count needs to be equal to or greater than zero."]}', - '{"addons":[{"min_count":["Ensure this value is greater than or equal to 0."]}]}', # mysql - ] + assert resp.content.decode() == '{"addons":["The minimum count needs to be equal to or greater than zero."]}' with scopes_disabled(): assert 2 == Item.objects.all().count() diff --git a/src/tests/travis_mysql.cfg b/src/tests/travis_mysql.cfg deleted file mode 100644 index 48dc3133e..000000000 --- a/src/tests/travis_mysql.cfg +++ /dev/null @@ -1,7 +0,0 @@ -[database] -backend=mysql -name=pretix -user=root -password= -host=127.0.0.1 -port=3306