wip/75442-upgrade-hooks #27

Merged
vdeniaud merged 6 commits from wip/75442-upgrade-hooks into main 2023-03-29 15:46:22 +02:00
105 changed files with 116 additions and 178 deletions

View File

@ -2,27 +2,27 @@
# See https://pre-commit.com/hooks.html for more hooks
repos:
- repo: https://github.com/asottile/pyupgrade
rev: v3.1.0
rev: v3.3.1
hooks:
- id: pyupgrade
args: ['--keep-percent-format', '--py37-plus']
args: ['--keep-percent-format', '--py39-plus']
- repo: https://github.com/adamchainz/django-upgrade
rev: 1.10.0
rev: 1.13.0
hooks:
- id: django-upgrade
args: ['--target-version', '2.2']
args: ['--target-version', '3.2']
- repo: https://github.com/psf/black
rev: 22.3.0
rev: 23.3.0
hooks:
- id: black
args: ['--target-version', 'py37', '--skip-string-normalization', '--line-length', '110']
args: ['--target-version', 'py39', '--skip-string-normalization', '--line-length', '110']
- repo: https://github.com/PyCQA/isort
rev: 5.12.0
hooks:
- id: isort
args: ['--profile', 'black', '--line-length', '110']
- repo: https://github.com/rtts/djhtml
rev: 'v1.5.2'
rev: '3.0.6'
hooks:
- id: djhtml
args: ['--tabwidth', '2']

2
README
View File

@ -194,7 +194,7 @@ djhtml is used to automatically indent html files, using those parameters:
django-upgrade is used to automatically upgrade Django syntax, using those parameters:
django-upgrade --target-version 2.2
django-upgrade --target-version 3.2
There is .pre-commit-config.yaml to use pre-commit to automatically run these tools
before commits. (execute `pre-commit install` to install the git hook.)

2
debian/control vendored
View File

@ -14,7 +14,7 @@ Package: python3-hobo
Architecture: all
Depends: python3-apt,
python3-celery (>= 3.1.13),
python3-django (>= 2:2.2),
python3-django (>= 2:3.2),
python3-djangorestframework,
python3-dnspython,
python3-memcache,

View File

@ -1 +0,0 @@
default_app_config = 'hobo.agent.authentic2.apps.Authentic2AgentConfig'

View File

@ -15,7 +15,7 @@ from django.contrib.auth import get_user_model
from django.contrib.contenttypes.models import ContentType
from django.core import serializers
from django.utils.translation import activate
from django.utils.translation import ugettext as _
from django.utils.translation import gettext as _
from tenant_schemas.utils import tenant_context
from hobo.agent.authentic2.provisionning import Provisionning

View File

