Skip to content
Snippets Groups Projects
models.py 6.38 KiB
Newer Older
  • Learn to ignore specific revisions
  • # 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'
    
    
    
    class Room(models.Model):
        """ A room describes where an AK can be held.
        """
        name = models.CharField(max_length=64, verbose_name='Name', help_text='Name or number of the room')
        building = models.CharField(max_length=256, verbose_name='Building', help_text='Name or number of the building')
        capacity = models.IntegerField(verbose_name='Capacity', help_text='Maximum number of people')
        properties = models.ManyToManyField(to=AKRequirement, verbose_name='Properties',
                                            help_text='AK requirements fulfilled by the room')
    
        # TODO model availability
    
        event = models.ForeignKey(to=Event, on_delete=models.CASCADE, verbose_name='Event', help_text='Matching event')
    
        class Meta:
            verbose_name = 'Room'
            verbose_name_plural = 'Rooms'
            ordering = ['building', 'name']
            unique_together = [['name', 'building']]