Mentions légales du service

Skip to content
Snippets Groups Projects
models.py 6.34 KiB
from __future__ import unicode_literals

from django.contrib.auth.models import User
from django.db import models


class TimeStampModel(models.Model):
    """
    An abstract base class model that provides self-updating ``created_at`` and
    ``updated_at`` fields.
    """

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        abstract = True


class AllgoUser(models.Model):
    """
    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
    name = models.CharField(max_length=255, blank=True)
    version = models.CharField(max_length=255, blank=True)
    docker_name = models.CharField(max_length=255, blank=True)

    class Meta:
        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
    app belonging to one or more users.
    """

    # Fields
    name = models.CharField(unique=True, max_length=255, blank=True)
    description = models.TextField(blank=True, null=True)

    # Should given according to the number of users declared as admin to this
    # app
    contact = models.CharField(max_length=255, blank=True, null=True)

    # Logo
    logo_file_name = models.CharField(max_length=255, blank=True, null=True)
    logo_content_type = models.CharField(max_length=255, blank=True, null=True)
    logo_file_size = models.IntegerField(blank=True, null=True)
    logo_updated_at = models.DateTimeField(blank=True, null=True)

    # Default quota
    default_quota = models.IntegerField(blank=True, null=True)

    # Docker and parameters related stuff
    docker_name = models.CharField(max_length=255, blank=True)
    readme = models.IntegerField(blank=True, null=True)
    entrypoint = models.CharField(max_length=255, blank=True)
    exec_time = models.IntegerField(blank=True, null=True)
    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)

    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(TimeStampModel):
    """
    Given parameters for a specific webapp
    """

    # Fields
    value = models.CharField(max_length=255, blank=True, null=True)
    name = models.CharField(max_length=255, blank=True, null=True)
    detail = models.CharField(max_length=255, blank=True, null=True)

    # Relationships
    # a Webapp parameters corresponds to one webapp
    webapp = models.OneToOneField(Webapp, related_name="webappparameters")

    class Meta:
        db_table = 'webapp_parameters'


class WebappVersion(TimeStampModel):
    """
    Version of a given webapp
    """

    # Fields
    number = models.CharField(max_length=255, blank=True)
    changelog = models.CharField(max_length=255, blank=True)
    docker_image_size = models.FloatField(blank=True, null=True)
    state = models.IntegerField(null=True)
    published = models.IntegerField()

    # Relationships
    webapp = models.ForeignKey(Webapp, related_name="webappversion")

    class Meta:
        db_table = 'webapp_versions'


class Quota(TimeStampModel):
    """
    Quota given to a certain user for a given webapp.

    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 Job(TimeStampModel):
    """
    Jobs ran with the specific data (user, webapp, queue type, ...)
    """

    # 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)
    access_token = models.CharField(max_length=255, blank=True, null=True)
    state = models.IntegerField()
    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(TimeStampModel):
    """
    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)

    # Relationships
    job = models.ForeignKey(Job, related_name="jobuploadjob")

    class Meta:
        db_table = 'job_uploads'