@ -15,7 +15,7 @@ from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import connection, transaction
from django.urls import reverse
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from hobo.agent.common import notify_agents
from hobo.signature import sign_url
@ -141,7 +141,7 @@ class Provisionning(threading.local):
tuple(allowed_technical_roles_prefixes)
)
issuer = force_text(self.get_entity_id())
issuer = force_str(self.get_entity_id())
if mode == 'provision':
def user_to_json(ou, service, user, user_roles):
@ -245,7 +245,7 @@ class Provisionning(threading.local):
continue
logger.info(
'provisionning users %s to %s',
', '.join(map(force_text, users)),
', '.join(map(force_str, users)),
', '.join(audience),
)
self.notify_agents(
@ -264,7 +264,7 @@ class Provisionning(threading.local):
elif users:
audience = [audience for ou in ous.keys() for s, audience in self.get_audience(ou)]
logger.info(
'deprovisionning users %s from %s', ', '.join(map(force_text, users)), ', '.join(audience)
'deprovisionning users %s from %s', ', '.join(map(force_str, users)), ', '.join(audience)
)
self.notify_agents(
{

View File

@ -9,7 +9,7 @@ import requests
from django.conf import settings
from django.core.management import call_command, get_commands
from django.core.management.base import BaseCommand, CommandError
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from tenant_schemas.utils import tenant_context
from hobo.multitenant.middleware import TenantMiddleware, TenantNotFound
@ -23,7 +23,7 @@ def replace_file(path, content):
dirname = os.path.dirname(path)
fd, temp = tempfile.mkstemp(dir=dirname, prefix='.tmp-' + os.path.basename(path) + '-')
f = os.fdopen(fd, 'w')
f.write(force_text(content))
f.write(force_str(content))
f.flush()
os.fsync(f.fileno())
f.close()
@ -32,7 +32,7 @@ def replace_file(path, content):
class Command(BaseCommand):
early_secondary_exit = True
requires_system_checks = False
requires_system_checks = []
me = None
def add_arguments(self, parser):

View File

@ -29,7 +29,7 @@ logger = logging.getLogger(__name__)
class Command(BaseCommand, NotificationProcessing):
requires_system_checks = False
requires_system_checks = []
def add_arguments(self, parser):
parser.add_argument('notification', metavar='NOTIFICATION', type=str)

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('auth', '0001_initial'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('common', '0001_initial'),
]

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('common', '0002_auto_20160105_1702'),
]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('common', '0003_auto_20200707_1656'),
]

View File

@ -7,7 +7,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
('common', '0004_alter_role_uuid'),

View File

@ -1,7 +1,8 @@
from django.conf import settings
from django.contrib.auth.models import Group
from django.contrib.postgres.fields import ArrayField, JSONField
from django.contrib.postgres.fields import ArrayField
from django.db import models
from django.db.models import JSONField
class Role(Group):

View File

@ -1 +0,0 @@
default_app_config = 'hobo.agent.hobo.apps.HoboAgentConfig'

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from hobo.applications.models import Application

View File

@ -7,7 +7,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = []

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0001_initial'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0002_icon'),
]

View File

@ -13,7 +13,6 @@ def forwards(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('applications', '0003_version_num_notes'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0004_version_num_notes'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0005_version_num_notes'),
]

View File

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0006_documentation_url'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0007_asyncjob'),
]

View File

@ -3,7 +3,6 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('applications', '0008_element_error'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0009_job_progression'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('applications', '0010_relation_error'),
]

View File

@ -23,12 +23,12 @@ import traceback
import urllib.parse
from django.conf import settings
from django.contrib.postgres.fields import JSONField
from django.core.files.base import ContentFile
from django.db import connection, models
from django.db.models import JSONField
from django.utils.text import slugify
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from hobo.environment.utils import get_installed_services

View File

@ -26,7 +26,7 @@ from django.shortcuts import get_object_or_404
from django.urls import reverse, reverse_lazy
from django.utils.text import slugify
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from django.views.generic import DetailView, FormView, ListView, TemplateView
from django.views.generic.edit import CreateView, DeleteView, UpdateView

View File

@ -17,7 +17,7 @@
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import validate_ipv46_address
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
def validate_space_separated_ips(value):

View File

@ -19,7 +19,7 @@
<div class="buttons">
<button class="submit-button">{% trans "Save" %}</button>
<button class="submit-button"
name="toggle-current-ip">{% if current_ip_debug %}{% trans "Remove current IP" %}{% else %}{% trans "Add current IP" %}{% endif %} - {{ view.current_ip }}</button>
name="toggle-current-ip">{% if current_ip_debug %}{% trans "Remove current IP" %}{% else %}{% trans "Add current IP" %}{% endif %} - {{ view.current_ip }}</button>
</div>
</form>

View File

@ -1,27 +0,0 @@
# hobo - portal to configure and deploy applications
# Copyright (C) 2015 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'hobo.deploy'
def ready(self):
from . import signals
default_app_config = 'hobo.deploy.AppConfig'

24
hobo/deploy/apps.py Normal file
View File

