from django.db import models from django.utils.text import slugify import boto3 from datetime import datetime import os.path s3client = boto3.client('s3') class Ensemble(models.Model): name = models.CharField(max_length=100) code = models.CharField(max_length=12) password = models.CharField(max_length=100) def active_projects(self): return self.projects.filter(active=True) def __str__(self): return self.name class Project(models.Model): name = models.CharField(max_length=100) ensemble = models.ForeignKey(Ensemble, related_name='projects', on_delete=models.CASCADE, null=True) active = models.BooleanField(default=True) deadline =models.DateField(null=True, blank=True) bucket = models.CharField(max_length=100) def submissions(self): return self.all_submissions.filter(complete=True) def presigned_post(self, object_name, fields={}, conditions=[], expires=3600): key = os.path.join(slugify(self.name), object_name) return s3client.generate_presigned_post(self.bucket, key, Fields=fields, Conditions=conditions, ExpiresIn=expires) def __str__(self): return self.name class Resource(models.Model): project = models.ForeignKey(Project, related_name='resources', on_delete=models.CASCADE) name = models.CharField(max_length=100) uri = models.CharField(max_length=255) class WikiPage(models.Model): project = models.ForeignKey(Project, related_name='wiki_pages', on_delete=models.CASCADE) title = models.CharField(max_length=255) markdown = models.TextField() def __str__(self): return self.title class Submission(models.Model): project = models.ForeignKey(Project, related_name='all_submissions', on_delete=models.CASCADE) date = models.DateField(auto_now_add=True) name = models.CharField(max_length=255) instrument = models.CharField(max_length=100) notes = models.TextField(blank=True) complete = models.BooleanField(default=False) key = models.CharField(max_length=255, blank=True) def generate_key(self): return "{}_{}_{}_${{filename}}".format( datetime.now().isoformat(timespec='seconds').replace(':', ''), slugify(self.name), slugify(self.instrument) ) def __str__(self): return f"{self.name}: {self.date}"