Skip to content
Snippets Groups Projects
Commit db7a68d9 authored by Samuel GAIST's avatar Samuel GAIST
Browse files

[databases][models] Pre-commit cleanup

parent 38e5b09a
No related branches found
No related tags found
1 merge request!319Add usage time to database
...@@ -38,7 +38,6 @@ from beat.backend.python.hash import hashDataset ...@@ -38,7 +38,6 @@ from beat.backend.python.hash import hashDataset
from ..dataformats.models import DataFormat from ..dataformats.models import DataFormat
from ..common.models import Shareable
from ..common.models import Versionable from ..common.models import Versionable
from ..common.models import VersionableManager from ..common.models import VersionableManager
from ..common.storage import OverwriteStorage from ..common.storage import OverwriteStorage
...@@ -57,7 +56,7 @@ from ..code.models import get_source_code ...@@ -57,7 +56,7 @@ from ..code.models import get_source_code
from ..code.models import set_source_code from ..code.models import set_source_code
#---------------------------------------------------------- # ----------------------------------------------------------
def validate_database(declaration): def validate_database(declaration):
...@@ -66,8 +65,10 @@ def validate_database(declaration): ...@@ -66,8 +65,10 @@ def validate_database(declaration):
database = beat.core.database.Database(settings.PREFIX, declaration) database = beat.core.database.Database(settings.PREFIX, declaration)
if not database.valid: if not database.valid:
errors = 'The database declaration is **invalid**. Errors:\n * ' + \ errors = (
'\n * '.join(database.errors) "The database declaration is **invalid**. Errors:\n * "
+ "\n * ".join(database.errors)
)
raise SyntaxError(errors) raise SyntaxError(errors)
# TODO: for each protocol, if a template already exists, that the inserted # TODO: for each protocol, if a template already exists, that the inserted
...@@ -77,37 +78,42 @@ def validate_database(declaration): ...@@ -77,37 +78,42 @@ def validate_database(declaration):
return database return database
#---------------------------------------------------------- # ----------------------------------------------------------
class DatabaseStorage(OverwriteStorage): class DatabaseStorage(OverwriteStorage):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(DatabaseStorage, self).__init__(*args, location=settings.DATABASES_ROOT, **kwargs) super(DatabaseStorage, self).__init__(
*args, location=settings.DATABASES_ROOT, **kwargs
)
#---------------------------------------------------------- # ----------------------------------------------------------
class DatabaseManager(VersionableManager): class DatabaseManager(VersionableManager):
def get_by_natural_key(self, name, version): def get_by_natural_key(self, name, version):
return self.get(name=name, version=version) return self.get(name=name, version=version)
def create_database(
def create_database(self, name, short_description='', description='', self,
declaration=None, code=None, version=1, name,
previous_version=None): short_description="",
description="",
declaration=None,
code=None,
version=1,
previous_version=None,
):
"""Convenience function to create a new database from its parts""" """Convenience function to create a new database from its parts"""
# Create the database representation # Create the database representation
database = self.model( database = self.model(
name = name, name=name,
version = version, version=version,
sharing = self.model.PRIVATE, sharing=self.model.PRIVATE,
previous_version = previous_version, previous_version=previous_version,
) )
# Makes sure we get a declaration in string format # Makes sure we get a declaration in string format
...@@ -117,11 +123,11 @@ class DatabaseManager(VersionableManager): ...@@ -117,11 +123,11 @@ class DatabaseManager(VersionableManager):
else: else:
default = beat.core.database.Database(settings.PREFIX, data=None) default = beat.core.database.Database(settings.PREFIX, data=None)
declaration = default.data declaration = default.data
elif not(isinstance(declaration, dict)): elif not (isinstance(declaration, dict)):
declaration = simplejson.loads(declaration) declaration = simplejson.loads(declaration)
if len(short_description) > 0: if len(short_description) > 0:
declaration['description'] = short_description declaration["description"] = short_description
database.declaration = declaration database.declaration = declaration
...@@ -130,7 +136,7 @@ class DatabaseManager(VersionableManager): ...@@ -130,7 +136,7 @@ class DatabaseManager(VersionableManager):
if previous_version is not None: if previous_version is not None:
code = previous_version.source_code code = previous_version.source_code
else: else:
code = '' code = ""
database.source_code = code database.source_code = code
...@@ -139,7 +145,7 @@ class DatabaseManager(VersionableManager): ...@@ -139,7 +145,7 @@ class DatabaseManager(VersionableManager):
if previous_version is not None: if previous_version is not None:
description = previous_version.description description = previous_version.description
else: else:
description = '' description = ""
database.description = description database.description = description
...@@ -148,68 +154,64 @@ class DatabaseManager(VersionableManager): ...@@ -148,68 +154,64 @@ class DatabaseManager(VersionableManager):
database.save() database.save()
except Exception: except Exception:
import traceback import traceback
return (None, traceback.format_exc()) return (None, traceback.format_exc())
return (database, None) return (database, None)
#---------------------------------------------------------- # ----------------------------------------------------------
class Database(Versionable): class Database(Versionable):
#_____ Fields __________ # _____ Fields __________
declaration_file = models.FileField( declaration_file = models.FileField(
storage=DatabaseStorage(), storage=DatabaseStorage(),
upload_to=get_contribution_declaration_filename, upload_to=get_contribution_declaration_filename,
blank=True, null=True, blank=True,
null=True,
max_length=200, max_length=200,
db_column='declaration' db_column="declaration",
) )
description_file = models.FileField( description_file = models.FileField(
storage=DatabaseStorage(), storage=DatabaseStorage(),
upload_to=get_contribution_description_filename, upload_to=get_contribution_description_filename,
blank=True, null=True, blank=True,
null=True,
max_length=200, max_length=200,
db_column='description' db_column="description",
) )
source_code_file = models.FileField( source_code_file = models.FileField(
storage=DatabaseStorage(), storage=DatabaseStorage(),
upload_to=get_contribution_source_code_filename, upload_to=get_contribution_source_code_filename,
blank=True, null=True, blank=True,
null=True,
max_length=200, max_length=200,
db_column='source_code' db_column="source_code",
) )
objects = DatabaseManager() objects = DatabaseManager()
# _____ Meta parameters __________
#_____ Meta parameters __________
class Meta(Versionable.Meta): class Meta(Versionable.Meta):
unique_together = ('name', 'version') unique_together = ("name", "version")
#_____ Utilities __________ # _____ Utilities __________
def get_absolute_url(self): def get_absolute_url(self):
return reverse( return reverse("databases:view", args=(self.name, self.version))
'databases:view',
args=(self.name, self.version,),
)
def natural_key(self): def natural_key(self):
return (self.name, self.version) return (self.name, self.version)
# _____ Overrides __________
#_____ Overrides __________
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
...@@ -220,7 +222,11 @@ class Database(Versionable): ...@@ -220,7 +222,11 @@ class Database(Versionable):
wrapper = validate_database(declaration) wrapper = validate_database(declaration)
# reset the description # reset the description
self.short_description = wrapper.description if (wrapper is not None) and (wrapper.description is not None) else '' self.short_description = (
wrapper.description
if (wrapper is not None) and (wrapper.description is not None)
else ""
)
# Save the changed files (if necessary) # Save the changed files (if necessary)
storage.save_files(self) storage.save_files(self)
...@@ -229,27 +235,26 @@ class Database(Versionable): ...@@ -229,27 +235,26 @@ class Database(Versionable):
# if the filename has changed, move the declaration # if the filename has changed, move the declaration
if self.declaration_filename() != self.declaration_file.name: if self.declaration_filename() != self.declaration_file.name:
storage.rename_file(self, 'declaration_file', self.declaration_filename()) storage.rename_file(self, "declaration_file", self.declaration_filename())
storage.rename_file(self, 'description_file', self.description_filename()) storage.rename_file(self, "description_file", self.description_filename())
storage.rename_file(self, 'source_code_file', self.source_code_filename()) storage.rename_file(self, "source_code_file", self.source_code_filename())
#_____ Methods __________ # _____ Methods __________
def fullname(self): def fullname(self):
return '%s/%d' % (self.name, self.version) return "%s/%d" % (self.name, self.version)
def fullpath(self, extension): def fullpath(self, extension):
return os.path.join(self.name, str(self.version) + extension) return os.path.join(self.name, str(self.version) + extension)
def declaration_filename(self): def declaration_filename(self):
return self.fullpath('.json') return self.fullpath(".json")
def description_filename(self): def description_filename(self):
return self.fullpath('.rst') return self.fullpath(".rst")
def source_code_filename(self): def source_code_filename(self):
return self.fullpath('.py') return self.fullpath(".py")
def all_referenced_dataformats(self): def all_referenced_dataformats(self):
result = [] result = []
...@@ -263,7 +268,7 @@ class Database(Versionable): ...@@ -263,7 +268,7 @@ class Database(Versionable):
result.extend(database_protocol.all_needed_dataformats()) result.extend(database_protocol.all_needed_dataformats())
return list(set(result)) return list(set(result))
#_____ Properties __________ # _____ Properties __________
description = property(get_description, set_description) description = property(get_description, set_description)
declaration = property(get_declaration, set_declaration) declaration = property(get_declaration, set_declaration)
...@@ -271,16 +276,13 @@ class Database(Versionable): ...@@ -271,16 +276,13 @@ class Database(Versionable):
source_code = property(get_source_code, set_source_code) source_code = property(get_source_code, set_source_code)
#---------------------------------------------------------- # ----------------------------------------------------------
class DatabaseProtocolManager(models.Manager): class DatabaseProtocolManager(models.Manager):
def get_by_natural_key(self, database_name, database_version, name): def get_by_natural_key(self, database_name, database_version, name):
return self.get( return self.get(
database__name=database_name, database__name=database_name, database__version=database_version, name=name
database__version=database_version,
name=name,
) )
...@@ -288,24 +290,26 @@ class DatabaseProtocol(models.Model): ...@@ -288,24 +290,26 @@ class DatabaseProtocol(models.Model):
objects = DatabaseProtocolManager() objects = DatabaseProtocolManager()
database = models.ForeignKey(Database, related_name='protocols', database = models.ForeignKey(
on_delete=models.CASCADE) Database, related_name="protocols", on_delete=models.CASCADE
)
name = models.CharField(max_length=200, blank=True) name = models.CharField(max_length=200, blank=True)
class Meta: class Meta:
unique_together = ('database', 'name') unique_together = ("database", "name")
ordering = ['name'] ordering = ["name"]
def __str__(self): def __str__(self):
return self.fullname() return self.fullname()
def natural_key(self): def natural_key(self):
return self.database.natural_key() + (self.name,) return self.database.natural_key() + (self.name,)
natural_key.dependencies = ['databases.database']
natural_key.dependencies = ["databases.database"]
def fullname(self): def fullname(self):
if self.name != '': if self.name != "":
return self.database.fullname() + '@' + self.name return self.database.fullname() + "@" + self.name
else: else:
return self.database.fullname() return self.database.fullname()
...@@ -322,16 +326,16 @@ class DatabaseProtocol(models.Model): ...@@ -322,16 +326,16 @@ class DatabaseProtocol(models.Model):
return list(set(result)) return list(set(result))
def set_template_basename(self): def set_template_basename(self):
if not self.sets.count(): return "unknown" if not self.sets.count():
return "unknown"
dbset = self.sets.all()[0] dbset = self.sets.all()[0]
return dbset.template.name.rsplit('__')[0] return dbset.template.name.rsplit("__")[0]
#---------------------------------------------------------- # ----------------------------------------------------------
class DatabaseSetTemplateManager(models.Manager): class DatabaseSetTemplateManager(models.Manager):
def get_by_natural_key(self, name): def get_by_natural_key(self, name):
return self.get(name=name) return self.get(name=name)
...@@ -349,24 +353,24 @@ class DatabaseSetTemplate(models.Model): ...@@ -349,24 +353,24 @@ class DatabaseSetTemplate(models.Model):
return (self.name,) return (self.name,)
#---------------------------------------------------------- # ----------------------------------------------------------
class DatabaseSetManager(models.Manager): class DatabaseSetManager(models.Manager):
def create(self, protocol, template, name): def create(self, protocol, template, name):
dataset = DatabaseSet( dataset = DatabaseSet(
name = name, name=name,
template = template, template=template,
protocol = protocol, protocol=protocol,
hash = hashDataset(protocol.database.fullname(), protocol.name, name) hash=hashDataset(protocol.database.fullname(), protocol.name, name),
) )
dataset.save() dataset.save()
return dataset return dataset
def get_by_natural_key(
def get_by_natural_key(self, database_name, database_version, protocol_name, name, template_name): self, database_name, database_version, protocol_name, name, template_name
):
return self.get( return self.get(
protocol__database__name=database_name, protocol__database__name=database_name,
protocol__database__version=database_version, protocol__database__version=database_version,
...@@ -378,29 +382,34 @@ class DatabaseSetManager(models.Manager): ...@@ -378,29 +382,34 @@ class DatabaseSetManager(models.Manager):
class DatabaseSet(models.Model): class DatabaseSet(models.Model):
objects = DatabaseSetManager() objects = DatabaseSetManager()
protocol = models.ForeignKey(DatabaseProtocol, related_name='sets', protocol = models.ForeignKey(
on_delete=models.CASCADE) DatabaseProtocol, related_name="sets", on_delete=models.CASCADE
name = models.CharField(max_length=200, blank=True) )
template = models.ForeignKey(DatabaseSetTemplate, related_name='sets', name = models.CharField(max_length=200, blank=True)
on_delete=models.CASCADE) template = models.ForeignKey(
DatabaseSetTemplate, related_name="sets", on_delete=models.CASCADE
)
hash = models.CharField(max_length=64, unique=True) hash = models.CharField(max_length=64, unique=True)
class Meta: class Meta:
unique_together = ('protocol', 'name', 'template') unique_together = ("protocol", "name", "template")
def __str__(self): def __str__(self):
return self.fullname() return self.fullname()
def natural_key(self): def natural_key(self):
return self.protocol.natural_key() + (self.name,) + self.template.natural_key() return self.protocol.natural_key() + (self.name,) + self.template.natural_key()
natural_key.dependencies = ['databases.databaseprotocol',
'databases.databasesettemplate'] natural_key.dependencies = [
"databases.databaseprotocol",
"databases.databasesettemplate",
]
def fullname(self): def fullname(self):
if self.name != '': if self.name != "":
return self.protocol.fullname() + '.' + self.name return self.protocol.fullname() + "." + self.name
else: else:
return self.protocol.fullname() return self.protocol.fullname()
...@@ -416,43 +425,44 @@ class DatabaseSet(models.Model): ...@@ -416,43 +425,44 @@ class DatabaseSet(models.Model):
return list(set(result)) return list(set(result))
#---------------------------------------------------------- # ----------------------------------------------------------
class DatabaseSetTemplateOutput(models.Model): class DatabaseSetTemplateOutput(models.Model):
template = models.ForeignKey(DatabaseSetTemplate, template = models.ForeignKey(
related_name='outputs', on_delete=models.CASCADE) DatabaseSetTemplate, related_name="outputs", on_delete=models.CASCADE
name = models.CharField(max_length=200) )
dataformat = models.ForeignKey(DataFormat, name = models.CharField(max_length=200)
related_name='database_outputs', on_delete=models.CASCADE) dataformat = models.ForeignKey(
DataFormat, related_name="database_outputs", on_delete=models.CASCADE
)
class Meta: class Meta:
unique_together = ('template', 'name') unique_together = ("template", "name")
def __str__(self): def __str__(self):
return self.fullname() return self.fullname()
def fullname(self): def fullname(self):
return self.template.name + '.' + self.name return self.template.name + "." + self.name
#---------------------------------------------------------- # ----------------------------------------------------------
class DatabaseSetOutputManager(models.Manager): class DatabaseSetOutputManager(models.Manager):
def get_by_natural_key(self, set_natural_key, output_name): def get_by_natural_key(self, set_natural_key, output_name):
set_ = DatabaseSet.objects.get_by_natural_key(*set_natural_key) set_ = DatabaseSet.objects.get_by_natural_key(*set_natural_key)
return self.get( return self.get(set=set_, template__name=output_name)
set=set_,
template__name=output_name,
)
class DatabaseSetOutput(models.Model): class DatabaseSetOutput(models.Model):
template = models.ForeignKey(DatabaseSetTemplateOutput, template = models.ForeignKey(
related_name='instances', on_delete=models.CASCADE) DatabaseSetTemplateOutput, related_name="instances", on_delete=models.CASCADE
set = models.ForeignKey(DatabaseSet, related_name='outputs', )
on_delete=models.CASCADE) set = models.ForeignKey(
DatabaseSet, related_name="outputs", on_delete=models.CASCADE
)
objects = DatabaseSetOutputManager() objects = DatabaseSetOutputManager()
...@@ -460,7 +470,7 @@ class DatabaseSetOutput(models.Model): ...@@ -460,7 +470,7 @@ class DatabaseSetOutput(models.Model):
return self.fullname() return self.fullname()
def fullname(self): def fullname(self):
return '%s.%s.%s.%s' % ( return "%s.%s.%s.%s" % (
self.set.protocol.database.fullname(), self.set.protocol.database.fullname(),
self.set.protocol.name, self.set.protocol.name,
self.set.name, self.set.name,
...@@ -475,5 +485,8 @@ class DatabaseSetOutput(models.Model): ...@@ -475,5 +485,8 @@ class DatabaseSetOutput(models.Model):
def natural_key(self): def natural_key(self):
return (self.set.natural_key(), self.template.name) return (self.set.natural_key(), self.template.name)
natural_key.dependencies = ['databases.databasesettemplateoutput',
'databases.databaseset'] natural_key.dependencies = [
"databases.databasesettemplateoutput",
"databases.databaseset",
]
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment