Skip to content
This repository has been archived by the owner on Mar 17, 2024. It is now read-only.

Commit

Permalink
Merge pull request #258 from /issues/237
Browse files Browse the repository at this point in the history
Bugfix for issue #237
  • Loading branch information
carmat88 committed Nov 18, 2021
2 parents 4b0fe63 + 6cad754 commit 979b46b
Showing 1 changed file with 91 additions and 57 deletions.
148 changes: 91 additions & 57 deletions components/studio/projects/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,20 @@
import uuid
from django_cryptography.fields import encrypt


class ReleaseName(models.Model):
name = models.CharField(max_length=512)
status = models.CharField(max_length=10)
project = models.ForeignKey('projects.Project', on_delete=models.CASCADE, null=True)
app = models.ForeignKey('apps.AppInstance', on_delete=models.CASCADE, null=True, blank=True)
project = models.ForeignKey(
'projects.Project', on_delete=models.CASCADE, null=True)
app = models.ForeignKey(
'apps.AppInstance', on_delete=models.CASCADE, null=True, blank=True)
created = models.DateTimeField(auto_now_add=True)

def __str__(self):
return '{}-{}-{}'.format(self.name, self.project, self.app)


class Flavor(models.Model):
name = models.CharField(max_length=512)

Expand All @@ -33,8 +38,8 @@ class Flavor(models.Model):
gpu_lim = models.TextField(blank=True, null=True, default="0")
ephmem_lim = models.TextField(blank=True, null=True, default="200Mi")


project = models.ForeignKey('projects.Project', on_delete=models.CASCADE, null=True)
project = models.ForeignKey(
'projects.Project', on_delete=models.CASCADE, null=True)
# app = models.ForeignKey('apps.Apps', on_delete=models.CASCADE)

updated_at = models.DateTimeField(auto_now=True)
Expand All @@ -47,14 +52,17 @@ def __str__(self):
class Environment(models.Model):
name = models.CharField(max_length=100)
slug = models.CharField(max_length=100, null=True)

project = models.ForeignKey('projects.Project', on_delete=models.CASCADE, null=True)

project = models.ForeignKey(
'projects.Project', on_delete=models.CASCADE, null=True)

repository = models.CharField(max_length=100, blank=True, null=True)
image = models.CharField(max_length=100)

registry = models.ForeignKey('apps.AppInstance', related_name="environments", null=True, blank=True, on_delete=models.CASCADE)
appenv = models.ForeignKey('apps.AppInstance', related_name="envobj", null=True, blank=True, on_delete=models.CASCADE)
registry = models.ForeignKey(
'apps.AppInstance', related_name="environments", null=True, blank=True, on_delete=models.CASCADE)
appenv = models.ForeignKey('apps.AppInstance', related_name="envobj",
null=True, blank=True, on_delete=models.CASCADE)
app = models.ForeignKey('apps.Apps', on_delete=models.CASCADE, null=True)

updated_at = models.DateTimeField(auto_now=True)
Expand All @@ -64,104 +72,121 @@ def __str__(self):
return str(self.name)


class ProjectManager(models.Manager):
def generate_passkey(self, length=20):
import secrets
import string
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for _ in range(length))
# Encrypt the key
password = password.encode('ascii')
base64_bytes = base64.b64encode(password)
password = base64_bytes.decode('ascii')

return password

def create_project(self, name, owner, description, repository):
letters = string.ascii_lowercase
slug = slugify(name)
slug_extension = ''.join(random.choice(letters) for i in range(3))

slug = '{}-{}'.format(slugify(slug), slug_extension)
key = self.generate_passkey()
secret = self.generate_passkey(40)

project = self.create(name=name, owner=owner, slug=slug, project_key=key, project_secret=secret,
description=description, repository=repository,
repository_imported=False)

return project

class S3(models.Model):
name = models.CharField(max_length=512)
owner = models.ForeignKey(User, on_delete=models.DO_NOTHING)
project = models.ForeignKey('Project', on_delete=models.CASCADE, related_name='s3_project')
project = models.ForeignKey(
'Project', on_delete=models.CASCADE, related_name='s3_project')
host = models.CharField(max_length=512)
access_key = models.CharField(max_length=512)
secret_key = models.CharField(max_length=512)
region = models.CharField(max_length=512, blank=True, default="")
app = models.OneToOneField('apps.AppInstance', on_delete=models.CASCADE, null=True, blank=True, related_name="s3obj")
app = models.OneToOneField(
'apps.AppInstance', on_delete=models.CASCADE, null=True, blank=True, related_name="s3obj")
updated_on = models.DateTimeField(auto_now=True)
created_on = models.DateTimeField(auto_now_add=True)

def __str__(self):
return '{} ({})'.format(self.name, self.project.slug)


class BasicAuth(models.Model):
name = models.CharField(max_length=512)
owner = models.ForeignKey(User, on_delete=models.DO_NOTHING)
project = models.ForeignKey('Project', on_delete=models.CASCADE, related_name='ba_project', null=True)
project = models.ForeignKey(
'Project', on_delete=models.CASCADE, related_name='ba_project', null=True)
username = models.CharField(max_length=100, blank=True, default="")
password = models.CharField(max_length=100, blank=True, default="")


