Files
website-v2/libraries/models.py
2023-03-23 12:13:35 -07:00

169 lines
5.3 KiB
Python

from urllib.parse import urlparse
from django.db import models
from django.utils.text import slugify
class Category(models.Model):
"""
Library categories such as:
- Math and Numerics
- Algorithms
- etc
"""
name = models.CharField(max_length=100)
slug = models.SlugField(blank=True, null=True)
class Meta:
verbose_name_plural = "Categories"
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
return super(Category, self).save(*args, **kwargs)
class Library(models.Model):
"""
Model to represent component Libraries of Boost
The Library model is the main model for Boost Libraries. Default values
come from the .gitmodules file in the main Boost repo, and the libraries.json
file in the meta/ directory of Boost library repos.
Most libraries have a single Library object, but some libraries have multiple
Library objects. For example, the Boost Math library has a Library object
for multiple sub-libraries. Each of those libraries will be its own Library
object, and will have the github_url to the main library repo.
"""
name = models.CharField(max_length=100, db_index=True, help_text="The name of the library as defined in libraries.json.")
key = models.CharField(max_length=100, blank=True, null=True, help_text="The key of the library as defined in libraries.json.")
slug = models.SlugField(blank=True, null=True, help_text="The slug of the library, used in the URL.")
description = models.TextField(blank=True, null=True, help_text="The description of the library.")
github_url = models.URLField(max_length=500, blank=True, null=True, help_text="The URL of the library's GitHub repository.")
first_release = models.ForeignKey(
"versions.Version",
related_name="first_releases",
on_delete=models.CASCADE,
blank=True,
null=True,
)
versions = models.ManyToManyField(
"versions.Version", through="libraries.LibraryVersion", related_name="libraries"
)
cpp_standard_minimum = models.CharField(max_length=50, blank=True, null=True)
active_development = models.BooleanField(default=True, db_index=True)
last_github_update = models.DateTimeField(blank=True, null=True, db_index=True)
categories = models.ManyToManyField(Category, related_name="libraries")
authors = models.ManyToManyField("users.User", related_name="authors")
closed_prs_per_month = models.IntegerField(blank=True, null=True)
open_issues = models.IntegerField(blank=True, null=True)
commits_per_release = models.IntegerField(blank=True, null=True)
class Meta:
verbose_name_plural = "Libraries"
def __str__(self):
return self.name
def save(self, *args, **kwargs):
if not self.slug:
self.slug = slugify(self.name)
return super().save(*args, **kwargs)
def github_properties(self):
parts = urlparse(self.github_url)
path = parts.path.split("/")
owner = path[1]
repo = path[2]
return {
"owner": owner,
"repo": repo,
}
@property
def github_owner(self):
return self.github_properties()["owner"]
@property
def github_repo(self):
return self.github_properties()["repo"]
class LibraryVersion(models.Model):
version = models.ForeignKey(
"versions.Version",
related_name="library_version",
on_delete=models.SET_NULL,
null=True,
)
library = models.ForeignKey(
"libraries.Library",
related_name="library_version",
on_delete=models.SET_NULL,
null=True,
)
maintainers = models.ManyToManyField("users.User", related_name="maintainers")
def __str__(self):
return f"{self.library.name} ({self.version.name})"
class Issue(models.Model):
"""
Model that tracks Library repository issues in Github
"""
library = models.ForeignKey(
Library, related_name="issues", on_delete=models.CASCADE
)
title = models.CharField(max_length=255)
number = models.IntegerField()
github_id = models.CharField(max_length=100, db_index=True)
is_open = models.BooleanField(default=False, db_index=True)
closed = models.DateTimeField(blank=True, null=True, db_index=True)
created = models.DateTimeField(db_index=True)
modified = models.DateTimeField(db_index=True)
data = models.JSONField(default=dict)
def __str__(self):
return f"({self.number}) - {self.title}"
class PullRequest(models.Model):
"""
Model that tracks Pull Requests in Github for a Library
"""
library = models.ForeignKey(
Library, related_name="pull_requests", on_delete=models.CASCADE
)
title = models.CharField(max_length=255)
number = models.IntegerField()
github_id = models.CharField(max_length=100, db_index=True)
is_open = models.BooleanField(default=False, db_index=True)
closed = models.DateTimeField(blank=True, null=True, db_index=True)
merged = models.DateTimeField(blank=True, null=True, db_index=True)
created = models.DateTimeField(db_index=True)
modified = models.DateTimeField(db_index=True)
data = models.JSONField(default=dict)
def __str__(self):
return f"({self.number}) - {self.title}"