@ -0,0 +1,24 @@
# hobo - portal to configure and deploy applications
# Copyright (C) 2015 Entr'ouvert
#
# This program is free software: you can redistribute it and/or modify it
# under the terms of the GNU Affero General Public License as published
# by the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
import django.apps
class AppConfig(django.apps.AppConfig):
name = 'hobo.deploy'
def ready(self):
from . import signals

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django import forms
from django.core.validators import validate_email
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from hobo.emails.validators import validate_email_address, validate_email_domain, validate_email_spf

View File

@ -22,7 +22,7 @@ import dns.resolver
from django.conf import settings
from django.core.exceptions import ValidationError
from django.utils.encoding import force_bytes
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from hobo.environment.utils import get_operational_services

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.conf import settings
from django.utils.translation import ugettext as _
from django.utils.translation import gettext as _
from django.views.generic import TemplateView
from hobo.environment.forms import VariablesFormMixin

View File

@ -19,7 +19,7 @@ from django.conf import settings
from django.contrib import messages
from django.http import HttpResponseRedirect
from django.template.defaultfilters import slugify
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from .models import Authentic, BiJoe, Chrono, Combo, Fargo, Hobo, Lingo, Passerelle, Variable, Wcs, Welco
from .utils import get_variable

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('contenttypes', '0001_initial'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0001_initial'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0002_authentic_use_as_idp_for_self'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0003_auto_20150309_0811'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0004_fargo'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0005_variable_label'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0006_auto_20150708_0830'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0007_auto_20151008_1406'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0008_auto_20151021_1414'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0009_mandayejs'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0010_variable_auto'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0011_chrono'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0012_mandayejs_site_app'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0013_auto_20160226_1633'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0014_piwik'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0015_corbo'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0016_bijoe'),
]

View File

@ -2,7 +2,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0017_hobo'),
]

View File

@ -4,7 +4,6 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('environment', '0018_auto_20161102_1929'),
]

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0019_delete_piwik'),
]

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0020_delete_corbo_mandaye'),
]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0021_base_url_validators'),
]

View File

@ -33,7 +33,6 @@ def clean_local_hobo(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('environment', '0022_local_hobo'),
]

View File

@ -31,7 +31,6 @@ def clean_local_hobo(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('environment', '0023_populate_local_hobo'),
]

View File

@ -5,7 +5,6 @@ from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('environment', '0024_remove_local_hobo'),
]

View File

@ -6,7 +6,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0025_legacy_urls'),
]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0026_lingo'),
]

View File

@ -16,7 +16,6 @@ def clean_internal_ips(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('environment', '0027_allow_long_slug'),
]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('environment', '0028_clean_internal_ips'),
]

View File

@ -25,15 +25,15 @@ import requests
from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from django.contrib.postgres.fields import JSONField
from django.core.cache import cache
from django.core.exceptions import ValidationError
from django.core.validators import URLValidator
from django.db import models
from django.db.models import JSONField
from django.utils.crypto import get_random_string
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from .utils import Zone, get_installed_services, get_local_key
@ -188,7 +188,7 @@ class ServiceBase(models.Model):
if self.legacy_urls:
as_dict['legacy_urls'] = self.legacy_urls
as_dict['service-id'] = self.Extra.service_id
as_dict['service-label'] = force_text(self.Extra.service_label)
as_dict['service-label'] = force_str(self.Extra.service_label)
as_dict['variables'] = {v.name: v.json for v in self.variables.all()}
as_dict['secondary'] = self.secondary
if self.get_saml_sp_metadata_url():

View File

@ -23,9 +23,9 @@
{% for service in installed_services %}
<div data-service-id="{{ service.Extra.service_id }}"
data-slug="{{ service.slug }}"
class="bo-block service-block {{ service.Extra.service_id }}-block"
{% if service.wants_frequent_checks %}data-wants-check="true"{% endif %}>
data-slug="{{ service.slug }}"
class="bo-block service-block {{ service.Extra.service_id }}-block"
{% if service.wants_frequent_checks %}data-wants-check="true"{% endif %}>
<h3>{{ service.title }} <span class="slug">[{{service.slug}},
<a href="{{service.base_url}}">{{service.base_url}}</a>]</span></h3>
{% if not service.is_operational %}

