diff --git a/TODO.md b/TODO.md index 05fc5899..f576defb 100644 --- a/TODO.md +++ b/TODO.md @@ -417,8 +417,5 @@ mkhomedir_helper or create ssh homes with bash.rc and such # validate saas setting allow_custom_url check that websites have a related declared directive # warnings if some plugins are disabled, like make routes red -# replace cached by https://docs.python.org/3/library/functools.html#functools.lru_cache -# replace IPy by https://docs.python.org/3/library/ipaddress.html#module-ipaddress # replace show emails by https://docs.python.org/3/library/email.contentmanager.html#module-email.contentmanager -# https://docs.python.org/3/library/functools.html#functools.cmp_to_key # tzinfo=datetime.timezone.utc diff --git a/orchestra/contrib/bills/models.py b/orchestra/contrib/bills/models.py index 011ea2d4..783016f7 100644 --- a/orchestra/contrib/bills/models.py +++ b/orchestra/contrib/bills/models.py @@ -1,5 +1,6 @@ import datetime from dateutil.relativedelta import relativedelta +from functools import lru_cache from django.core.validators import ValidationError, RegexValidator from django.db import models @@ -14,7 +15,6 @@ from django.utils.translation import ugettext_lazy as _ from orchestra.contrib.accounts.models import Account from orchestra.contrib.contacts.models import Contact from orchestra.core import validators -from orchestra.utils.functional import cached from orchestra.utils.html import html_to_pdf from . import settings @@ -319,7 +319,7 @@ class Bill(models.Model): self.number = self.get_number() super(Bill, self).save(*args, **kwargs) - @cached + @lru_cache() def compute_subtotals(self): subtotals = {} lines = self.lines.annotate(totals=F('subtotal') + Sum(Coalesce('sublines__total', 0))) @@ -333,21 +333,21 @@ class Bill(models.Model): result[tax] = (subtotal, round(tax/100*subtotal, 2)) return result - @cached + @lru_cache() def compute_base(self): bases = self.lines.annotate( bases=F('subtotal') + Sum(Coalesce('sublines__total', 0)) ) return round(bases.aggregate(Sum('bases'))['bases__sum'] or 0, 2) - @cached + @lru_cache() def compute_tax(self): taxes = self.lines.annotate( taxes=(F('subtotal') + Coalesce(Sum('sublines__total'), 0)) * (F('tax')/100) ) return round(taxes.aggregate(Sum('taxes'))['taxes__sum'] or 0, 2) - @cached + @lru_cache() def compute_total(self): if 'lines' in getattr(self, '_prefetched_objects_cache', ()): total = 0 @@ -430,7 +430,7 @@ class BillLine(models.Model): return ini return "{ini} / {end}".format(ini=ini, end=end) - @cached + @lru_cache() def compute_total(self): total = self.subtotal or 0 if hasattr(self, 'subline_total'): diff --git a/orchestra/contrib/payments/methods/options.py b/orchestra/contrib/payments/methods/options.py index 47c1ac63..ef2e927a 100644 --- a/orchestra/contrib/payments/methods/options.py +++ b/orchestra/contrib/payments/methods/options.py @@ -1,8 +1,8 @@ import logging from dateutil import relativedelta +from functools import lru_cache from orchestra import plugins -from orchestra.utils.functional import cached from orchestra.utils.python import import_class from .. import settings @@ -20,7 +20,7 @@ class PaymentMethod(plugins.Plugin): state_help = {} @classmethod - @cached + @lru_cache() def get_plugins(cls): plugins = [] for cls in settings.PAYMENTS_ENABLED_METHODS: diff --git a/orchestra/contrib/plans/models.py b/orchestra/contrib/plans/models.py index cd7d6a6a..af8d41a1 100644 --- a/orchestra/contrib/plans/models.py +++ b/orchestra/contrib/plans/models.py @@ -1,3 +1,5 @@ +from functools import lru_cache + from django.core.validators import ValidationError from django.db import models from django.db.models import Q @@ -6,7 +8,6 @@ from django.utils.translation import ugettext_lazy as _ from orchestra.core.validators import validate_name from orchestra.models import queryset -from orchestra.utils.functional import cached from orchestra.utils.python import import_class from . import settings @@ -84,12 +85,12 @@ class Rate(models.Model): return "{}-{}".format(str(self.price), self.quantity) @classmethod - @cached + @lru_cache() def get_methods(cls): return dict((method, import_class(method)) for method in settings.PLANS_RATE_METHODS) @classmethod - @cached + @lru_cache() def get_choices(cls): choices = [] for name, method in cls.get_methods().items(): diff --git a/orchestra/contrib/resources/admin.py b/orchestra/contrib/resources/admin.py index f41bee06..99474792 100644 --- a/orchestra/contrib/resources/admin.py +++ b/orchestra/contrib/resources/admin.py @@ -1,3 +1,4 @@ +from functools import lru_cache from urllib.parse import parse_qs from django.apps import apps @@ -19,7 +20,6 @@ from orchestra.admin.utils import insertattr, get_modeladmin, admin_link, admin_ from orchestra.contrib.orchestration.models import Route from orchestra.core import services from orchestra.utils import db, sys -from orchestra.utils.functional import cached from .actions import run_monitor, show_history from .api import history_data @@ -240,7 +240,7 @@ def resource_inline_factory(resources): def total_form_count(self, resources=resources): return len(resources) - @cached + @lru_cache() def get_queryset(self): """ Filter disabled resources """ queryset = super(ResourceInlineFormSet, self).get_queryset() diff --git a/orchestra/contrib/saas/backends/moodle.py b/orchestra/contrib/saas/backends/moodle.py index 99831b0f..dc230664 100644 --- a/orchestra/contrib/saas/backends/moodle.py +++ b/orchestra/contrib/saas/backends/moodle.py @@ -33,7 +33,8 @@ class MoodleMuBackend(ServiceController): $wwwroot = "https://{$site}-courses.pangea.org"; } } - $CFG->prefix = "${site}_"; + $prefix = str_replace('-', '_', $site); + $CFG->prefix = "${prefix}_"; $CFG->wwwroot = $wwwroot; $CFG->dataroot = "/home/pangea/moodledata/{$site}/"; """ @@ -43,6 +44,9 @@ class MoodleMuBackend(ServiceController): def save(self, webapp): context = self.get_context(webapp) + self.delete_site_map(context) + if context['custom_url']: + self.insert_site_map(context) self.append(textwrap.dedent("""\ mkdir -p %(moodledata_path)s chown %(user)s:%(user)s %(moodledata_path)s @@ -64,9 +68,9 @@ class MoodleMuBackend(ServiceController): --host="%(db_host)s" \\ --user="%(db_user)s" \\ --password="%(db_pass)s" \\ - --execute='UPDATE %(site_name)s_user + --execute='UPDATE %(db_prefix)s_user SET password=MD5("%(password)s") - WHERE username="admin"' \\ + WHERE username="admin";' \\ %(db_name)s """) % context ) @@ -83,9 +87,6 @@ class MoodleMuBackend(ServiceController): EOF fi""") % context ) - self.delete_site_map(context) - if context['custom_url']: - self.insert_site_map(context) def delete_site_map(self, context): self.append(textwrap.dedent("""\ @@ -105,7 +106,7 @@ class MoodleMuBackend(ServiceController): context = self.get_context(saas) self.append(textwrap.dedent(""" rm -rf %(moodledata_path)s - # Delete tables with prefix %(site_name)s + # Delete tables with prefix %(db_prefix)s mysql -Nrs \\ --host="%(db_host)s" \\ --user="%(db_user)s" \\ @@ -114,7 +115,7 @@ class MoodleMuBackend(ServiceController): SET @tbls = (SELECT GROUP_CONCAT(TABLE_NAME) FROM information_schema.TABLES WHERE TABLE_SCHEMA = "%(db_name)s" - AND TABLE_NAME LIKE "%(site_name)s_%%"); + AND TABLE_NAME LIKE "%(db_prefix)s_%%"); SET @delStmt = CONCAT("DROP TABLE ", @tbls); -- SELECT @delStmt; PREPARE stmt FROM @delStmt; @@ -146,9 +147,10 @@ class MoodleMuBackend(ServiceController): 'db_pass': settings.SAAS_MOODLE_DB_PASS, 'db_name': settings.SAAS_MOODLE_DB_NAME, 'db_host': settings.SAAS_MOODLE_DB_HOST, + 'db_prefix': saas.name.replace('-', '_'), 'email': saas.account.email, 'password': getattr(saas, 'password', None), - 'custom_url': saas.custom_url, + 'custom_url': saas.custom_url.rstrip('/'), 'custom_domain': urlparse(saas.custom_url).netloc if saas.custom_url else None, } context.update({ diff --git a/orchestra/contrib/saas/models.py b/orchestra/contrib/saas/models.py index 4aea6343..ab273ae7 100644 --- a/orchestra/contrib/saas/models.py +++ b/orchestra/contrib/saas/models.py @@ -24,8 +24,8 @@ class SaaS(models.Model): service = models.CharField(_("service"), max_length=32, choices=SoftwareService.get_choices()) name = models.CharField(_("Name"), max_length=64, - help_text=_("Required. 64 characters or fewer. Letters, digits and ./-/_ only."), - validators=[validators.validate_username]) + help_text=_("Required. 64 characters or fewer. Letters, digits and ./- only."), + validators=[validators.validate_hostname]) account = models.ForeignKey('accounts.Account', verbose_name=_("account"), related_name='saas') is_active = models.BooleanField(_("active"), default=True, diff --git a/orchestra/contrib/saas/services/options.py b/orchestra/contrib/saas/services/options.py index 56e70035..f4fd5003 100644 --- a/orchestra/contrib/saas/services/options.py +++ b/orchestra/contrib/saas/services/options.py @@ -1,3 +1,4 @@ +from functools import lru_cache from urllib.parse import urlparse from django.core.exceptions import ValidationError, ObjectDoesNotExist @@ -8,7 +9,6 @@ from orchestra.contrib.databases.models import Database, DatabaseUser from orchestra.contrib.orchestration import Operation from orchestra.contrib.websites.models import Website, WebsiteDirective from orchestra.utils.apps import isinstalled -from orchestra.utils.functional import cached from orchestra.utils.python import import_class from . import helpers @@ -33,7 +33,7 @@ class SoftwareService(plugins.Plugin): allow_custom_url = False @classmethod - @cached + @lru_cache() def get_plugins(cls): plugins = [] for cls in settings.SAAS_ENABLED_SERVICES: @@ -153,7 +153,7 @@ class DBSoftwareService(SoftwareService): def get_db_user(self): return self.db_user - @cached + @lru_cache() def get_account(self): account_model = self.instance._meta.get_field_by_name('account')[0] return account_model.rel.to.objects.get_main() diff --git a/orchestra/contrib/services/handlers.py b/orchestra/contrib/services/handlers.py index 9be6de23..a5dba71c 100644 --- a/orchestra/contrib/services/handlers.py +++ b/orchestra/contrib/services/handlers.py @@ -2,6 +2,7 @@ import calendar import datetime import decimal import math +from functools import cmp_to_key from dateutil import relativedelta from django.contrib.contenttypes.models import ContentType @@ -11,7 +12,7 @@ from django.utils.translation import ugettext, ugettext_lazy as _ from orchestra import plugins from orchestra.utils.humanize import text2int -from orchestra.utils.python import AttrDict, cmp_to_key, format_exception +from orchestra.utils.python import AttrDict, format_exception from . import settings, helpers diff --git a/orchestra/contrib/services/tests/test_handler.py b/orchestra/contrib/services/tests/test_handler.py index 7cc4650a..d6bfad81 100644 --- a/orchestra/contrib/services/tests/test_handler.py +++ b/orchestra/contrib/services/tests/test_handler.py @@ -1,12 +1,12 @@ import datetime import decimal +from functools import cmp_to_key from django.contrib.contenttypes.models import ContentType from django.utils import timezone from orchestra.contrib.systemusers.models import SystemUser from orchestra.contrib.plans.models import Plan -from orchestra.utils.python import cmp_to_key from orchestra.utils.tests import BaseTestCase from .. import helpers diff --git a/orchestra/contrib/systemusers/backends.py b/orchestra/contrib/systemusers/backends.py index 7e11897a..3d41f6d4 100644 --- a/orchestra/contrib/systemusers/backends.py +++ b/orchestra/contrib/systemusers/backends.py @@ -31,6 +31,7 @@ class UNIXUserBackend(ServiceController): groups = ','.join(self.get_groups(user)) context['groups_arg'] = '--groups %s' % groups if groups else '' # TODO userd add will fail if %(user)s group already exists + # TODO mkhomedir_helper self.append(textwrap.dedent(""" # Update/create user state for %(user)s if id %(user)s ; then diff --git a/orchestra/contrib/webapps/models.py b/orchestra/contrib/webapps/models.py index 7f2b51bc..91d7fe88 100644 --- a/orchestra/contrib/webapps/models.py +++ b/orchestra/contrib/webapps/models.py @@ -7,7 +7,6 @@ from django.utils.translation import ugettext_lazy as _ from jsonfield import JSONField from orchestra.core import validators -from orchestra.utils.functional import cached from . import settings from .fields import VirtualDatabaseRelation, VirtualDatabaseUserRelation diff --git a/orchestra/contrib/webapps/options.py b/orchestra/contrib/webapps/options.py index 6ff1976a..2fadd3dd 100644 --- a/orchestra/contrib/webapps/options.py +++ b/orchestra/contrib/webapps/options.py @@ -1,10 +1,10 @@ import re +from functools import lru_cache from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from orchestra.plugins import Plugin -from orchestra.utils.functional import cached from orchestra.utils.python import import_class from . import settings @@ -20,7 +20,7 @@ class AppOption(Plugin): comma_separated = False @classmethod - @cached + @lru_cache() def get_plugins(cls): plugins = [] for cls in settings.WEBAPPS_ENABLED_OPTIONS: @@ -28,7 +28,7 @@ class AppOption(Plugin): return plugins @classmethod - @cached + @lru_cache() def get_option_groups(cls): groups = {} for opt in cls.get_plugins(): diff --git a/orchestra/contrib/webapps/types/__init__.py b/orchestra/contrib/webapps/types/__init__.py index 69ab2f22..de3df198 100644 --- a/orchestra/contrib/webapps/types/__init__.py +++ b/orchestra/contrib/webapps/types/__init__.py @@ -1,9 +1,10 @@ +from functools import lru_cache + from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from orchestra import plugins from orchestra.plugins.forms import PluginDataForm -from orchestra.utils.functional import cached from orchestra.utils.python import import_class from .. import settings @@ -22,7 +23,7 @@ class AppType(plugins.Plugin): # TODO generic name like 'execution' ? @classmethod - @cached + @lru_cache() def get_plugins(cls): plugins = [] for cls in settings.WEBAPPS_TYPES: @@ -38,7 +39,7 @@ class AppType(plugins.Plugin): }) @classmethod - @cached + @lru_cache() def get_group_options(cls): """ Get enabled options based on cls.option_groups """ groups = AppOption.get_option_groups() @@ -54,7 +55,7 @@ class AppType(plugins.Plugin): @classmethod def get_group_options_choices(cls): """ Generates grouped choices ready to use in Field.choices """ - # generators can not be @cached + # generators can not be @lru_cache yield (None, '-------') for group, options in cls.get_group_options(): if group is None: diff --git a/orchestra/contrib/webapps/types/php.py b/orchestra/contrib/webapps/types/php.py index 59c1aac3..c96737a9 100644 --- a/orchestra/contrib/webapps/types/php.py +++ b/orchestra/contrib/webapps/types/php.py @@ -1,12 +1,12 @@ import os from collections import OrderedDict +from functools import lru_cache from django import forms from django.utils.translation import ugettext_lazy as _ from rest_framework import serializers from orchestra.plugins.forms import PluginDataForm -from orchestra.utils.functional import cached from .. import settings, utils from ..options import AppOption @@ -58,7 +58,7 @@ class PHPApp(AppType): def get_detail(self): return self.instance.data.get('php_version', '') - @cached + @lru_cache() def get_options(self, merge=settings.WEBAPPS_MERGE_PHP_WEBAPPS): """ adapter to webapp.get_options that performs merging of PHP options """ kwargs = { diff --git a/orchestra/contrib/websites/directives.py b/orchestra/contrib/websites/directives.py index 518c7ec9..23172d80 100644 --- a/orchestra/contrib/websites/directives.py +++ b/orchestra/contrib/websites/directives.py @@ -1,11 +1,11 @@ import re from collections import defaultdict +from functools import lru_cache from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ from orchestra.plugins import Plugin -from orchestra.utils.functional import cached from orchestra.utils.python import import_class from . import settings @@ -24,7 +24,7 @@ class SiteDirective(Plugin): unique_location = False @classmethod - @cached + @lru_cache() def get_plugins(cls): plugins = [] for cls in settings.WEBSITES_ENABLED_DIRECTIVES: @@ -32,7 +32,7 @@ class SiteDirective(Plugin): return plugins @classmethod - @cached + @lru_cache() def get_option_groups(cls): groups = {} for opt in cls.get_plugins(): @@ -45,7 +45,7 @@ class SiteDirective(Plugin): @classmethod def get_choices(cls): """ Generates grouped choices ready to use in Field.choices """ - # generators can not be @cached + # generators can not be @lru_cache() yield (None, '-------') options = cls.get_option_groups() for option in options.pop(None, ()): diff --git a/orchestra/contrib/websites/models.py b/orchestra/contrib/websites/models.py index 7e3b57b7..1564c64f 100644 --- a/orchestra/contrib/websites/models.py +++ b/orchestra/contrib/websites/models.py @@ -1,12 +1,12 @@ import os from collections import OrderedDict +from functools import lru_cache from django.db import models from django.utils.functional import cached_property from django.utils.translation import ugettext_lazy as _ from orchestra.core import validators -from orchestra.utils.functional import cached from . import settings from .directives import SiteDirective @@ -72,7 +72,7 @@ class Website(models.Model): return self.HTTP return self.HTTPS - @cached + @lru_cache() def get_directives(self): directives = OrderedDict() for opt in self.directives.all().order_by('name', 'value'): diff --git a/orchestra/core/validators.py b/orchestra/core/validators.py index e13ad0c6..e9e03cd6 100644 --- a/orchestra/core/validators.py +++ b/orchestra/core/validators.py @@ -1,11 +1,11 @@ import logging import re +from ipaddress import ip_address import phonenumbers from django.core import validators from django.core.exceptions import ValidationError from django.utils.translation import ugettext_lazy as _ -from IPy import IP from ..utils.python import import_class @@ -40,28 +40,28 @@ def all_valid(*args): def validate_ipv4_address(value): msg = _("Not a valid IPv4 address") try: - ip = IP(value) - except: + ip = ip_address(value) + except ValueError: raise ValidationError(msg) - if ip.version() != 4: + if ip.version != 4: raise ValidationError(msg) def validate_ipv6_address(value): msg = _("Not a valid IPv6 address") try: - ip = IP(value) - except: + ip = ip_address(value) + except ValueError: raise ValidationError(msg) - if ip.version() != 6: + if ip.version != 6: raise ValidationError(msg) def validate_ip_address(value): msg = _("Not a valid IP address") try: - IP(value) - except: + ip_address(value) + except ValueError: raise ValidationError(msg) diff --git a/orchestra/management/commands/setupcelery.py b/orchestra/management/commands/setupcelery.py index db9f6d27..63878f15 100644 --- a/orchestra/management/commands/setupcelery.py +++ b/orchestra/management/commands/setupcelery.py @@ -4,7 +4,8 @@ from os import path from django.core.management.base import BaseCommand -from orchestra.utils.paths import get_site_dir, get_orchestra_dir +from orchestra.contrib.settings import Setting, parser as settings_parser +from orchestra.utils.paths import get_site_dir, get_orchestra_dir, get_project_dir from orchestra.utils.sys import run, check_root @@ -32,6 +33,7 @@ class Command(BaseCommand): 'username': options.get('username'), 'bin_path': path.join(get_orchestra_dir(), 'bin'), 'processes': options.get('processes'), + 'settings': path.join(get_project_dir(), 'settings.py') } celery_config = textwrap.dedent("""\ @@ -103,3 +105,37 @@ class Command(BaseCommand): }""" ) run("echo '%s' > /etc/logrotate.d/celeryd" % rotate) + + changes = {} + if Setting.settings['TASKS_BACKEND'].value != 'celery': + changes['TASKS_BACKEND'] = 'celery' + if Setting.settings['ORCHESTRA_START_SERVICES'].value == Setting.settings['ORCHESTRA_START_SERVICES'].default: + changes['ORCHESTRA_START_SERVICES'] = settings_parser.serialize( + ( + 'postgresql', + 'celeryevcam', + 'celeryd', + 'celerybeat', + ('uwsgi', 'nginx'), + ) + ) + if Setting.settings['ORCHESTRA_RESTART_SERVICES'].value == Setting.settings['ORCHESTRA_RESTART_SERVICES'].default: + changes['ORCHESTRA_RESTART_SERVICES'] = settings_parser.serialize( + ( + 'celeryd', + 'celerybeat', + 'uwsgi', + ) + ) + if Setting.settings['ORCHESTRA_STOP_SERVICES'].value == Setting.settings['ORCHESTRA_STOP_SERVICES'].default: + changes['ORCHESTRA_STOP_SERVICES'] = settings_parser.serialize( + ( + ('uwsgi', 'nginx'), + 'celerybeat', + 'celeryd', + 'celeryevcam', + 'postgresql' + ) + ) + if changes: + settings_parser.apply(changes) diff --git a/orchestra/management/commands/setupcronbeat.py b/orchestra/management/commands/setupcronbeat.py index bd3294dc..0ff974c8 100644 --- a/orchestra/management/commands/setupcronbeat.py +++ b/orchestra/management/commands/setupcronbeat.py @@ -2,6 +2,7 @@ import os from django.core.management.base import BaseCommand +from orchestra.contrib.settings import Setting, parser as settings_parser from orchestra.utils.paths import get_site_dir from orchestra.utils.sys import run, check_non_root @@ -24,3 +25,16 @@ class Command(BaseCommand): content += "\n* * * * * %(orchestra_beat)s %(site_dir)s/manage.py" % context context['content'] = content run("cat << EOF | crontab\n%(content)s\nEOF" % context, display=True) + + # Configrue settings to use threaded task backend + changes = {} + if Setting.settings['TASKS_BACKEND'].value == 'celery': + changes['TASKS_BACKEND'] = settings_parser.Remove() + if 'celeryd' in Setting.settings['ORCHESTRA_START_SERVICES'].value: + changes['ORCHESTRA_START_SERVICES'] = settings_parser.Remove() + if 'celeryd' in Setting.settings['ORCHESTRA_RESTART_SERVICES'].value: + changes['ORCHESTRA_RESTART_SERVICES'] = settings_parser.Remove() + if 'celeryd' in Setting.settings['ORCHESTRA_STOP_SERVICES'].value: + changes['ORCHESTRA_STOP_SERVICES'] = settings_parser.Remove() + if changes: + settings_parser.apply(changes) diff --git a/orchestra/management/commands/setuppostgres.py b/orchestra/management/commands/setuppostgres.py index bcee6557..cae7878f 100644 --- a/orchestra/management/commands/setuppostgres.py +++ b/orchestra/management/commands/setuppostgres.py @@ -48,14 +48,12 @@ class Command(BaseCommand): help = 'Setup PostgreSQL database.' def run_postgres(self, cmd, *args, **kwargs): - return run('su postgres -c "psql -c \\"%s\\""' % cmd, *args, display=True, **kwargs) + return run('su postgres -c "psql -c \\"%s\\""' % cmd, *args, **kwargs) @check_root def handle(self, *args, **options): interactive = options.get('interactive') db_password = options.get('db_password') - print(db_password) - print(type(db_password)) context = { 'db_name': options.get('db_name'), 'db_user': options.get('db_user'), @@ -76,11 +74,11 @@ class Command(BaseCommand): "please provide a password [%(default_db_password)s]: " % context) context['db_password'] = input(msg) or context['default_db_password'] self.run_postgres(alter_user % context) - msg = "Updated Postgres user '%(db_user)s' password '%(db_password)s'" + msg = "Updated Postgres user '%(db_user)s' password: '%(db_password)s'" self.stdout.write(msg % context) elif db_password: self.run_postgres(alter_user % context) - msg = "Updated Postgres user '%(db_user)s' password '%(db_password)s'" + msg = "Updated Postgres user '%(db_user)s' password: '%(db_password)s'" self.stdout.write(msg % context) else: raise CommandError("Postgres user '%(db_user)s' already exists and " @@ -90,13 +88,6 @@ class Command(BaseCommand): self.stdout.write(msg % context) self.run_postgres(create_database % context, valid_codes=(0,1)) -# run(textwrap.dedent("""\ -# su postgres -c "psql -c \\"CREATE USER %(db_user)s PASSWORD '%(db_password)s';\\"" || { -# su postgres -c "psql -c \\"ALTER USER %(db_user)s WITH PASSWORD '%(db_password)s';\\"" -# } -# su postgres -c "psql -c \\"CREATE DATABASE %(db_name)s OWNER %(db_user)s;\\""\ -# """) % context, valid_codes=(0,1) -# ) context.update({ 'settings': os.path.join(get_project_dir(), 'settings.py') }) diff --git a/orchestra/utils/functional.py b/orchestra/utils/functional.py index 2cb5f42f..5fed4968 100644 --- a/orchestra/utils/functional.py +++ b/orchestra/utils/functional.py @@ -1,5 +1,8 @@ def cached(func): - """ caches func return value """ + """ + DEPRECATED in favour of lru_cahce + caches func return value + """ def cached_func(self, *args, **kwargs): # id(self) prevents sharing within subclasses attr = '_cached_%s_%i' % (func.__name__, id(self)) diff --git a/orchestra/utils/python.py b/orchestra/utils/python.py index e961622c..858834c8 100644 --- a/orchestra/utils/python.py +++ b/orchestra/utils/python.py @@ -100,26 +100,6 @@ class CaptureStdout(list): sys.stdout = self._stdout -def cmp_to_key(mycmp): - 'Convert a cmp= function into a key= function' - class K(object): - def __init__(self, obj, *args): - self.obj = obj - def __lt__(self, other): - return mycmp(self.obj, other.obj) < 0 - def __gt__(self, other): - return mycmp(self.obj, other.obj) > 0 - def __eq__(self, other): - return mycmp(self.obj, other.obj) == 0 - def __le__(self, other): - return mycmp(self.obj, other.obj) <= 0 - def __ge__(self, other): - return mycmp(self.obj, other.obj) >= 0 - def __ne__(self, other): - return mycmp(self.obj, other.obj) != 0 - return K - - def pairwise(iterable): "s -> (s0,s1), (s1,s2), (s2, s3), ..." a, b = tee(iterable) diff --git a/requirements.txt b/requirements.txt index a3e0d8bc..a05b140b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,7 +2,6 @@ django==1.8.2 django-celery-email==1.0.4 django-fluent-dashboard==0.5 https://github.com/glic3rinu/django-admin-tools/archive/master.zip -IPy==0.81 django-extensions==1.5.2 django-transaction-signals==1.0.0 django-celery==3.1.16 diff --git a/scripts/containers/deploy.sh b/scripts/containers/deploy.sh index c9a97b08..96074d77 100644 --- a/scripts/containers/deploy.sh +++ b/scripts/containers/deploy.sh @@ -40,11 +40,11 @@ function main () { # TODO setupceleryd shoudl change orchestra_start/stop/restart_services while true; do - read -p "Do you want to use celery or cronbeat for task execution [cronbeat]? " task + read -p "Do you want to use celery or cronbeat (orchestra.contrib.tasks) for task execution [cronbeat]? " task case $task in 'celery' ) task=celery; break;; - 'cronbeat' ) task=cronbeat; break;; - '' ) task=cronbeat; break;; + 'orchestra.contrib.tasks' ) task=orchestra.contrib.tasks; break;; + '' ) task=orchestra.contrib.tasks; break;; * ) echo "Please answer celery or cronbeat.";; esac done