misc: apply double-quote-string-fixer (#79788)
This commit is contained in:
parent
c890242d56
commit
1b3c26ba2a
|
@ -38,8 +38,8 @@ class Command(BaseCommand):
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
parser.add_argument('base_url', metavar='BASE_URL', nargs='?', type=str)
|
parser.add_argument('base_url', metavar='BASE_URL', nargs='?', type=str)
|
||||||
parser.add_argument('json_filename', metavar='JSON_FILENAME', nargs='?', type=str)
|
parser.add_argument('json_filename', metavar='JSON_FILENAME', nargs='?', type=str)
|
||||||
parser.add_argument('--ignore-timestamp', dest='ignore_timestamp', action="store_true", default=False)
|
parser.add_argument('--ignore-timestamp', dest='ignore_timestamp', action='store_true', default=False)
|
||||||
parser.add_argument('--redeploy', action="store_true", default=False)
|
parser.add_argument('--redeploy', action='store_true', default=False)
|
||||||
|
|
||||||
def handle(
|
def handle(
|
||||||
self, base_url=None, json_filename=None, ignore_timestamp=None, redeploy=None, *args, **kwargs
|
self, base_url=None, json_filename=None, ignore_timestamp=None, redeploy=None, *args, **kwargs
|
||||||
|
|
|
@ -12,7 +12,7 @@ class Command(BaseCommand):
|
||||||
obj.check_operational()
|
obj.check_operational()
|
||||||
if int(kwargs.get('verbosity')) > 1:
|
if int(kwargs.get('verbosity')) > 1:
|
||||||
if obj.is_operational():
|
if obj.is_operational():
|
||||||
print("%s is operational" % obj.title)
|
print('%s is operational' % obj.title)
|
||||||
else:
|
else:
|
||||||
print(self.style.NOTICE('%s is NOT operational' % obj.title))
|
print(self.style.NOTICE('%s is NOT operational' % obj.title))
|
||||||
if obj.last_operational_success_timestamp:
|
if obj.last_operational_success_timestamp:
|
||||||
|
|
|
@ -42,7 +42,7 @@ class RequestContextFilter(logging.Filter):
|
||||||
DEFAULT_IP = '-'
|
DEFAULT_IP = '-'
|
||||||
DEFAULT_PATH = '-'
|
DEFAULT_PATH = '-'
|
||||||
DEFAULT_REQUEST_ID = '-'
|
DEFAULT_REQUEST_ID = '-'
|
||||||
DEFAULT_USER = "-"
|
DEFAULT_USER = '-'
|
||||||
DEFAULT_USER_NAME = '-'
|
DEFAULT_USER_NAME = '-'
|
||||||
DEFAULT_USER_EMAIL = '-'
|
DEFAULT_USER_EMAIL = '-'
|
||||||
DEFAULT_USER_DISPLAY_NAME = '-'
|
DEFAULT_USER_DISPLAY_NAME = '-'
|
||||||
|
|
|
@ -234,7 +234,7 @@ class MatomoWS:
|
||||||
|
|
||||||
def create_fake_first_tracking_visit(self, id_site):
|
def create_fake_first_tracking_visit(self, id_site):
|
||||||
"""this function use a different matomo's webservice API"""
|
"""this function use a different matomo's webservice API"""
|
||||||
url = "%s/matomo.php" % self.url_ws_base
|
url = '%s/matomo.php' % self.url_ws_base
|
||||||
data = {'requests': ['?idsite=%s&action_name=ping&rec=1' % id_site]}
|
data = {'requests': ['?idsite=%s&action_name=ping&rec=1' % id_site]}
|
||||||
resp = requests.post(url, json=data, timeout=30)
|
resp = requests.post(url, json=data, timeout=30)
|
||||||
if resp.status_code != 200:
|
if resp.status_code != 200:
|
||||||
|
@ -274,7 +274,7 @@ def upgrade_user(matomo, user_login, id_site):
|
||||||
|
|
||||||
# generate a password and add a new user
|
# generate a password and add a new user
|
||||||
characters = string.ascii_letters + string.punctuation + string.digits
|
characters = string.ascii_letters + string.punctuation + string.digits
|
||||||
password = "".join(choice(characters) for x in range(randint(8, 16)))
|
password = ''.join(choice(characters) for x in range(randint(8, 16)))
|
||||||
matomo.add_user(user_login, password, id_site)
|
matomo.add_user(user_login, password, id_site)
|
||||||
|
|
||||||
# build the user's login url
|
# build the user's login url
|
||||||
|
|
|
@ -17,7 +17,7 @@ class HoboCommonMiddleware(CommonMiddleware):
|
||||||
self.will_redirect_with_slash
|
self.will_redirect_with_slash
|
||||||
and isinstance(response, self.response_redirect_class)
|
and isinstance(response, self.response_redirect_class)
|
||||||
and request.path_info.startswith('/api/')
|
and request.path_info.startswith('/api/')
|
||||||
and request.method in ("POST", "PUT", "PATCH")
|
and request.method in ('POST', 'PUT', 'PATCH')
|
||||||
)
|
)
|
||||||
|
|
||||||
def process_request(self, request):
|
def process_request(self, request):
|
||||||
|
|
|
@ -12,7 +12,7 @@ class CORSMiddleware(MiddlewareMixin):
|
||||||
view/exception middleware along with the requested view;
|
view/exception middleware along with the requested view;
|
||||||
it will call any response middlewares
|
it will call any response middlewares
|
||||||
"""
|
"""
|
||||||
if request.method == 'OPTIONS' and "access-control-request-method" in request.headers:
|
if request.method == 'OPTIONS' and 'access-control-request-method' in request.headers:
|
||||||
response = HttpResponse()
|
response = HttpResponse()
|
||||||
return response
|
return response
|
||||||
return None
|
return None
|
||||||
|
|
|
@ -17,7 +17,7 @@ class XForwardedForMiddleware(MiddlewareMixin):
|
||||||
headers = getattr(settings, 'USE_X_FORWARDED_FOR_HEADERS', None) or ('X-Forwarded-For',)
|
headers = getattr(settings, 'USE_X_FORWARDED_FOR_HEADERS', None) or ('X-Forwarded-For',)
|
||||||
for header in headers:
|
for header in headers:
|
||||||
if header in request.headers:
|
if header in request.headers:
|
||||||
ip = request.headers.get(header, '').split(",")[0].strip()
|
ip = request.headers.get(header, '').split(',')[0].strip()
|
||||||
if ip:
|
if ip:
|
||||||
request.META['REMOTE_ADDR'] = ip
|
request.META['REMOTE_ADDR'] = ip
|
||||||
break
|
break
|
||||||
|
|
|
@ -35,8 +35,8 @@ class BaseTenantCommand(BaseCommand):
|
||||||
# prepend the command's original help with the info about schemata
|
# prepend the command's original help with the info about schemata
|
||||||
# iteration
|
# iteration
|
||||||
obj.help = (
|
obj.help = (
|
||||||
"Calls {cmd} for all registered schemata. You can use regular "
|
'Calls {cmd} for all registered schemata. You can use regular '
|
||||||
"{cmd} options.\n\nOriginal help for {cmd}:\n\n{help}".format(
|
'{cmd} options.\n\nOriginal help for {cmd}:\n\n{help}'.format(
|
||||||
cmd=obj.COMMAND_NAME,
|
cmd=obj.COMMAND_NAME,
|
||||||
help=getattr(obj._original_command, 'help', 'none'),
|
help=getattr(obj._original_command, 'help', 'none'),
|
||||||
)
|
)
|
||||||
|
@ -46,7 +46,7 @@ class BaseTenantCommand(BaseCommand):
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
super().add_arguments(parser)
|
super().add_arguments(parser)
|
||||||
parser.add_argument("-d", "--domain", dest="domain")
|
parser.add_argument('-d', '--domain', dest='domain')
|
||||||
# use the privately held reference to the underlying command to invoke
|
# use the privately held reference to the underlying command to invoke
|
||||||
# the add_arguments path on this parser instance
|
# the add_arguments path on this parser instance
|
||||||
self._original_command.add_arguments(parser)
|
self._original_command.add_arguments(parser)
|
||||||
|
@ -87,7 +87,7 @@ class BaseTenantCommand(BaseCommand):
|
||||||
|
|
||||||
class InteractiveTenantOption:
|
class InteractiveTenantOption:
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
parser.add_argument("-d", "--domain", dest="domain", help='specify tenant domain')
|
parser.add_argument('-d', '--domain', dest='domain', help='specify tenant domain')
|
||||||
|
|
||||||
def get_tenant_from_options_or_interactive(self, **options):
|
def get_tenant_from_options_or_interactive(self, **options):
|
||||||
all_tenants = list(TenantMiddleware.get_tenants())
|
all_tenants = list(TenantMiddleware.get_tenants())
|
||||||
|
@ -119,7 +119,7 @@ https://django-tenant-schemas.readthedocs.org/en/latest/use.html#creating-a-tena
|
||||||
else:
|
else:
|
||||||
displayed_tenants = [x for x in all_tenants if domain in x.domain_url]
|
displayed_tenants = [x for x in all_tenants if domain in x.domain_url]
|
||||||
for i, tenant in enumerate(displayed_tenants):
|
for i, tenant in enumerate(displayed_tenants):
|
||||||
print("[%2d] %s (schema %s)" % (i + 1, tenant.domain_url, tenant.schema_name))
|
print('[%2d] %s (schema %s)' % (i + 1, tenant.domain_url, tenant.schema_name))
|
||||||
|
|
||||||
return TenantMiddleware.get_tenant_by_hostname(domain)
|
return TenantMiddleware.get_tenant_by_hostname(domain)
|
||||||
|
|
||||||
|
@ -166,8 +166,8 @@ class SyncCommon(BaseCommand):
|
||||||
'migration. Use the name "zero" to unapply all migrations.'
|
'migration. Use the name "zero" to unapply all migrations.'
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
parser.add_argument("-d", "--domain", dest="domain")
|
parser.add_argument('-d', '--domain', dest='domain')
|
||||||
parser.add_argument("-s", "--schema", dest="schema_name")
|
parser.add_argument('-s', '--schema', dest='schema_name')
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
self.domain = options.get('domain')
|
self.domain = options.get('domain')
|
||||||
|
|
|
@ -9,11 +9,11 @@ from .create_tenant import Command as CreateTenantCommand
|
||||||
|
|
||||||
|
|
||||||
class Command(CreateTenantCommand):
|
class Command(CreateTenantCommand):
|
||||||
help = "Create hobo tenant(s) by hostname(s)"
|
help = 'Create hobo tenant(s) by hostname(s)'
|
||||||
|
|
||||||
def handle(self, hostnames, **options):
|
def handle(self, hostnames, **options):
|
||||||
if not hostnames:
|
if not hostnames:
|
||||||
raise CommandError("you must give at least one tenant hostname")
|
raise CommandError('you must give at least one tenant hostname')
|
||||||
|
|
||||||
if '-' in hostnames: # get additional list of hostnames from stdin
|
if '-' in hostnames: # get additional list of hostnames from stdin
|
||||||
hostnames = list(hostnames)
|
hostnames = list(hostnames)
|
||||||
|
|
|
@ -5,7 +5,7 @@ from hobo.multitenant.middleware import TenantMiddleware
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = "Create schemas for all declared tenants"
|
help = 'Create schemas for all declared tenants'
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
verbosity = int(options.get('verbosity'))
|
verbosity = int(options.get('verbosity'))
|
||||||
|
@ -15,6 +15,6 @@ class Command(BaseCommand):
|
||||||
for tenant in all_tenants:
|
for tenant in all_tenants:
|
||||||
if verbosity >= 1:
|
if verbosity >= 1:
|
||||||
print()
|
print()
|
||||||
print(self.style.NOTICE("=== Creating schema ") + self.style.SQL_TABLE(tenant.schema_name))
|
print(self.style.NOTICE('=== Creating schema ') + self.style.SQL_TABLE(tenant.schema_name))
|
||||||
|
|
||||||
tenant.create_schema(check_if_exists=True)
|
tenant.create_schema(check_if_exists=True)
|
||||||
|
|
|
@ -8,7 +8,7 @@ from hobo.multitenant.middleware import TenantMiddleware, get_tenant_model
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = "Create tenant(s) by hostname(s)"
|
help = 'Create tenant(s) by hostname(s)'
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
parser.add_argument('hostnames', metavar='HOSTNAME', nargs='+')
|
parser.add_argument('hostnames', metavar='HOSTNAME', nargs='+')
|
||||||
|
@ -17,7 +17,7 @@ class Command(BaseCommand):
|
||||||
def handle(self, hostnames, legacy_hostname, **options):
|
def handle(self, hostnames, legacy_hostname, **options):
|
||||||
verbosity = int(options.get('verbosity'))
|
verbosity = int(options.get('verbosity'))
|
||||||
if not hostnames:
|
if not hostnames:
|
||||||
raise CommandError("you must give at least one tenant hostname")
|
raise CommandError('you must give at least one tenant hostname')
|
||||||
|
|
||||||
if '-' in hostnames: # get additional list of hostnames from stdin
|
if '-' in hostnames: # get additional list of hostnames from stdin
|
||||||
hostnames = list(hostnames)
|
hostnames = list(hostnames)
|
||||||
|
@ -25,15 +25,15 @@ class Command(BaseCommand):
|
||||||
hostnames.extend([x.strip() for x in sys.stdin.readlines()])
|
hostnames.extend([x.strip() for x in sys.stdin.readlines()])
|
||||||
|
|
||||||
if legacy_hostname and len(hostnames) > 1:
|
if legacy_hostname and len(hostnames) > 1:
|
||||||
raise CommandError("You must specify only hostname when using --legacy-hostname")
|
raise CommandError('You must specify only hostname when using --legacy-hostname')
|
||||||
|
|
||||||
for hostname in hostnames:
|
for hostname in hostnames:
|
||||||
try:
|
try:
|
||||||
tenant_base = TenantMiddleware.base()
|
tenant_base = TenantMiddleware.base()
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
raise CommandError("you must configure TENANT_BASE in your settings")
|
raise CommandError('you must configure TENANT_BASE in your settings')
|
||||||
if not tenant_base:
|
if not tenant_base:
|
||||||
raise CommandError("you must set a value to TENANT_BASE in your settings")
|
raise CommandError('you must set a value to TENANT_BASE in your settings')
|
||||||
tenant_dir = os.path.join(tenant_base, hostname)
|
tenant_dir = os.path.join(tenant_base, hostname)
|
||||||
if os.path.exists(tenant_dir):
|
if os.path.exists(tenant_dir):
|
||||||
raise CommandError('tenant already exists')
|
raise CommandError('tenant already exists')
|
||||||
|
@ -62,12 +62,12 @@ class Command(BaseCommand):
|
||||||
legacy_schema = TenantMiddleware.hostname2schema(legacy_hostname)
|
legacy_schema = TenantMiddleware.hostname2schema(legacy_hostname)
|
||||||
tenant = get_tenant_model()(schema_name=schema, domain_url=hostname)
|
tenant = get_tenant_model()(schema_name=schema, domain_url=hostname)
|
||||||
if verbosity >= 1:
|
if verbosity >= 1:
|
||||||
msg = self.style.NOTICE("=== Creating schema ") + self.style.SQL_TABLE(tenant.schema_name)
|
msg = self.style.NOTICE('=== Creating schema ') + self.style.SQL_TABLE(tenant.schema_name)
|
||||||
if legacy_schema:
|
if legacy_schema:
|
||||||
msg = (
|
msg = (
|
||||||
self.style.NOTICE("=== Renamin schema ")
|
self.style.NOTICE('=== Renamin schema ')
|
||||||
+ self.style.SQL_TABLE(legacy_schema)
|
+ self.style.SQL_TABLE(legacy_schema)
|
||||||
+ " to "
|
+ ' to '
|
||||||
+ self.style.SQL_TABLE(tenant.schema_name)
|
+ self.style.SQL_TABLE(tenant.schema_name)
|
||||||
)
|
)
|
||||||
print()
|
print()
|
||||||
|
|
|
@ -6,7 +6,7 @@ from hobo.multitenant.middleware import TenantMiddleware
|
||||||
|
|
||||||
|
|
||||||
class Command(BaseCommand):
|
class Command(BaseCommand):
|
||||||
help = "Delete tenant(s) by hostname(s)"
|
help = 'Delete tenant(s) by hostname(s)'
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
parser.add_argument(
|
parser.add_argument(
|
||||||
|
@ -19,7 +19,7 @@ class Command(BaseCommand):
|
||||||
|
|
||||||
def handle(self, hostnames, **options):
|
def handle(self, hostnames, **options):
|
||||||
if not hostnames:
|
if not hostnames:
|
||||||
raise CommandError("you must give at least one tenant hostname")
|
raise CommandError('you must give at least one tenant hostname')
|
||||||
|
|
||||||
if '-' in hostnames: # get additional list of hostnames from stdin
|
if '-' in hostnames: # get additional list of hostnames from stdin
|
||||||
hostnames = list(hostnames)
|
hostnames = list(hostnames)
|
||||||
|
|
|
@ -11,4 +11,4 @@ class Command(BaseCommand):
|
||||||
all_tenants = TenantMiddleware.get_tenants()
|
all_tenants = TenantMiddleware.get_tenants()
|
||||||
|
|
||||||
for tenant in all_tenants:
|
for tenant in all_tenants:
|
||||||
print(f"{tenant.schema_name} {tenant.domain_url}")
|
print(f'{tenant.schema_name} {tenant.domain_url}')
|
||||||
|
|
|
@ -26,7 +26,7 @@ from hobo.multitenant.middleware import TenantMiddleware, TenantNotFound
|
||||||
|
|
||||||
|
|
||||||
class MigrateSchemasCommand(SyncCommon):
|
class MigrateSchemasCommand(SyncCommon):
|
||||||
help = "Updates database schema. Manages both apps with migrations and those without."
|
help = 'Updates database schema. Manages both apps with migrations and those without.'
|
||||||
requires_system_checks = []
|
requires_system_checks = []
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
|
@ -70,7 +70,7 @@ class MigrateSchemasCommand(SyncCommon):
|
||||||
if all([x in applied_migrations for x in all_migrations]):
|
if all([x in applied_migrations for x in all_migrations]):
|
||||||
if int(self.options.get('verbosity', 1)) >= 1:
|
if int(self.options.get('verbosity', 1)) >= 1:
|
||||||
self._notice(
|
self._notice(
|
||||||
"=== Skipping migrations of tenant %s (%s/%s)"
|
'=== Skipping migrations of tenant %s (%s/%s)'
|
||||||
% (tenant.domain_url, step, len_tenants)
|
% (tenant.domain_url, step, len_tenants)
|
||||||
)
|
)
|
||||||
continue
|
continue
|
||||||
|
@ -90,7 +90,7 @@ class MigrateSchemasCommand(SyncCommon):
|
||||||
|
|
||||||
def run_migrations(self, tenant, included_apps, step=1, steps=1):
|
def run_migrations(self, tenant, included_apps, step=1, steps=1):
|
||||||
if int(self.options.get('verbosity', 1)) >= 1:
|
if int(self.options.get('verbosity', 1)) >= 1:
|
||||||
self._notice("=== Running migrate for tenant %s (%s/%s)" % (tenant.domain_url, step, steps))
|
self._notice('=== Running migrate for tenant %s (%s/%s)' % (tenant.domain_url, step, steps))
|
||||||
connection.set_tenant(tenant, include_public=False)
|
connection.set_tenant(tenant, include_public=False)
|
||||||
command = MigrateCommand()
|
command = MigrateCommand()
|
||||||
command.requires_system_checks = False
|
command.requires_system_checks = False
|
||||||
|
@ -100,7 +100,7 @@ class MigrateSchemasCommand(SyncCommon):
|
||||||
|
|
||||||
def run_migrations_on_schema(self, schema, included_apps):
|
def run_migrations_on_schema(self, schema, included_apps):
|
||||||
if int(self.options.get('verbosity', 1)) >= 1:
|
if int(self.options.get('verbosity', 1)) >= 1:
|
||||||
self._notice("=== Running migrate for schema %s" % schema)
|
self._notice('=== Running migrate for schema %s' % schema)
|
||||||
connection.set_schema(schema, include_public=False)
|
connection.set_schema(schema, include_public=False)
|
||||||
command = MigrateCommand()
|
command = MigrateCommand()
|
||||||
command.requires_system_checks = False
|
command.requires_system_checks = False
|
||||||
|
|
|
@ -23,7 +23,7 @@ from hobo.multitenant.middleware import TenantMiddleware, TenantNotFound
|
||||||
|
|
||||||
|
|
||||||
class ShowMigrationsSchemasCommand(SyncCommon):
|
class ShowMigrationsSchemasCommand(SyncCommon):
|
||||||
help = "Show database schema migrations."
|
help = 'Show database schema migrations.'
|
||||||
|
|
||||||
def add_arguments(self, parser):
|
def add_arguments(self, parser):
|
||||||
super().add_arguments(parser)
|
super().add_arguments(parser)
|
||||||
|
@ -43,7 +43,7 @@ class ShowMigrationsSchemasCommand(SyncCommon):
|
||||||
self.run_showmigrations(tenant, settings.TENANT_APPS)
|
self.run_showmigrations(tenant, settings.TENANT_APPS)
|
||||||
|
|
||||||
def run_showmigrations(self, tenant, included_apps):
|
def run_showmigrations(self, tenant, included_apps):
|
||||||
self._notice("=== Show migrations for schema %s" % tenant.domain_url)
|
self._notice('=== Show migrations for schema %s' % tenant.domain_url)
|
||||||
connection.set_tenant(tenant, include_public=False)
|
connection.set_tenant(tenant, include_public=False)
|
||||||
command = ShowMigrationsCommand()
|
command = ShowMigrationsCommand()
|
||||||
command.execute(*self.args, **self.options)
|
command.execute(*self.args, **self.options)
|
||||||
|
|
|
@ -64,7 +64,7 @@ def run_command_from_argv(command, argv):
|
||||||
|
|
||||||
|
|
||||||
class Command(InteractiveTenantOption, BaseCommand):
|
class Command(InteractiveTenantOption, BaseCommand):
|
||||||
help = "Wrapper around django commands for use with an individual tenant"
|
help = 'Wrapper around django commands for use with an individual tenant'
|
||||||
args = '<other_command>'
|
args = '<other_command>'
|
||||||
|
|
||||||
def run_from_argv(self, argv):
|
def run_from_argv(self, argv):
|
||||||
|
@ -77,7 +77,7 @@ class Command(InteractiveTenantOption, BaseCommand):
|
||||||
try:
|
try:
|
||||||
app_name = get_commands()[argv[2]]
|
app_name = get_commands()[argv[2]]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
raise CommandError("Unknown command: %r" % argv[2])
|
raise CommandError('Unknown command: %r' % argv[2])
|
||||||
|
|
||||||
if isinstance(app_name, BaseCommand):
|
if isinstance(app_name, BaseCommand):
|
||||||
# if the command is already loaded, use it directly.
|
# if the command is already loaded, use it directly.
|
||||||
|
@ -92,8 +92,8 @@ class Command(InteractiveTenantOption, BaseCommand):
|
||||||
# and forward the rest of the arguments to the actual command being wrapped.
|
# and forward the rest of the arguments to the actual command being wrapped.
|
||||||
del argv[1]
|
del argv[1]
|
||||||
args_parser = argparse.ArgumentParser()
|
args_parser = argparse.ArgumentParser()
|
||||||
args_parser.add_argument("--all-tenants", help="apply command to all tenants", action='store_true')
|
args_parser.add_argument('--all-tenants', help='apply command to all tenants', action='store_true')
|
||||||
args_parser.add_argument("-d", "--domain", dest="domain_name", help="specify tenant domain name")
|
args_parser.add_argument('-d', '--domain', dest='domain_name', help='specify tenant domain name')
|
||||||
args_parser.add_argument(
|
args_parser.add_argument(
|
||||||
'--force-job',
|
'--force-job',
|
||||||
dest='force_job',
|
dest='force_job',
|
||||||
|
|
|
@ -75,7 +75,7 @@ class Tenant(TenantMixin):
|
||||||
if connection.schema_name not in (self.schema_name, get_public_schema_name()):
|
if connection.schema_name not in (self.schema_name, get_public_schema_name()):
|
||||||
raise Exception(
|
raise Exception(
|
||||||
"Can't delete tenant outside it's own schema or "
|
"Can't delete tenant outside it's own schema or "
|
||||||
"the public schema. Current schema is %s." % connection.schema_name
|
'the public schema. Current schema is %s.' % connection.schema_name
|
||||||
)
|
)
|
||||||
if force_drop:
|
if force_drop:
|
||||||
rmtree(self.get_directory())
|
rmtree(self.get_directory())
|
||||||
|
|
|
@ -22,7 +22,7 @@ from hobo.environment.utils import get_variable, set_variable
|
||||||
|
|
||||||
from .forms import RobotsTxtForm, SettingsForm
|
from .forms import RobotsTxtForm, SettingsForm
|
||||||
|
|
||||||
ALLOW = ""
|
ALLOW = ''
|
||||||
DISALLOW = """User-agent: *
|
DISALLOW = """User-agent: *
|
||||||
Disallow: /"""
|
Disallow: /"""
|
||||||
|
|
||||||
|
|
|
@ -35,7 +35,7 @@ def get_safe_db_name(max_length=53):
|
||||||
return 'hobo-test'
|
return 'hobo-test'
|
||||||
BRANCH_NAME = os.environ.get('BRANCH_NAME', '').replace('/', '-')[:15]
|
BRANCH_NAME = os.environ.get('BRANCH_NAME', '').replace('/', '-')[:15]
|
||||||
parts = [BRANCH_NAME]
|
parts = [BRANCH_NAME]
|
||||||
if not os.environ.get("TOX_PARALLEL_ENV"):
|
if not os.environ.get('TOX_PARALLEL_ENV'):
|
||||||
# when we're in parallel mode, pytest-django will do this
|
# when we're in parallel mode, pytest-django will do this
|
||||||
# for us at a later point
|
# for us at a later point
|
||||||
parts.append(os.environ.get('TOX_ENV_NAME'))
|
parts.append(os.environ.get('TOX_ENV_NAME'))
|
||||||
|
@ -57,5 +57,5 @@ def find_free_port():
|
||||||
s.bind(('', 0))
|
s.bind(('', 0))
|
||||||
# SO_LINGER (man 7 socket) l_onoff=1 l_linger=0, immediately release
|
# SO_LINGER (man 7 socket) l_onoff=1 l_linger=0, immediately release
|
||||||
# the port on closing of the socket
|
# the port on closing of the socket
|
||||||
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack("ii", 1, 0))
|
s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, struct.pack('ii', 1, 0))
|
||||||
return s.getsockname()[1]
|
return s.getsockname()[1]
|
||||||
|
|
|
@ -11,6 +11,6 @@ import os
|
||||||
|
|
||||||
from django.core.wsgi import get_wsgi_application
|
from django.core.wsgi import get_wsgi_application
|
||||||
|
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hobo.settings")
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hobo.settings')
|
||||||
|
|
||||||
application = get_wsgi_application()
|
application = get_wsgi_application()
|
||||||
|
|
|
@ -2,8 +2,8 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == '__main__':
|
||||||
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "hobo.settings")
|
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'hobo.settings')
|
||||||
|
|
||||||
from django.core.management import execute_from_command_line
|
from django.core.management import execute_from_command_line
|
||||||
|
|
||||||
|
|
|
@ -27,133 +27,133 @@ from hobo.environment.models import Authentic, Variable, Wcs
|
||||||
pytestmark = pytest.mark.django_db
|
pytestmark = pytest.mark.django_db
|
||||||
|
|
||||||
WCS_AVAILABLE_OBJECTS = {
|
WCS_AVAILABLE_OBJECTS = {
|
||||||
"data": [
|
'data': [
|
||||||
{
|
{
|
||||||
"id": "forms",
|
'id': 'forms',
|
||||||
"text": "Forms",
|
'text': 'Forms',
|
||||||
"singular": "Form",
|
'singular': 'Form',
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/forms/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/forms/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "cards",
|
'id': 'cards',
|
||||||
"text": "Card Models",
|
'text': 'Card Models',
|
||||||
"singular": "Card Model",
|
'singular': 'Card Model',
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/cards/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/cards/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "workflows",
|
'id': 'workflows',
|
||||||
"text": "Workflows",
|
'text': 'Workflows',
|
||||||
"singular": "Workflow",
|
'singular': 'Workflow',
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/workflows/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/workflows/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "blocks",
|
'id': 'blocks',
|
||||||
"text": "Blocks",
|
'text': 'Blocks',
|
||||||
"singular": "Block of fields",
|
'singular': 'Block of fields',
|
||||||
"minor": True,
|
'minor': True,
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/blocks/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/blocks/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "data-sources",
|
'id': 'data-sources',
|
||||||
"text": "Data Sources",
|
'text': 'Data Sources',
|
||||||
"singular": "Data Source",
|
'singular': 'Data Source',
|
||||||
"minor": True,
|
'minor': True,
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/data-sources/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/data-sources/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "mail-templates",
|
'id': 'mail-templates',
|
||||||
"text": "Mail Templates",
|
'text': 'Mail Templates',
|
||||||
"singular": "Mail Template",
|
'singular': 'Mail Template',
|
||||||
"minor": True,
|
'minor': True,
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/mail-templates/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/mail-templates/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "comment-templates-categories",
|
'id': 'comment-templates-categories',
|
||||||
"text": "Categories (comment templates)",
|
'text': 'Categories (comment templates)',
|
||||||
"singular": "Category (comment templates)",
|
'singular': 'Category (comment templates)',
|
||||||
"minor": True,
|
'minor': True,
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/comment-templates-categories/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/comment-templates-categories/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "wscalls",
|
'id': 'wscalls',
|
||||||
"text": "Webservice Calls",
|
'text': 'Webservice Calls',
|
||||||
"singular": "Webservice Call",
|
'singular': 'Webservice Call',
|
||||||
"minor": True,
|
'minor': True,
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/wscalls/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/wscalls/'},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "roles",
|
'id': 'roles',
|
||||||
"text": "Roles",
|
'text': 'Roles',
|
||||||
"singular": "Role",
|
'singular': 'Role',
|
||||||
"minor": True,
|
'minor': True,
|
||||||
"urls": {"list": "https://wcs.example.invalid/api/export-import/roles/"},
|
'urls': {'list': 'https://wcs.example.invalid/api/export-import/roles/'},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
WCS_AVAILABLE_FORMS = {
|
WCS_AVAILABLE_FORMS = {
|
||||||
"data": [
|
'data': [
|
||||||
{
|
{
|
||||||
"id": "test-form",
|
'id': 'test-form',
|
||||||
"text": "Test Form",
|
'text': 'Test Form',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/test-form/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/test-form/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/test-form/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/test-form/dependencies/',
|
||||||
"redirect": "https://wcs.example.invalid/api/export-import/forms/test-form/redirect/",
|
'redirect': 'https://wcs.example.invalid/api/export-import/forms/test-form/redirect/',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "test2-form",
|
'id': 'test2-form',
|
||||||
"text": "Second Test Form",
|
'text': 'Second Test Form',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/test2-form/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/test2-form/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/test2-form/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/test2-form/dependencies/',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "foo2-form",
|
'id': 'foo2-form',
|
||||||
"text": "Foo2 Test Form",
|
'text': 'Foo2 Test Form',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"category": "Foo",
|
'category': 'Foo',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/foo2-form/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/foo2-form/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/foo2-form/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/foo2-form/dependencies/',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "foo-form",
|
'id': 'foo-form',
|
||||||
"text": "Foo Test Form",
|
'text': 'Foo Test Form',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"category": "Foo",
|
'category': 'Foo',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/foo-form/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/foo-form/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/foo-form/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/foo-form/dependencies/',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "bar-form",
|
'id': 'bar-form',
|
||||||
"text": "Bar Test Form",
|
'text': 'Bar Test Form',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"category": "Bar",
|
'category': 'Bar',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/bar-form/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/bar-form/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/bar-form/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/bar-form/dependencies/',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
WCS_FORM_DEPENDENCIES = {
|
WCS_FORM_DEPENDENCIES = {
|
||||||
"data": [
|
'data': [
|
||||||
{
|
{
|
||||||
"id": "test-card",
|
'id': 'test-card',
|
||||||
"text": "Test Card",
|
'text': 'Test Card',
|
||||||
"type": "cards",
|
'type': 'cards',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/cards/test-card/",
|
'export': 'https://wcs.example.invalid/api/export-import/cards/test-card/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -511,7 +511,7 @@ def test_scandeps_on_unknown_element(app, admin_user, settings):
|
||||||
name='Unknown',
|
name='Unknown',
|
||||||
cache={
|
cache={
|
||||||
'urls': {
|
'urls': {
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/unknown/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/unknown/dependencies/',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -585,13 +585,13 @@ def test_scandeps_on_renamed_element(app, admin_user, settings):
|
||||||
)
|
)
|
||||||
Relation.objects.create(application=application, element=element)
|
Relation.objects.create(application=application, element=element)
|
||||||
element2 = Element.objects.create(
|
element2 = Element.objects.create(
|
||||||
type="cards",
|
type='cards',
|
||||||
slug="test-card",
|
slug='test-card',
|
||||||
name="Test Card",
|
name='Test Card',
|
||||||
cache={
|
cache={
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/cards/test-card/",
|
'export': 'https://wcs.example.invalid/api/export-import/cards/test-card/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/',
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
@ -601,15 +601,15 @@ def test_scandeps_on_renamed_element(app, admin_user, settings):
|
||||||
if url.path == '/api/export-import/forms/':
|
if url.path == '/api/export-import/forms/':
|
||||||
return {
|
return {
|
||||||
'content': {
|
'content': {
|
||||||
"data": [
|
'data': [
|
||||||
{
|
{
|
||||||
"id": "test-form",
|
'id': 'test-form',
|
||||||
"text": "Test Form (renamed)",
|
'text': 'Test Form (renamed)',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/test-form/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/test-form/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/test-form/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/test-form/dependencies/',
|
||||||
"redirect": "https://wcs.example.invalid/api/export-import/forms/test-form/redirect/",
|
'redirect': 'https://wcs.example.invalid/api/export-import/forms/test-form/redirect/',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
@ -619,13 +619,13 @@ def test_scandeps_on_renamed_element(app, admin_user, settings):
|
||||||
if url.path == '/api/export-import/forms/test-form/dependencies/':
|
if url.path == '/api/export-import/forms/test-form/dependencies/':
|
||||||
return {
|
return {
|
||||||
'content': {
|
'content': {
|
||||||
"data": [
|
'data': [
|
||||||
{
|
{
|
||||||
"id": "test-card",
|
'id': 'test-card',
|
||||||
"text": "Test Card (renamed)",
|
'text': 'Test Card (renamed)',
|
||||||
"type": "cards",
|
'type': 'cards',
|
||||||
"urls": {
|
'urls': {
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
@ -642,23 +642,23 @@ def test_scandeps_on_renamed_element(app, admin_user, settings):
|
||||||
element.refresh_from_db()
|
element.refresh_from_db()
|
||||||
assert element.name == 'Test Form (renamed)'
|
assert element.name == 'Test Form (renamed)'
|
||||||
assert element.cache == {
|
assert element.cache == {
|
||||||
"id": "test-form",
|
'id': 'test-form',
|
||||||
"text": "Test Form (renamed)",
|
'text': 'Test Form (renamed)',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/test-form/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/test-form/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/test-form/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/test-form/dependencies/',
|
||||||
"redirect": "https://wcs.example.invalid/api/export-import/forms/test-form/redirect/",
|
'redirect': 'https://wcs.example.invalid/api/export-import/forms/test-form/redirect/',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
element2 = Element.objects.get(relation__auto_dependency=True)
|
element2 = Element.objects.get(relation__auto_dependency=True)
|
||||||
assert element2.name == 'Test Card (renamed)'
|
assert element2.name == 'Test Card (renamed)'
|
||||||
assert element2.cache == {
|
assert element2.cache == {
|
||||||
"id": "test-card",
|
'id': 'test-card',
|
||||||
"text": "Test Card (renamed)",
|
'text': 'Test Card (renamed)',
|
||||||
"type": "cards",
|
'type': 'cards',
|
||||||
"urls": {
|
'urls': {
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/cards/test-card/dependencies/',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -959,20 +959,20 @@ def test_deploy_application(app, admin_user, settings, app_bundle, app_bundle_wi
|
||||||
assert job.exception == 'Failed to deploy module wcs (500)'
|
assert job.exception == 'Failed to deploy module wcs (500)'
|
||||||
|
|
||||||
form_def = {
|
form_def = {
|
||||||
"id": "test",
|
'id': 'test',
|
||||||
"text": "Test",
|
'text': 'Test',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/test/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/test/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/test/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/test/dependencies/',
|
||||||
"redirect": "https://wcs.example.invalid/api/export-import/forms/test/redirect/",
|
'redirect': 'https://wcs.example.invalid/api/export-import/forms/test/redirect/',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def response_content(url, request): # noqa pylint: disable=function-redefined
|
def response_content(url, request): # noqa pylint: disable=function-redefined
|
||||||
if url.path == '/api/export-import/forms/':
|
if url.path == '/api/export-import/forms/':
|
||||||
return {
|
return {
|
||||||
'content': {"data": [form_def]},
|
'content': {'data': [form_def]},
|
||||||
'status_code': 200,
|
'status_code': 200,
|
||||||
}
|
}
|
||||||
return mocked_http(url, request)
|
return mocked_http(url, request)
|
||||||
|
@ -1245,20 +1245,20 @@ def test_refresh_application(app, admin_user, settings):
|
||||||
Relation.objects.create(application=application, element=element)
|
Relation.objects.create(application=application, element=element)
|
||||||
|
|
||||||
form_def = {
|
form_def = {
|
||||||
"id": "test",
|
'id': 'test',
|
||||||
"text": "Test",
|
'text': 'Test',
|
||||||
"type": "forms",
|
'type': 'forms',
|
||||||
"urls": {
|
'urls': {
|
||||||
"export": "https://wcs.example.invalid/api/export-import/forms/test/",
|
'export': 'https://wcs.example.invalid/api/export-import/forms/test/',
|
||||||
"dependencies": "https://wcs.example.invalid/api/export-import/forms/test/dependencies/",
|
'dependencies': 'https://wcs.example.invalid/api/export-import/forms/test/dependencies/',
|
||||||
"redirect": "https://wcs.example.invalid/api/export-import/forms/test/redirect/",
|
'redirect': 'https://wcs.example.invalid/api/export-import/forms/test/redirect/',
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
def response_content(url, request):
|
def response_content(url, request):
|
||||||
if url.path == '/api/export-import/forms/':
|
if url.path == '/api/export-import/forms/':
|
||||||
return {
|
return {
|
||||||
'content': {"data": [form_def]},
|
'content': {'data': [form_def]},
|
||||||
'status_code': 200,
|
'status_code': 200,
|
||||||
}
|
}
|
||||||
return mocked_http(url, request)
|
return mocked_http(url, request)
|
||||||
|
@ -1608,7 +1608,7 @@ def app_bundle_parameters():
|
||||||
'slug': 'test',
|
'slug': 'test',
|
||||||
'description': '',
|
'description': '',
|
||||||
'elements': [],
|
'elements': [],
|
||||||
'parameters': [{"label": "Foo", "name": "app_foo", "default_value": "xxx"}],
|
'parameters': [{'label': 'Foo', 'name': 'app_foo', 'default_value': 'xxx'}],
|
||||||
}
|
}
|
||||||
manifest_fd = io.BytesIO(json.dumps(manifest_json, indent=2).encode())
|
manifest_fd = io.BytesIO(json.dumps(manifest_json, indent=2).encode())
|
||||||
tarinfo = tarfile.TarInfo('manifest.json')
|
tarinfo = tarfile.TarInfo('manifest.json')
|
||||||
|
|
|
@ -139,8 +139,8 @@ def test_service_creation_url_validation(app, admin_user, monkeypatch):
|
||||||
app = login(app)
|
app = login(app)
|
||||||
response = app.get('/sites/new-combo')
|
response = app.get('/sites/new-combo')
|
||||||
form = response.form
|
form = response.form
|
||||||
form['title'] = "test"
|
form['title'] = 'test'
|
||||||
form['base_url'] = "http://portal-test.example.net"
|
form['base_url'] = 'http://portal-test.example.net'
|
||||||
response = form.submit()
|
response = form.submit()
|
||||||
assert 'not resolvable' in response
|
assert 'not resolvable' in response
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ def test_is_resolvable(app, admin_user, services, monkeypatch):
|
||||||
cache.clear()
|
cache.clear()
|
||||||
|
|
||||||
def gethostname(netloc):
|
def gethostname(netloc):
|
||||||
if netloc == "jazz.example.publik":
|
if netloc == 'jazz.example.publik':
|
||||||
return '176.31.123.109'
|
return '176.31.123.109'
|
||||||
else:
|
else:
|
||||||
raise socket.gaierror
|
raise socket.gaierror
|
||||||
|
|
|
@ -95,7 +95,7 @@ def test_healt_view(app):
|
||||||
|
|
||||||
|
|
||||||
def test_menu_view(app, admin_user):
|
def test_menu_view(app, admin_user):
|
||||||
expected = [{"slug": "system", "label": "System", "url": "http://testserver/"}]
|
expected = [{'slug': 'system', 'label': 'System', 'url': 'http://testserver/'}]
|
||||||
app = login(app)
|
app = login(app)
|
||||||
resp = app.get('/menu.json')
|
resp = app.get('/menu.json')
|
||||||
assert resp.content_type == 'application/json'
|
assert resp.content_type == 'application/json'
|
||||||
|
|
|
@ -87,7 +87,7 @@ def test_manage(app, admin_user, settings):
|
||||||
resp.form.set('maintenance_pass_trough_header', '')
|
resp.form.set('maintenance_pass_trough_header', '')
|
||||||
resp.form.set('disable_cron', False)
|
resp.form.set('disable_cron', False)
|
||||||
resp = resp.form.submit()
|
resp = resp.form.submit()
|
||||||
assert "No HTTP header pass through is configured" in resp.text
|
assert 'No HTTP header pass through is configured' in resp.text
|
||||||
assert 'Check this box if you are sure to enable the maintenance page.' in resp.text
|
assert 'Check this box if you are sure to enable the maintenance page.' in resp.text
|
||||||
|
|
||||||
# check the confirmation checkbox
|
# check the confirmation checkbox
|
||||||
|
|
|
@ -357,7 +357,7 @@ def test_parse_response():
|
||||||
|
|
||||||
# error (not XML format)
|
# error (not XML format)
|
||||||
content = """this is not XML"""
|
content = """this is not XML"""
|
||||||
with pytest.raises(MatomoException, match="XMLSyntaxError: Start tag expected"):
|
with pytest.raises(MatomoException, match='XMLSyntaxError: Start tag expected'):
|
||||||
tree = matomo.parse_response(content)
|
tree = matomo.parse_response(content)
|
||||||
|
|
||||||
|
|
||||||
|
@ -475,20 +475,20 @@ def test_add_site(mocked_post):
|
||||||
# success
|
# success
|
||||||
content = ADD_SITE_SUCCESS
|
content = ADD_SITE_SUCCESS
|
||||||
mocked_post.return_value.content = content
|
mocked_post.return_value.content = content
|
||||||
site_id = matomo.add_site("hobo.dev.publik.love")
|
site_id = matomo.add_site('hobo.dev.publik.love')
|
||||||
assert site_id == '42'
|
assert site_id == '42'
|
||||||
|
|
||||||
# error
|
# error
|
||||||
content = ADD_SITE_ERROR
|
content = ADD_SITE_ERROR
|
||||||
mocked_post.return_value.content = content
|
mocked_post.return_value.content = content
|
||||||
with pytest.raises(MatomoError, match="Please specify a value for 'siteName'."):
|
with pytest.raises(MatomoError, match="Please specify a value for 'siteName'."):
|
||||||
site_id = matomo.add_site("hobo.dev.publik.love")
|
site_id = matomo.add_site('hobo.dev.publik.love')
|
||||||
|
|
||||||
# strange message
|
# strange message
|
||||||
content = ADD_SITE_BAD_RESPONSE
|
content = ADD_SITE_BAD_RESPONSE
|
||||||
mocked_post.return_value.content = content
|
mocked_post.return_value.content = content
|
||||||
with pytest.raises(MatomoException, match='add_site fails'):
|
with pytest.raises(MatomoException, match='add_site fails'):
|
||||||
site_id = matomo.add_site("hobo.dev.publik.love")
|
site_id = matomo.add_site('hobo.dev.publik.love')
|
||||||
|
|
||||||
|
|
||||||
@mock.patch('requests.post')
|
@mock.patch('requests.post')
|
||||||
|
@ -666,32 +666,32 @@ def test_upgrade_site(mocked_post):
|
||||||
# site not already here
|
# site not already here
|
||||||
contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS]
|
contents = [GET_NO_SITE_FROM_URL, ADD_SITE_SUCCESS, ADD_SITE_ALIAS_URLS_SUCCESS]
|
||||||
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
||||||
site_id = upgrade_site(matomo, "hobo.dev.publik.love", urls)
|
site_id = upgrade_site(matomo, 'hobo.dev.publik.love', urls)
|
||||||
assert site_id == '42'
|
assert site_id == '42'
|
||||||
|
|
||||||
# site already here
|
# site already here
|
||||||
contents = [GET_SITE_42_FROM_URL, ADD_SITE_ALIAS_URLS_SUCCESS]
|
contents = [GET_SITE_42_FROM_URL, ADD_SITE_ALIAS_URLS_SUCCESS]
|
||||||
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
||||||
site_id = upgrade_site(matomo, "hobo.dev.publik.love", urls)
|
site_id = upgrade_site(matomo, 'hobo.dev.publik.love', urls)
|
||||||
assert site_id == '42'
|
assert site_id == '42'
|
||||||
|
|
||||||
# error while updating urls
|
# error while updating urls
|
||||||
contents = [GET_SITE_42_FROM_URL, ADD_SITE_ALIAS_URLS_ERROR]
|
contents = [GET_SITE_42_FROM_URL, ADD_SITE_ALIAS_URLS_ERROR]
|
||||||
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
||||||
with pytest.raises(MatomoException):
|
with pytest.raises(MatomoException):
|
||||||
upgrade_site(matomo, "hobo.dev.publik.love", urls)
|
upgrade_site(matomo, 'hobo.dev.publik.love', urls)
|
||||||
|
|
||||||
# error while adding new site
|
# error while adding new site
|
||||||
contents = [GET_NO_SITE_FROM_URL, MATOMO_ERROR]
|
contents = [GET_NO_SITE_FROM_URL, MATOMO_ERROR]
|
||||||
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
||||||
with pytest.raises(MatomoException):
|
with pytest.raises(MatomoException):
|
||||||
upgrade_site(matomo, "hobo.dev.publik.love", urls)
|
upgrade_site(matomo, 'hobo.dev.publik.love', urls)
|
||||||
|
|
||||||
# error while looking for site already there
|
# error while looking for site already there
|
||||||
contents = [MATOMO_ERROR]
|
contents = [MATOMO_ERROR]
|
||||||
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
||||||
with pytest.raises(MatomoException, match='here is the error message'):
|
with pytest.raises(MatomoException, match='here is the error message'):
|
||||||
upgrade_site(matomo, "hobo.dev.publik.love", urls)
|
upgrade_site(matomo, 'hobo.dev.publik.love', urls)
|
||||||
|
|
||||||
|
|
||||||
@mock.patch('requests.post')
|
@mock.patch('requests.post')
|
||||||
|
@ -755,7 +755,7 @@ def test_get_tracking_js():
|
||||||
var2.delete()
|
var2.delete()
|
||||||
get_variable('cnil_compliant_visits_tracking_js', 'content1')
|
get_variable('cnil_compliant_visits_tracking_js', 'content1')
|
||||||
get_variable('visits_tracking_js', 'content2')
|
get_variable('visits_tracking_js', 'content2')
|
||||||
assert get_tracking_js() == "content1content2"
|
assert get_tracking_js() == 'content1content2'
|
||||||
|
|
||||||
|
|
||||||
def test_put_tracking_js():
|
def test_put_tracking_js():
|
||||||
|
@ -862,7 +862,7 @@ def test_auto_configure_matomo_error(mocked_post):
|
||||||
JAVASCRIPT_TAG_BAD_RESPONSE,
|
JAVASCRIPT_TAG_BAD_RESPONSE,
|
||||||
]
|
]
|
||||||
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
mocked_post.side_effect = requests_post_mocked_replies(contents)
|
||||||
with pytest.raises(MatomoException, match="get_javascript_tag fails"):
|
with pytest.raises(MatomoException, match='get_javascript_tag fails'):
|
||||||
matomo = MatomoWS()
|
matomo = MatomoWS()
|
||||||
auto_configure_matomo(matomo)
|
auto_configure_matomo(matomo)
|
||||||
tracking_js_var = get_variable('visits_tracking_js')
|
tracking_js_var = get_variable('visits_tracking_js')
|
||||||
|
|
|
@ -65,7 +65,7 @@ def test_home(app, admin_user):
|
||||||
def test_allow(app, admin_user):
|
def test_allow(app, admin_user):
|
||||||
login(app)
|
login(app)
|
||||||
variable = get_variable('robots_txt')
|
variable = get_variable('robots_txt')
|
||||||
variable.value = "some content"
|
variable.value = 'some content'
|
||||||
variable.save()
|
variable.save()
|
||||||
resp = app.get('/seo/allow', status=302)
|
resp = app.get('/seo/allow', status=302)
|
||||||
assert resp.location.endswith('/seo/')
|
assert resp.location.endswith('/seo/')
|
||||||
|
@ -75,7 +75,7 @@ def test_allow(app, admin_user):
|
||||||
def test_disallow(app, admin_user):
|
def test_disallow(app, admin_user):
|
||||||
login(app)
|
login(app)
|
||||||
variable = get_variable('robots_txt')
|
variable = get_variable('robots_txt')
|
||||||
variable.value = "some content"
|
variable.value = 'some content'
|
||||||
variable.save()
|
variable.save()
|
||||||
resp = app.get('/seo/disallow', status=302)
|
resp = app.get('/seo/disallow', status=302)
|
||||||
assert resp.location.endswith('/seo/')
|
assert resp.location.endswith('/seo/')
|
||||||
|
@ -87,7 +87,7 @@ def test_disallow(app, admin_user):
|
||||||
def test_custom(app, admin_user):
|
def test_custom(app, admin_user):
|
||||||
login(app)
|
login(app)
|
||||||
variable = get_variable('robots_txt')
|
variable = get_variable('robots_txt')
|
||||||
variable.value = "some content"
|
variable.value = 'some content'
|
||||||
variable.save()
|
variable.save()
|
||||||
resp = app.get('/seo/customize', status=200)
|
resp = app.get('/seo/customize', status=200)
|
||||||
assert resp.html.textarea['name'] == 'content'
|
assert resp.html.textarea['name'] == 'content'
|
||||||
|
|
|
@ -19,7 +19,7 @@ def test_theme_view(mocked_random, app, admin_user, fake_themes):
|
||||||
assert Variable.objects.filter(name='foo')[0].value == 'bar'
|
assert Variable.objects.filter(name='foo')[0].value == 'bar'
|
||||||
assert resp.location == '/theme/'
|
assert resp.location == '/theme/'
|
||||||
resp = resp.follow()
|
resp = resp.follow()
|
||||||
assert "The theme has been changed" in str(resp.html)
|
assert 'The theme has been changed' in str(resp.html)
|
||||||
assert resp.form['theme'].value == 'alfortville'
|
assert resp.form['theme'].value == 'alfortville'
|
||||||
|
|
||||||
resp.form['theme'].value = 'publik'
|
resp.form['theme'].value = 'publik'
|
||||||
|
|
|
@ -87,7 +87,7 @@ def tenant_factory(transactional_db, tenant_base, settings):
|
||||||
for tenant in tenants:
|
for tenant in tenants:
|
||||||
with tenant_context(tenant):
|
with tenant_context(tenant):
|
||||||
call_command(
|
call_command(
|
||||||
"flush",
|
'flush',
|
||||||
verbosity=0,
|
verbosity=0,
|
||||||
interactive=False,
|
interactive=False,
|
||||||
database='default',
|
database='default',
|
||||||
|
|
|
@ -370,7 +370,7 @@ def test_multipublik(tenants, mocker):
|
||||||
assert service['legacy_urls'][0]['base_url'] == 'https://combo1.example.net/'
|
assert service['legacy_urls'][0]['base_url'] == 'https://combo1.example.net/'
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
assert False, "no portal found"
|
assert False, 'no portal found'
|
||||||
|
|
||||||
# inform coll2 about interco environment
|
# inform coll2 about interco environment
|
||||||
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
HoboDeployCommand().handle(hobo2.base_url, get_hobo_json_filename(hobo1))
|
||||||
|
@ -408,7 +408,7 @@ def test_multipublik(tenants, mocker):
|
||||||
assert service['legacy_urls'][0]['base_url'] == 'https://combo2.example.net/'
|
assert service['legacy_urls'][0]['base_url'] == 'https://combo2.example.net/'
|
||||||
break
|
break
|
||||||
else:
|
else:
|
||||||
assert False, "no portal found"
|
assert False, 'no portal found'
|
||||||
|
|
||||||
# inform interco about coll2 environment
|
# inform interco about coll2 environment
|
||||||
HoboDeployCommand().handle(hobo1.base_url, get_hobo_json_filename(hobo2))
|
HoboDeployCommand().handle(hobo1.base_url, get_hobo_json_filename(hobo2))
|
||||||
|
|
|
@ -34,10 +34,10 @@ def make_tenant(tmp_path, transactional_db, settings, request):
|
||||||
'theme': 'publik',
|
'theme': 'publik',
|
||||||
'SETTING_GLOBAL1': True,
|
'SETTING_GLOBAL1': True,
|
||||||
'SETTING_GLOBAL2.extend': [2, 3, 4],
|
'SETTING_GLOBAL2.extend': [2, 3, 4],
|
||||||
'SETTING_GLOBAL3.update': {"x": 1, "y": 2},
|
'SETTING_GLOBAL3.update': {'x': 1, 'y': 2},
|
||||||
'SETTING_OVERRIDE1': False,
|
'SETTING_OVERRIDE1': False,
|
||||||
'SETTING_OVERRIDE2.extend': [6, 7, 8],
|
'SETTING_OVERRIDE2.extend': [6, 7, 8],
|
||||||
'SETTING_OVERRIDE3.update': {"a": 1, "b": 2},
|
'SETTING_OVERRIDE3.update': {'a': 1, 'b': 2},
|
||||||
},
|
},
|
||||||
'services': [
|
'services': [
|
||||||
{
|
{
|
||||||
|
@ -52,10 +52,10 @@ def make_tenant(tmp_path, transactional_db, settings, request):
|
||||||
'other_variable': 'bar',
|
'other_variable': 'bar',
|
||||||
'SETTING_OVERRIDE1': True,
|
'SETTING_OVERRIDE1': True,
|
||||||
'SETTING_OVERRIDE2.extend': [name, 7, 8],
|
'SETTING_OVERRIDE2.extend': [name, 7, 8],
|
||||||
'SETTING_OVERRIDE3.update': {"a": name, "b": 2},
|
'SETTING_OVERRIDE3.update': {'a': name, 'b': 2},
|
||||||
'SETTING_LOCAL1': False,
|
'SETTING_LOCAL1': False,
|
||||||
'SETTING_LOCAL2.extend': [name, 7, 8],
|
'SETTING_LOCAL2.extend': [name, 7, 8],
|
||||||
'SETTING_LOCAL3.update': {"a": name, "b": 2},
|
'SETTING_LOCAL3.update': {'a': name, 'b': 2},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -95,8 +95,8 @@ TENANT_SETTINGS_LOADERS = (
|
||||||
|
|
||||||
GLOBAL1 = 0
|
GLOBAL1 = 0
|
||||||
GLOBAL2 = [1, 2, 3]
|
GLOBAL2 = [1, 2, 3]
|
||||||
GLOBAL3 = {"z": 1}
|
GLOBAL3 = {'z': 1}
|
||||||
|
|
||||||
OVERRIDE1 = 0
|
OVERRIDE1 = 0
|
||||||
OVERRIDE2 = [1, 2, 3]
|
OVERRIDE2 = [1, 2, 3]
|
||||||
OVERRIDE3 = {"z": 1}
|
OVERRIDE3 = {'z': 1}
|
||||||
|
|
|
@ -97,7 +97,7 @@ def test_debug_log(tenants, settings, app, rf, debug_log, freezer):
|
||||||
'level': 'INFO',
|
'level': 'INFO',
|
||||||
'tenant': 'tenant1.example.net',
|
'tenant': 'tenant1.example.net',
|
||||||
'timestamp': pytz.timezone(time.tzname[0]).localize(datetime.datetime(2020, 4, 20, 2, 0)),
|
'timestamp': pytz.timezone(time.tzname[0]).localize(datetime.datetime(2020, 4, 20, 2, 0)),
|
||||||
'user': "-",
|
'user': '-',
|
||||||
'logger': 'multitenant',
|
'logger': 'multitenant',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -210,5 +210,5 @@ def test_create_schema_command(mocked_get_tenants):
|
||||||
|
|
||||||
|
|
||||||
def test_shell_command_empty():
|
def test_shell_command_empty():
|
||||||
with pytest.raises(CommandError, match="There are no tenants in the system."):
|
with pytest.raises(CommandError, match='There are no tenants in the system.'):
|
||||||
call_command('shell')
|
call_command('shell')
|
||||||
|
|
|
@ -17,7 +17,7 @@ with patch.object(builtins, 'open', mock_open(read_data=b'xxx')):
|
||||||
with open_backup(os.environ['DEBIAN_CONFIG_COMMON']) as fd:
|
with open_backup(os.environ['DEBIAN_CONFIG_COMMON']) as fd:
|
||||||
exec(fd.read())
|
exec(fd.read())
|
||||||
|
|
||||||
BRANCH_NAME = os.environ.get("BRANCH_NAME", "").replace('/', '-')[:15]
|
BRANCH_NAME = os.environ.get('BRANCH_NAME', '').replace('/', '-')[:15]
|
||||||
# noqa pylint: disable=undefined-variable
|
# noqa pylint: disable=undefined-variable
|
||||||
DATABASES['default']['NAME'] = hobo.test_utils.get_safe_db_name()
|
DATABASES['default']['NAME'] = hobo.test_utils.get_safe_db_name()
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,7 @@ TENANT_MODEL = 'multitenant.Tenant'
|
||||||
# noqa pylint: disable=used-before-assignment
|
# noqa pylint: disable=used-before-assignment
|
||||||
MIDDLEWARE = ('hobo.multitenant.middleware.TenantMiddleware',) + MIDDLEWARE
|
MIDDLEWARE = ('hobo.multitenant.middleware.TenantMiddleware',) + MIDDLEWARE
|
||||||
BRANCH_NAME = (
|
BRANCH_NAME = (
|
||||||
os.environ.get("BRANCH_NAME", "").replace('/', '_').replace('-', '_').encode('ascii', 'ignore').decode()
|
os.environ.get('BRANCH_NAME', '').replace('/', '_').replace('-', '_').encode('ascii', 'ignore').decode()
|
||||||
)[:15]
|
)[:15]
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
'default': {
|
'default': {
|
||||||
|
|
Loading…
Reference in New Issue