class MLFlow(models.Model):
name = models.CharField(max_length=512)
owner = models.ForeignKey(User, on_delete=models.DO_NOTHING)
project = models.ForeignKey('Project', on_delete=models.CASCADE, related_name='mlflow_project')
project = models.ForeignKey(
'Project', on_delete=models.CASCADE, related_name='mlflow_project')
mlflow_url = models.CharField(max_length=512)
s3 = models.ForeignKey(S3, on_delete=models.DO_NOTHING, blank=True, null=True)
basic_auth = models.ForeignKey(BasicAuth, on_delete=models.DO_NOTHING, null=True, blank=True)
app = models.OneToOneField('apps.AppInstance', on_delete=models.CASCADE, null=True, blank=True, related_name="mlflowobj")
s3 = models.ForeignKey(
S3, on_delete=models.DO_NOTHING, blank=True, null=True)
basic_auth = models.ForeignKey(
BasicAuth, on_delete=models.DO_NOTHING, null=True, blank=True)
app = models.OneToOneField('apps.AppInstance', on_delete=models.CASCADE,
null=True, blank=True, related_name="mlflowobj")
updated_on = models.DateTimeField(auto_now=True)
created_on = models.DateTimeField(auto_now_add=True)

def __str__(self):
return '{} ({})'.format(self.name, self.project.slug)


class ProjectTemplate(models.Model):
name = models.CharField(max_length=512)
slug = models.CharField(max_length=512, default="")
revision = models.IntegerField(default=1)
description = models.TextField(null=True, blank=True)
template = models.TextField(null=True, blank=True)
image = models.ImageField(upload_to='projecttemplates/images/', null=True, blank=True, default=None)

image = models.ImageField(
upload_to='projecttemplates/images/', null=True, blank=True, default=None)

class Meta:
unique_together = ('slug', 'revision',)

def __str__(self):
return '{} ({})'.format(self.name, self.revision)


class ProjectManager(models.Manager):
def generate_passkey(self, length=20):
import secrets
import string
alphabet = string.ascii_letters + string.digits
password = ''.join(secrets.choice(alphabet) for _ in range(length))
# Encrypt the key
password = password.encode('ascii')
base64_bytes = base64.b64encode(password)
password = base64_bytes.decode('ascii')

return password

def create_project(self, name, owner, description, repository):
letters = string.ascii_lowercase
slug = slugify(name)
slug_extension = ''.join(random.choice(letters) for i in range(3))

slug = '{}-{}'.format(slugify(slug), slug_extension)
key = self.generate_passkey()
secret = self.generate_passkey(40)

project = self.create(name=name, owner=owner, slug=slug, project_key=key, project_secret=secret,
description=description, repository=repository,
repository_imported=False)

return project


class Project(models.Model):
objects = ProjectManager()

name = models.CharField(max_length=512)
name = models.CharField(max_length=512, null=False, blank=False)
description = models.TextField(null=True, blank=True)
slug = models.CharField(max_length=512, unique=True)
owner = models.ForeignKey(User, on_delete=models.DO_NOTHING, related_name='owner')
owner = models.ForeignKey(
User, on_delete=models.DO_NOTHING, related_name='owner')
authorized = models.ManyToManyField(User, blank=True)

s3storage = models.OneToOneField(S3, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='project_s3')
mlflow = models.OneToOneField(MLFlow, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='project_mlflow')
s3storage = models.OneToOneField(
S3, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='project_s3')
mlflow = models.OneToOneField(
MLFlow, on_delete=models.DO_NOTHING, null=True, blank=True, related_name='project_mlflow')

status = models.CharField(max_length=20, null=True, blank=True, default="active")
status = models.CharField(max_length=20, null=True,
blank=True, default="active")


project_image = models.ImageField(upload_to='projects/images/', null=True, blank=True, default=None)
project_image = models.ImageField(
upload_to='projects/images/', null=True, blank=True, default=None)

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



# These fields should be removed.
image = models.CharField(max_length=2048, blank=True, null=True)
project_key = models.CharField(max_length=512)
Expand All @@ -172,6 +197,15 @@ class Project(models.Model):
repository_imported = models.BooleanField(default=False)
# ----------------------

def save(self, *args, **kwargs):
self.full_clean() # performs regular validation then clean()
super(Project, self).save(*args, **kwargs)

def clean(self):
# Custom validation https://docs.djangoproject.com/en/3.2/ref/models/instances/#validating-objects
if self.name:
self.name = self.name.strip()

def __str__(self):
return "Name: {} ({})".format(self.name, self.status)

Expand All @@ -189,9 +223,9 @@ class ProjectLog(models.Model):
('RE', 'reports'),
('UN', 'undefined'),
]
module = models.CharField(max_length=2, choices=MODULE_CHOICES, default='UN')
module = models.CharField(
max_length=2, choices=MODULE_CHOICES, default='UN')

headline = models.CharField(max_length=256)
description = models.CharField(max_length=512)
created_at = models.DateTimeField(auto_now_add=True)

0 comments on commit 979b46b

Please sign in to comment.