Skip to content
Snippets Groups Projects
models.py 5.5 KiB
Newer Older
# Create your models here.

from django.db import models


class Event(models.Model):
    """ An event supplies the frame for all Aks.
    """
    name = models.CharField(max_length=64, unique=True, verbose_name='Name', help_text='Name or iteration of the event')
    start = models.DateTimeField(verbose_name='Start', help_text='Time the event begins')
    end = models.DateTimeField(verbose_name='End', help_text='Time the event ends')
    place = models.CharField(max_length=128, verbose_name='Place', help_text='City etc. where the event takes place')
    active = models.BooleanField(verbose_name='Active State', help_text='Marks currently active events')


class AKOwner(models.Model):
    """ An AKOwner describes the person organizing/holding an AK.
    """
    name = models.CharField(max_length=256, verbose_name='Nickname', help_text='Name used to identify an AK owner')
    email = models.EmailField(max_length=128, blank=True, verbose_name='E-Mail Address', help_text='Contact e-mail')
    institution = models.CharField(max_length=128, blank=True, verbose_name='Institution', help_text='University etc.')
    link = models.URLField(blank=True, verbose_name='Web Link', help_text='Link to Homepage')

    event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name='Event', help_text='Matching event')

    class Meta:
        verbose_name = 'AK Owner'
        verbose_name_plural = 'AK Owners'
        ordering = ['name']
        unique_together = [['name', 'institution']]


class AKType(models.Model):
    """ An AKType describes the characteristics of an AK, e.g. content vs. recreational.
    """
    name = models.CharField(max_length=64, unique=True, verbose_name='Name', help_text='Name of the AK Type')
    color = models.CharField(max_length=7, blank=True, verbose_name='Color', help_text='Color to display this type in')

    # TODO model availability

    class Meta:
        verbose_name = 'AK Type'
        verbose_name_plural = 'AK Types'
        ordering = ['name']


class AKTrack(models.Model):
    """ An AKTrack describes a set of semantically related AKs.
    """
    name = models.CharField(max_length=64, unique=True, verbose_name='Name', help_text='Name of the AK Track')
    color = models.CharField(max_length=7, blank=True, verbose_name='Color', help_text='Color to display this track in')

    class Meta:
        verbose_name = 'AK Track'
        verbose_name_plural = 'AK Tracks'
        ordering = ['name']


class AKTag(models.Model):
    """ An AKTag is a keyword given to an AK by (one of) its owner(s).
    """
    name = models.CharField(max_length=64, unique=True, verbose_name='Name', help_text='Name of the AK Tag')

    class Meta:
        verbose_name = 'AK Tag'
        verbose_name_plural = 'AK Tags'
        ordering = ['name']


class AKRequirement(models.Model):
    """ An AKRequirement describes something needed to hold an AK, e.g. infrastructure.
    """
    name = models.CharField(max_length=128, unique=True, verbose_name='Name', help_text='Name of the AK Requirement')

    event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name='Event', help_text='Matching event')

    class Meta:
        verbose_name = 'AK Requirement'
        verbose_name_plural = 'AK Requirements'
        ordering = ['name']


class AK(models.Model):
    """ An AK is a slot-based activity to be scheduled during an event.
    """
    name = models.CharField(max_length=256, unique=True, verbose_name='Name', help_text='Name of the AK')
    short_name = models.CharField(max_length=64, unique=True, blank=True, verbose_name='Short Name',
                                  help_text='Name displayed in schedule')
    description = models.TextField(blank=True, verbose_name='Description', help_text='Description of the AK')

    owners = models.ManyToManyField(to=AKOwner, verbose_name='Owners', help_text='Those organizing the AK')

    # TODO generate automatically
    link = models.URLField(blank=True, verbose_name='Web Link', help_text='Link to wiki page')

    type = models.ForeignKey(to=AKType, on_delete=models.PROTECT, verbose_name='Type', help_text='Type of the AK')
    tags = models.ManyToManyField(to=AKTag, blank=True, verbose_name='Tags', help_text='Tags provided by AK owners')
    track = models.ForeignKey(to=AKTrack, on_delete=models.SET_NULL, null=True, verbose_name='Track',
                              help_text='Track the AK belongs to.')

    reso = models.BooleanField(verbose_name='Resolution Intention', default=False, help_text='Intends to submit a reso')
    requirements = models.ManyToManyField(to=AKRequirement, blank=True, verbose_name='Requirements',
                                          help_text="AK's Requirements")

    conflicts = models.ManyToManyField(to='AK', blank=True, related_name='conflict', verbose_name='Conflicting AKs',
                                       help_text='AKs that conflict and thus must not take place at the same time')
    prerequisites = models.ManyToManyField(to='AK', blank=True, verbose_name='Prerequisite AKs',
                                           help_text='AKs that should precede this AK in the schedule')
    # TODO model availability

    notes = models.TextField(blank=True, verbose_name='Internal Notes', help_text='Notes to organizers')

    interest = models.IntegerField(default=-1, verbose_name='Interest', help_text='Expected number of people to attend')

    event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name='Event', help_text='Matching event')

    class Meta:
        verbose_name = 'AK'
        verbose_name_plural = 'AKs'