View File

@ -22,7 +22,7 @@ from django.conf import settings
from django.core.management.base import CommandError
from django.db import connection, transaction
from django.urls import reverse
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from hobo.middleware.utils import StoreRequestMiddleware
from hobo.multitenant.settings_loaders import KnownServices
@ -48,7 +48,7 @@ def get_operational_services():
def get_local_key(url):
secret1 = force_text(settings.SECRET_KEY)
secret1 = force_str(settings.SECRET_KEY)
secret2 = url
return KnownServices.shared_secret(secret1, secret2)[:40]

View File

@ -23,8 +23,8 @@ from django.contrib.contenttypes.models import ContentType
from django.http import Http404, HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import get_object_or_404
from django.urls import reverse_lazy
from django.utils.encoding import force_text
from django.utils.translation import ugettext_lazy as _
from django.utils.encoding import force_str
from django.utils.translation import gettext_lazy as _
from django.views.generic import View
from django.views.generic.base import TemplateView
from django.views.generic.edit import CreateView, DeleteView, FormView, UpdateView
@ -213,7 +213,7 @@ class ImportView(FormView):
def form_valid(self, form):
try:
parameters_json = json.loads(force_text(self.request.FILES['parameters_json'].read()))
parameters_json = json.loads(force_str(self.request.FILES['parameters_json'].read()))
except ValueError:
form.add_error('parameters_json', _('File is not in the expected JSON format.'))
return self.form_invalid(form)
@ -230,7 +230,6 @@ class ExportView(View):
def operational_check_view(request, service, slug, **kwargs):
for klass in AVAILABLE_SERVICES:
if klass.Extra.service_id == service:
break

View File

@ -8,7 +8,6 @@ else:
class HoboForm(ModelForm):
required_css_class = 'required'
def __init__(self, *args, **kwargs):

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
class MaintenanceForm(forms.Form):

View File

@ -17,7 +17,7 @@
import xml.etree.ElementTree as etree
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
class SettingsForm(forms.Form):

View File

@ -1,7 +1,7 @@
import django
from django.http import JsonResponse
from django.middleware.common import CommonMiddleware
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
class HoboCommonMiddleware(CommonMiddleware):

View File

