Raw File
models.py
# Copyright (C) 2017  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information

# Generated from:
# cd swh_deposit && \
#    python3 -m manage inspectdb


from django.contrib.postgres.fields import JSONField
from django.db import models
from django.utils.timezone import now


class Dbversion(models.Model):
    """Db version

    """
    version = models.IntegerField(primary_key=True)
    release = models.DateTimeField(default=now, null=True)
    description = models.TextField(blank=True, null=True)

    class Meta:
        db_table = 'dbversion'

    def __str__(self):
        return str({
            'version': self.version,
            'release': self.release,
            'description': self.description
        })


DEPOSIT_STATUS = [
    ('partial', 'partial'),      # the deposit is new or partially received
                                 # since it can be done in multiple requests
    ('expired', 'expired'),      # deposit has been there too long and is now
                                 # deemed ready to be garbage collected
    ('ready', 'ready'),          # deposit is fully received and ready for
                                 # injection
    ('injecting', 'injecting'),  # injection is ongoing on swh's side
    ('success', 'success'),      # injection successful
    ('failure', 'failure'),      # injection failure
]


class Deposit(models.Model):
    """Deposit reception table

    """
    id = models.BigAutoField(primary_key=True)

    # First deposit reception date
    reception_date = models.DateTimeField(auto_now_add=True)
    # Date when the deposit is deemed complete and ready for injection
    complete_date = models.DateTimeField(null=True)
    # Deposit reception source type
    type = models.ForeignKey(
        'DepositType', models.DO_NOTHING, db_column='type')
    # Deposit's unique external identifier
    external_id = models.TextField(unique=True)
    # Deposit client
    client = models.ForeignKey(
        'auth.User', models.DO_NOTHING)
    # SWH's injection result identifier
    swh_id = models.TextField(blank=True, null=True)
    # Deposit's status regarding injection
    status = models.TextField(
        choices=DEPOSIT_STATUS,
        default='partial')

    class Meta:
        db_table = 'deposit'

    def __str__(self):
        return str({
            'id': self.id,
            'reception_date': self.reception_date,
            'type': self.type,
            'external_id': self.external_id,
            'client_id': self.client_id,
            'status': self.status
        })


class DepositRequest(models.Model):
    """Deposit request made by clients

    """

    id = models.BigAutoField(primary_key=True)
    # Deposit concerned by the request
    deposit = models.ForeignKey(Deposit, models.DO_NOTHING)
    date = models.DateTimeField(auto_now_add=True)
    # Deposit request information on the data to inject
    metadata = JSONField(null=True)

    class Meta:
        db_table = 'deposit_request'

    def __str__(self):
        from json import dumps
        return str({
            'id': self.id,
            'deposit': self.deposit,
            'metadata': dumps(self.metadata),
        })


class DepositType(models.Model):
    id = models.BigAutoField(primary_key=True)
    # Human readable name for the deposit type e.g HAL, arXiv, etc...
    name = models.TextField()

    class Meta:
        db_table = 'deposit_type'

    def __str__(self):
        return str({'id': self.id, 'name': self.name})
back to top