diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 7c001369ed7e505c2ecbb7f30c787e5c558da304..dd50908b3a24a5928d5a478d108827f97f9f9fdd 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -3,6 +3,7 @@ stages: variables: PREFIX: /opt/beat.env.web/usr + TEST_PREFIX_PATH_FILE: '/tmp/test_prefix_$CI_JOB_ID.txt' build: stage: build @@ -11,12 +12,13 @@ build: before_script: - ${PREFIX}/bin/python --version - docker info + - export BEAT_TEST_PREFIX=`mktemp -d --tmpdir=/var/tmp beat_test_prefix.XXXXXXXXX` + - echo $BEAT_TEST_PREFIX > $TEST_PREFIX_PATH_FILE script: - git clean -ffdx - ${PREFIX}/bin/python bootstrap-buildout.py - ./bin/buildout - export COVERAGE_FILE=.coverage.django - - export BEAT_TEST_PREFIX=`mktemp -d --tmpdir=/var/tmp beat_test_prefix.XXXXXXXXX` - ./bin/python ${PREFIX}/bin/coverage run --source=${CI_PROJECT_NAME} ./bin/django test --settings=beat.web.settings.ci -v 2 - export BEAT_CMDLINE_TEST_PLATFORM=django://beat.web.settings.ci - export COVERAGE_FILE=.coverage.cmdline @@ -24,13 +26,16 @@ build: - export NOSE_COVER_PACKAGE=beat.web - ./bin/python ${PREFIX}/bin/coverage run --source=./src/beat.cmdline ./bin/nosetests -sv beat.cmdline - unset COVERAGE_FILE - - rm -rf $BEAT_TEST_PREFIX - - unset BEAT_TEST_PREFIX - ./bin/python ${PREFIX}/bin/coverage combine .coverage.django .coverage.cmdline - ./bin/python ${PREFIX}/bin/coverage report - ./bin/python ${PREFIX}/bin/sphinx-apidoc --separate -d 2 --output=doc/api ${CI_PROJECT_NAMESPACE} beat/web/*/migrations beat/web/*/tests - ./bin/python ${PREFIX}/bin/sphinx-build doc/api html/api - ./bin/python ${PREFIX}/bin/sphinx-build doc/admin html/admin - ./bin/python ${PREFIX}/bin/sphinx-build doc/user html/user + after_script: + - export BEAT_TEST_PREFIX=`cat $TEST_PREFIX_PATH_FILE` + - echo "Deleting BEAT test prefix $BEAT_TEST_PREFIX" + - rm -rf $BEAT_TEST_PREFIX $TEST_PREFIX_PATH_FILE + - unset BEAT_TEST_PREFIX tags: - docker-build diff --git a/beat/web/databases/models.py b/beat/web/databases/models.py index 3d8f5447568ec3fbc772800c3ef1529c5559b23d..6179e22843e317d83b4d15934f878ea10bde0017 100755 --- a/beat/web/databases/models.py +++ b/beat/web/databases/models.py @@ -301,6 +301,7 @@ class DatabaseProtocol(models.Model): def natural_key(self): return self.database.natural_key() + (self.name,) + natural_key.dependencies = ['databases.database'] def fullname(self): if self.name != '': @@ -394,6 +395,8 @@ class DatabaseSet(models.Model): def natural_key(self): return self.protocol.natural_key() + (self.name,) + self.template.natural_key() + natural_key.dependencies = ['databases.databaseprotocol', + 'databases.databasesettemplate'] def fullname(self): if self.name != '': @@ -437,15 +440,10 @@ class DatabaseSetTemplateOutput(models.Model): class DatabaseSetOutputManager(models.Manager): - - def get_by_natural_key(self, database_name, database_version, protocol_name, name, - template_name, output_name): + def get_by_natural_key(self, set_natural_key, output_name): + set_ = DatabaseSet.objects.get_by_natural_key(*set_natural_key) return self.get( - set__protocol__database__name=database_name, - set__protocol__database__version=database_version, - set__protocol__name=protocol_name, - set__name=name, - set__template__name=template_name, + set=set_, template__name=output_name, ) @@ -477,3 +475,5 @@ class DatabaseSetOutput(models.Model): def natural_key(self): return (self.set.natural_key(), self.template.name) + natural_key.dependencies = ['databases.databasesettemplateoutput', + 'databases.databaseset'] diff --git a/beat/web/experiments/models/block.py b/beat/web/experiments/models/block.py index f7e4fd3e69a843b828bd6ae2cd368ecc2a06e8e1..38b48dbb4d66b89bd8e4cc074abffe1985ee8f13 100755 --- a/beat/web/experiments/models/block.py +++ b/beat/web/experiments/models/block.py @@ -138,6 +138,7 @@ class Block(models.Model): self.experiment.toolchain.version, self.experiment.name, ) + natural_key.dependencies = ['experiments.experiment'] def save(self, *args, **kwargs): diff --git a/beat/web/experiments/models/block_input.py b/beat/web/experiments/models/block_input.py index 89153f8269d380a5c44722861cbde4f29db81989..e48adb4a2b2bcf749cb375c26493cd942c9ee4e6 100755 --- a/beat/web/experiments/models/block_input.py +++ b/beat/web/experiments/models/block_input.py @@ -26,32 +26,32 @@ ############################################################################### from django.db import models -from django.conf import settings -from ...databases.models import DatabaseSetOutput +from beat.web.databases.models import DatabaseSetOutput from .block import Block -#---------------------------------------------------------- +# ---------------------------------------------------------- class BlockInputManager(models.Manager): - def get_by_natural_key(self, name, experiment_author, toolchain_author, - toolchain_name, toolchain_version, experiment_name, - cache_hash, database_hash): - block = Block.objects.get_by_natural_key(name, experiment_author, - toolchain_author, toolchain_name, toolchain_version, - experiment_name) + def get_by_natural_key(self, block_natural_key, + cache_hash, database_natural_key): + if block_natural_key: + block = Block.objects.get_by_natural_key(*block_natural_key) + else: + block = None if cache_hash: return self.get(cache__hash=cache_hash, block=block) else: - return self.get(database__hash=database_hash, block=block) - + database = DatabaseSetOutput.objects.get_by_natural_key( + *database_natural_key) + return self.get(database=database, block=block) -#---------------------------------------------------------- +# ---------------------------------------------------------- class BlockInput(models.Model): @@ -68,12 +68,19 @@ class BlockInput(models.Model): null=True, on_delete=models.CASCADE) channel = models.CharField(max_length=200, default='', blank=True, - help_text="Synchronization channel within the toolchain") + help_text="Synchronization channel within " + "the toolchain") objects = BlockInputManager() - def natural_key(self): + if self.block: + block_natural_key = self.block.natural_key() + else: + block_natural_key = None cache_hash = self.cache and self.cache.hash - database_hash = self.database and self.database.hash - return self.block.natural_key() + (cache_hash, database_hash) + database_natural_key = self.database and self.database.natural_key() + return (block_natural_key, cache_hash, database_natural_key) + natural_key.dependencies = ['experiments.block', + 'experiments.cachedfile', + 'databases.databasesetoutput'] diff --git a/beat/web/experiments/models/experiment.py b/beat/web/experiments/models/experiment.py index db9371fd8801134e297cc49178fd5362a658badd..bda6d9f117bfd5878e51d73c3e7e8bfa23604ceb 100755 --- a/beat/web/experiments/models/experiment.py +++ b/beat/web/experiments/models/experiment.py @@ -278,9 +278,9 @@ class Experiment(Shareable): #_____ Utilities __________ def natural_key(self): - return (self.author.username,) + \ self.toolchain.natural_key() + (self.name,) + natural_key.dependencies = ['toolchains.toolchain'] #_____ Methods __________ diff --git a/beat/web/experiments/models/result.py b/beat/web/experiments/models/result.py index d85afa67cba360e14f8916b153b41c54100f918f..eb0f5edb572b9442a1e2d55f4db313208a215f20 100755 --- a/beat/web/experiments/models/result.py +++ b/beat/web/experiments/models/result.py @@ -73,6 +73,7 @@ class Result(models.Model): self.name, self.cache.hash, ) + natural_key.dependencies = ['experiments.cachedfile'] def value(self): diff --git a/beat/web/search/models.py b/beat/web/search/models.py index 826097b4c9af020063ca31fdacd6198cdb52ca7d..5577c5637eb682bbe049d88ba45aa33618487b1f 100644 --- a/beat/web/search/models.py +++ b/beat/web/search/models.py @@ -146,6 +146,7 @@ class Leaderboard(models.Model): def natural_key(self): return (self.search.author.username, self.search.name, self.search.version) + natural_key.dependencies = ['search.search'] def get_absolute_url(self): return reverse( diff --git a/buildout.cfg b/buildout.cfg index e8ab3838d1572f6ae96a90a27399a7f2fd45e76b..b46762413fe23b350c01af24fff69ff7c3adc896 100644 --- a/buildout.cfg +++ b/buildout.cfg @@ -88,7 +88,7 @@ eggs = alabaster [sources] beat.core = git git@gitlab.idiap.ch:beat/beat.core branch=1.6.x -beat.cmdline = git git@gitlab.idiap.ch:beat/beat.cmdline +beat.cmdline = git git@gitlab.idiap.ch:beat/beat.cmdline branch=1.4.x beat.backend.python = git git@gitlab.idiap.ch:beat/beat.backend.python branch=1.5.x beat.examples = git git@gitlab.idiap.ch:beat/beat.examples egg=false