@ -14,7 +14,7 @@ class CORSMiddleware(MiddlewareMixin):
view/exception middleware along with the requested view;
it will call any response middlewares
"""
if request.method == 'OPTIONS' and "HTTP_ACCESS_CONTROL_REQUEST_METHOD" in request.META:
if request.method == 'OPTIONS' and "access-control-request-method" in request.headers:
response = HttpResponse()
return response
return None

View File

@ -18,7 +18,7 @@ from ipaddress import ip_address, ip_network
from django.conf import settings
from django.template.response import TemplateResponse
from django.utils.translation import ugettext as _
from django.utils.translation import gettext as _
def pass_through(request):

View File

@ -10,7 +10,7 @@ class XForwardedForMiddleware(MiddlewareMixin):
def process_request(self, request):
if getattr(settings, 'USE_X_FORWARDED_FOR', False):
if 'HTTP_X_FORWARDED_FOR' in request.META:
if 'x-forwarded-for' in request.headers:
ip = request.headers.get('X-Forwarded-For', '').split(",")[0].strip()
if ip:
request.META['REMOTE_ADDR'] = ip

View File

@ -1,5 +1,3 @@
default_app_config = 'hobo.multitenant.apps.MultitenantAppConfig'
# import the context_processors module so it gets to compute the versions hash
# early on.
from hobo import context_processors

View File

@ -13,7 +13,7 @@ from django.core.exceptions import ImproperlyConfigured
from django.core.management import call_command, get_commands, load_command_class
from django.core.management.base import BaseCommand, CommandError, SystemCheckError, handle_default_options
from django.db import connection, connections
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from hobo.multitenant.management.commands import InteractiveTenantOption
from hobo.multitenant.middleware import TenantMiddleware
@ -26,12 +26,12 @@ def exception_to_text(e):
pass
try:
return force_text(str(e), errors='ignore')
return force_str(str(e), errors='ignore')
except Exception:
pass
try:
return force_text(repr(e), errors='ignore')
return force_str(repr(e), errors='ignore')
except Exception:
pass

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
class EditFullNameTemplateForm(forms.Form):

View File

@ -3,7 +3,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = []
operations = [

View File

@ -24,7 +24,6 @@ def add_initial_data(apps, schema_editor):
class Migration(migrations.Migration):
dependencies = [
('profile', '0001_initial'),
]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('profile', '0002_add_data'),
]

View File

@ -5,7 +5,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('profile', '0003_attributedefinition_searchable'),
]

View File

@ -4,7 +4,6 @@ from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('profile', '0004_auto_20200518_1810'),
]

View File

@ -16,7 +16,7 @@
from django.core.validators import RegexValidator
from django.db import models
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
validate_attribute_name = RegexValidator(
r'^[a-z][a-z0-9_]*\Z',

View File

@ -16,7 +16,7 @@
from django.shortcuts import redirect
from django.urls import reverse, reverse_lazy
from django.utils.translation import ugettext as _
from django.utils.translation import gettext as _
from django.views.generic import CreateView, ListView, RedirectView, TemplateView, UpdateView
from hobo.deploy.signals import notify_agents

View File

@ -23,7 +23,7 @@ from django.conf import settings
from django.db import connection
from django.http import HttpResponseBadRequest, HttpResponseForbidden, JsonResponse
from django.utils.deprecation import MiddlewareMixin
from django.utils.encoding import force_bytes, force_text
from django.utils.encoding import force_bytes, force_str
from hobo.provisionning.utils import NotificationProcessing
from hobo.rest_authentication import PublikAuthentication, PublikAuthenticationFailed
@ -46,7 +46,7 @@ class ProvisionningMiddleware(MiddlewareMixin, NotificationProcessing):
return HttpResponseForbidden()
try:
notification = json.loads(force_text(request.body))
notification = json.loads(force_str(request.body))
except ValueError:
return HttpResponseBadRequest()
if not isinstance(notification, dict) or 'objects' not in notification:

View File

@ -56,7 +56,6 @@ class AnonymousAdminServiceUser(AnonymousUser):
class APIClientUser:
is_active = True
is_anonymous = False
is_authenticated = True

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
class RobotsTxtForm(forms.Form):

View File

@ -10,7 +10,7 @@ and to disable DEBUG mode in production.
import os
from django.conf import global_settings
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(__file__))
@ -116,6 +116,8 @@ DATABASES = {
}
}
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
# Internationalization
# https://docs.djangoproject.com/en/1.6/topics/i18n/

View File

@ -16,7 +16,7 @@
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidator
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from hobo.utils import TemplateError, get_templated_url

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.conf import settings
from django.utils.translation import ugettext as _
from django.utils.translation import gettext as _
from django.views.generic import TemplateView
from hobo.environment.forms import VariablesFormMixin

View File

@ -20,7 +20,6 @@ def helloworld(request):
class AuthenticatedTestView(APIView):
permission_classes = [permissions.IsAuthenticated]
def get(self, request):

View File

@ -15,7 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
class ThemeOptionsForm(forms.Form):

View File

@ -19,7 +19,7 @@ import random
from django.contrib import messages
from django.urls import reverse
from django.utils.translation import ugettext as _
from django.utils.translation import gettext as _
from django.views.generic import RedirectView, TemplateView
from hobo.environment.forms import VariablesFormMixin

View File

@ -56,12 +56,12 @@ urlpatterns += [
path('logout/', logout, name='logout'),
path('login/', login, name='auth_login'),
path('login/local/', login_local), # to be used as backup, in case of idp down
re_path(r'^accounts/mellon/', include('mellon.urls')),
path('accounts/mellon/', include('mellon.urls')),
]
if settings.DEBUG and 'debug_toolbar' in settings.INSTALLED_APPS:
import debug_toolbar # pylint: disable=import-error
urlpatterns = [
re_path(r'^__debug__/', include(debug_toolbar.urls)),
path('__debug__/', include(debug_toolbar.urls)),
] + urlpatterns

View File

@ -9,8 +9,8 @@ from django.core.exceptions import PermissionDenied
from django.http import HttpResponse, HttpResponseRedirect, JsonResponse
from django.shortcuts import resolve_url
from django.urls import reverse
from django.utils.encoding import force_text
from django.utils.translation import ugettext as _
from django.utils.encoding import force_str
from django.utils.translation import gettext as _
from django.views.generic import edit
from django.views.generic.base import TemplateView
@ -89,7 +89,7 @@ def health_json(request):
def menu_json(request):
label = _('System')
json_str = json.dumps(
[{'label': force_text(label), 'slug': 'system', 'url': request.build_absolute_uri(reverse('home'))}]
[{'label': force_str(label), 'slug': 'system', 'url': request.build_absolute_uri(reverse('home'))}]
)
content_type = 'application/json'
for variable in ('jsonpCallback', 'callback'):

View File

@ -148,7 +148,7 @@ setup(
'Programming Language :: Python',
],
install_requires=[
'django>=2.2, <3.3',
'django>=3.2, <3.3',
'gadjo',
'celery<4' if sys.version_info < (3, 7) else 'celery>=4',
'django-mellon',

View File

@ -9,7 +9,7 @@ from unittest import mock
import dns.resolver
import pytest
from django.core.exceptions import ValidationError
from django.utils.encoding import force_text
from django.utils.encoding import force_str
from dns import name
from dns.rdtypes.ANY import MX, TXT
from test_manager import login
@ -129,7 +129,7 @@ def test_invalid_address(client, admin_user):
client.post('/login/', {'username': 'admin', 'password': 'password'})
response = client.post('/emails/', {'default_from_email': 'foobar'})
assert response.status_code == 200
assert 'Enter a valid email address' in force_text(response.content)
assert 'Enter a valid email address' in force_str(response.content)
def test_unkown_address(client, admin_user, dns_resolver, smtp_server, settings):
@ -137,7 +137,7 @@ def test_unkown_address(client, admin_user, dns_resolver, smtp_server, settings)
client.post('/login/', {'username': 'admin', 'password': 'password'})
response = client.post('/emails/', {'default_from_email': 'john.doe@unknown.com'})
assert response.status_code == 200
assert 'Email address not found' in force_text(response.content)
assert 'Email address not found' in force_str(response.content)
def test_kown_address_nospf(client, admin_user, dns_resolver, smtp_server, settings):
@ -145,7 +145,7 @@ def test_kown_address_nospf(client, admin_user, dns_resolver, smtp_server, setti
client.post('/login/', {'username': 'admin', 'password': 'password'})
response = client.post('/emails/', {'default_from_email': 'john.doe@example.com'}, follow=True)
assert response.status_code == 200
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_text(
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_str(
response.content
)
@ -157,7 +157,7 @@ def test_spf_allow_all_mail(client, admin_user, dns_resolver, smtp_server, setti
'/emails/', {'default_from_email': 'john.doe@example-spf-allow-all.com'}, follow=True
)
assert response.status_code == 200
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_text(
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_str(
response.content
)
@ -168,7 +168,7 @@ def test_invalid_spf(client, admin_user, dns_resolver, smtp_server, settings):
client.post('/login/', {'username': 'admin', 'password': 'password'})
response = client.post('/emails/', {'default_from_email': 'john.doe@example-invalid-spf.com'})
assert response.status_code == 200
assert 'No suitable SPF record found' in force_text(response.content)
assert 'No suitable SPF record found' in force_str(response.content)
def test_strict_nospf(client, admin_user, dns_resolver, smtp_server, monkeypatch, settings):
@ -178,7 +178,7 @@ def test_strict_nospf(client, admin_user, dns_resolver, smtp_server, monkeypatch
client.post('/login/', {'username': 'admin', 'password': 'password'})
response = client.post('/emails/', {'default_from_email': 'john.doe@example.com'}, follow=True)
assert response.status_code == 200
assert 'No suitable SPF record found' in force_text(response.content)
assert 'No suitable SPF record found' in force_str(response.content)
def test_valid_spf(client, admin_user, dns_resolver, smtp_server, settings):
@ -187,7 +187,7 @@ def test_valid_spf(client, admin_user, dns_resolver, smtp_server, settings):
client.post('/login/', {'username': 'admin', 'password': 'password'})
response = client.post('/emails/', {'default_from_email': 'john.doe@example-spf.com'}, follow=True)
assert response.status_code == 200
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_text(
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_str(
response.content
)
@ -200,7 +200,7 @@ def test_no_spf_validation(client, admin_user, dns_resolver, smtp_server, settin
'/emails/', {'default_from_email': 'john.doe@example-invalid-spf.com'}, follow=True
)
assert response.status_code == 200
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_text(
assert 'Emails settings have been updated. It will take a few seconds to be effective.' in force_str(
response.content
)
@ -211,14 +211,14 @@ def test_sender_allowed_domains(client, admin_user, dns_resolver, smtp_server, s
client.post('/login/', {'username': 'admin', 'password': 'password'})
response = client.post('/emails/', {'default_from_email': 'john.doe@example.com'}, follow=True)
assert response.status_code == 200
assert 'Domain example.com is not allowed' in force_text(response.content)
assert 'Emails settings have been updated.' not in force_text(response.content)
assert 'Domain example.com is not allowed' in force_str(response.content)
assert 'Emails settings have been updated.' not in force_str(response.content)
settings.EMAIL_FROM_ALLOWED_DOMAINS = ['example.com', 'foo.bar']
response = client.post('/emails/', {'default_from_email': 'john.doe@example.com'}, follow=True)
assert response.status_code == 200
assert 'Emails settings have been updated.' in force_text(response.content)
assert 'Domain example.com is not allowed' not in force_text(response.content)
assert 'Emails settings have been updated.' in force_str(response.content)
assert 'Domain example.com is not allowed' not in force_str(response.content)
settings.EMAIL_FROM_ALLOWED_DOMAINS = []
combo = Combo(base_url='https://example.org/test')
@ -227,21 +227,21 @@ def test_sender_allowed_domains(client, admin_user, dns_resolver, smtp_server, s
response = client.post('/emails/', {'default_from_email': 'john.doe@example.org'}, follow=True)
assert response.status_code == 200
assert 'Emails settings have been updated.' in force_text(response.content)
assert 'Emails settings have been updated.' in force_str(response.content)
response = client.post('/emails/', {'default_from_email': 'john.doe@example.com'}, follow=True)
assert response.status_code == 200
assert 'Domain example.com is not allowed' in force_text(response.content)
assert 'Domain example.com is not allowed' in force_str(response.content)
response = client.post('/emails/', {'default_from_email': 'john.doe@brother.example.org'}, follow=True)
assert response.status_code == 200
assert 'Domain brother.example.org is not allowed' in force_text(response.content)
assert 'Domain brother.example.org is not allowed' in force_str(response.content)
combo.base_url = 'https://www.example.com'
combo.save()
response = client.post('/emails/', {'default_from_email': 'john.doe@example.com'}, follow=True)
assert response.status_code == 200
assert 'Emails settings have been updated.' in force_text(response.content)
assert 'Emails settings have been updated.' in force_str(response.content)
def test_emails_view(app, admin_user, dns_resolver, smtp_server, settings):

Some files were not shown because too many files have changed in this diff Show More