From f07c9ee4f21deb58068fa75b96d23daa4f8f0775 Mon Sep 17 00:00:00 2001 From: Matthieu Berjon <matthieu.berjon@inria.fr> Date: Fri, 23 Mar 2018 17:49:06 +0100 Subject: [PATCH] Update of the model I updated the app model by: - removing all uncessary fields in the user table (that now resides in the django auth_user table) - update the other models by doing the same - reorder the fields to have something more logical to read - update the docstring to fit the updated description Signed-off-by: Matthieu Berjon <matthieu.berjon@inria.fr> --- django/poc/models.py | 171 +++++++++++++++++++------------------------ 1 file changed, 74 insertions(+), 97 deletions(-) diff --git a/django/poc/models.py b/django/poc/models.py index acee8021..000986a9 100644 --- a/django/poc/models.py +++ b/django/poc/models.py @@ -1,5 +1,6 @@ from __future__ import unicode_literals +from django.contrib.auth.models import User from django.db import models @@ -16,9 +17,27 @@ class TimeStampModel(models.Model): abstract = True -class DockerOs(models.Model): +class AllgoUser(models.Model): """ - Docstring to update + Class linked to the Django user management. If there is a need to add a + field related to a user, it should be added here and not in the auth_user + table. + """ + + sshkey = models.CharField(max_length=40) + + # Relationships + user = models.OneToOneField( + User, on_delete=models.CASCADE, related_name="allgouser") + + class Meta: + db_table = 'allgo_user' + + +class DockerOs(TimeStampModel): + """ + Contains the different Operating Systems that a user can choose from to + build its container. """ # Fields @@ -30,6 +49,20 @@ class DockerOs(models.Model): db_table = 'docker_os' +class JobQueue(TimeStampModel): + """ + Data regarding the type of queues available for the system. + """ + + # Fields + name = models.CharField(max_length=255) + timeout = models.IntegerField(blank=True, null=True) + is_default = models.IntegerField() + + class Meta: + db_table = 'job_queues' + + class Webapp(TimeStampModel): """ Webapp model related to the creation and management of a particular web @@ -56,9 +89,6 @@ class Webapp(TimeStampModel): # Default quota default_quota = models.IntegerField(blank=True, null=True) - # A webapp has one docker os type - docker_os = models.ForeignKey(DockerOs) - # Docker and parameters related stuff docker_name = models.CharField(max_length=255, blank=True) readme = models.IntegerField(blank=True, null=True) @@ -67,21 +97,28 @@ class Webapp(TimeStampModel): private = models.IntegerField(blank=True, null=True) access_token = models.CharField(max_length=255, blank=True, null=True) sandbox_state = models.IntegerField(null=True) - # Not integrated in this model yet - sandbox_version_id = models.IntegerField(blank=True, null=True) - default_job_queue_id = models.IntegerField(null=True) + # Not integrated in this model yet + # sandbox_version_id = models.IntegerField(blank=True, null=True) memory_limit = models.BigIntegerField(blank=True, null=True) + # Relationships + + # A webapp has one docker os type + docker_os = models.OneToOneField(DockerOs, related_name="webappdockeros") + user = models.ForeignKey( + User, on_delete=models.CASCADE, related_name="webappuser") + job_queue = models.OneToOneField( + JobQueue, on_delete=models.CASCADE, related_name="webappjobqueue") - class Meta: db_table = 'webapps' -class WebappParameter(models.Model): + +class WebappParameter(TimeStampModel): """ - Docstring to update + Given parameters for a specific webapp """ # Fields @@ -91,7 +128,7 @@ class WebappParameter(models.Model): # Relationships # a Webapp parameters corresponds to one webapp - webapp = models.ForeignKey(Webapp) + webapp = models.OneToOneField(Webapp, related_name="webappparameters") class Meta: db_table = 'webapp_parameters' @@ -99,144 +136,84 @@ class WebappParameter(models.Model): class WebappVersion(TimeStampModel): """ - Docstring to update + Version of a given webapp """ # Fields number = models.CharField(max_length=255, blank=True) changelog = models.CharField(max_length=255, blank=True) - webapp = models.ForeignKey(Webapp) docker_image_size = models.FloatField(blank=True, null=True) state = models.IntegerField(null=True) published = models.IntegerField() - class Meta: - db_table = 'webapp_versions' - - -class User(TimeStampModel): - """ - User model regrouping information related to its email, password hash, - token, SSH key, ... - """ - - # Fields - email = models.CharField(unique=True, max_length=255) - - ## Password management - encrypted_password = models.CharField(max_length=255) - reset_password_token = models.CharField(unique=True, null=True, max_length=255) - reset_password_sent_at = models.DateTimeField(blank=True, null=True) - remember_created_at = models.DateTimeField(blank=True, null=True) - - # Signin/out - """ - These fields should be updated through the database and a method. - I don't see the difference between the last_sign_in_at and - current_sign_in_at fields. For me, they the same purpose - """ - sign_in_count = models.IntegerField() - current_sign_in_at = models.DateTimeField(blank=True, null=True) - last_sign_in_at = models.DateTimeField(blank=True, null=True) - - # IP data - current_sign_in_ip = models.CharField(max_length=255, blank=True, null=True) - last_sign_in_ip = models.CharField(max_length=255, blank=True, null=True) - - # Is admin - admin = models.IntegerField(default=False) - - # Token information - confirmation_token = models.CharField(unique=True, max_length=255, blank=True, null=True) - confirmed_at = models.DateTimeField(blank=True, null=True) - confirmation_sent_at = models.DateTimeField(blank=True, null=True) - - sshkey = models.TextField(blank=True, null=True) - auth_token = models.CharField(max_length=255, blank=True, null=True) - # Relationships - """ - - A user can possess several webapps - - A webapp can possess several users (not only one admin) - """ - webapp = models.ManyToManyField(Webapp, through='Quota') + webapp = models.ForeignKey(Webapp, related_name="webappversion") class Meta: - db_table = 'users' + db_table = 'webapp_versions' class Quota(TimeStampModel): """ - Docstring to update - """ + Quota given to a certain user for a given webapp. - user = models.ForeignKey(User, on_delete=models.CASCADE) - webapp = models.ForeignKey(Webapp, on_delete=models.CASCADE) + Todo + - write a function that calculates the quota left to the user + """ # Fields quantity = models.BigIntegerField(blank=True, null=True) + # Relationships + user = models.ForeignKey( + User, on_delete=models.CASCADE, related_name="quotauser") + webapp = models.ForeignKey( + Webapp, on_delete=models.CASCADE, related_name="quotawebapp") class Meta: db_table = 'quotas' -class JobQueue(TimeStampModel): - """ - Docstring to edit - """ - - # Fields - name = models.CharField(max_length=255) - timeout = models.IntegerField(blank=True, null=True) - is_default = models.IntegerField() - - class Meta: - db_table = 'job_queues' - - class Job(TimeStampModel): """ - Docstring to update + Jobs ran with the specific data (user, webapp, queue type, ...) """ - webapp = models.ForeignKey(Webapp) - user = models.ForeignKey(User) # Fields param = models.CharField(max_length=255, blank=True, null=True) datasize = models.IntegerField(blank=True, null=True) version = models.CharField(max_length=255, blank=True, null=True) exec_time = models.IntegerField(blank=True, null=True) - size_generated_data = models.IntegerField(blank=True, null=True) - ipaddress = models.CharField(max_length=255, blank=True, null=True) access_token = models.CharField(max_length=255, blank=True, null=True) state = models.IntegerField() - # Not in use - container_id = models.IntegerField(blank=True, null=True) - - queue = models.ForeignKey(JobQueue) result = models.IntegerField() + # Relationships + queue = models.ForeignKey(JobQueue, related_name="jobqueue") + webapp = models.ForeignKey(Webapp, related_name="jobwebapp") + user = models.ForeignKey(AllgoUser, related_name="jobuser") + + # Not in use because I don't have any related table yet + container_id = models.IntegerField(blank=True, null=True) class Meta: db_table = 'jobs' -class JobUploads(models.Model): +class JobUploads(TimeStampModel): """ - Docstring to edit + Data uploaded by the user to feed a given webapp """ # Fields job_file_file_name = models.CharField(max_length=255, blank=True) job_file_content_type = models.CharField(max_length=255, blank=True) job_file_file_size = models.IntegerField(blank=True, null=True) - job_file_updated_at = models.DateTimeField(blank=True, auto_now_add=True, null=True) - type = models.CharField(max_length=255, null=True) + job_file_updated_at = models.DateTimeField( + blank=True, auto_now_add=True, null=True) # Relationships - # A job upload corresponds to one job - job = models.ForeignKey(Job) + job = models.ForeignKey(Job, related_name="jobuploadjob") class Meta: db_table = 'job_uploads' -- GitLab