2022-11-07 13:49:39 -05:00
|
|
|
import re
|
2023-01-18 21:29:36 -05:00
|
|
|
|
2023-01-31 13:16:36 -05:00
|
|
|
from semver import VersionInfo
|
2023-01-18 21:29:36 -05:00
|
|
|
from django.db import models
|
2023-04-01 01:07:17 -04:00
|
|
|
from django.db.models import OuterRef, Q, ExpressionWrapper, Subquery
|
2023-01-18 21:29:36 -05:00
|
|
|
from django.core.validators import RegexValidator
|
2021-03-23 17:08:00 -04:00
|
|
|
|
2023-01-18 21:29:36 -05:00
|
|
|
from membershipworks.models import Member, Flag as MembershipWorksFlag
|
2021-03-23 17:11:11 -04:00
|
|
|
|
|
|
|
|
2021-03-23 17:08:00 -04:00
|
|
|
class CmsRedRiverVeteransScholarship(models.Model):
|
|
|
|
serial = models.AutoField(primary_key=True)
|
2022-02-11 13:48:47 -05:00
|
|
|
program_name = models.CharField(db_column="Program Name", max_length=255)
|
|
|
|
member_name = models.CharField(
|
|
|
|
db_column="Member Name", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
discount_percent = models.DecimalField(
|
|
|
|
db_column="Discount Percent",
|
|
|
|
max_digits=16,
|
|
|
|
decimal_places=0,
|
|
|
|
blank=True,
|
|
|
|
null=True,
|
|
|
|
)
|
|
|
|
discount_code = models.CharField(
|
|
|
|
db_column="Discount Code", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
membership_code = models.CharField(
|
|
|
|
db_column="Membership Code", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
start_date = models.DateField(db_column="Start Date", blank=True, null=True)
|
|
|
|
end_date = models.DateField(db_column="End Date", blank=True, null=True)
|
|
|
|
program_amount = models.DecimalField(
|
|
|
|
db_column="Program Amount",
|
|
|
|
max_digits=16,
|
|
|
|
decimal_places=0,
|
|
|
|
blank=True,
|
|
|
|
null=True,
|
|
|
|
)
|
|
|
|
program_status = models.CharField(
|
|
|
|
db_column="Program Status", max_length=16, blank=True, null=True
|
|
|
|
)
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return f"{self.program_name} {self.member_name}"
|
|
|
|
|
|
|
|
class Meta:
|
2022-02-11 13:48:47 -05:00
|
|
|
db_table = "CMS Red River Veterans Scholarship"
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
|
2023-01-18 21:29:36 -05:00
|
|
|
class Department(models.Model):
|
|
|
|
name = models.CharField(
|
|
|
|
max_length=64,
|
|
|
|
validators=[RegexValidator("^[-_ A-Za-z0-9]*$")],
|
|
|
|
help_text="This will also be used to generate the mailing list name",
|
|
|
|
)
|
|
|
|
parent = models.ForeignKey(
|
|
|
|
"self", on_delete=models.PROTECT, related_name="children", blank=True, null=True
|
|
|
|
)
|
2023-01-19 16:02:17 -05:00
|
|
|
has_mailing_list = models.BooleanField(default=False)
|
2023-01-23 21:06:06 -05:00
|
|
|
shop_lead_flag = models.ForeignKey(
|
2023-01-18 21:29:36 -05:00
|
|
|
MembershipWorksFlag,
|
|
|
|
on_delete=models.PROTECT,
|
|
|
|
blank=True,
|
|
|
|
null=True,
|
|
|
|
db_constraint=False,
|
2023-01-23 21:06:06 -05:00
|
|
|
help_text="This will also be used to set the moderators for the mailing list",
|
2023-01-18 21:29:36 -05:00
|
|
|
)
|
|
|
|
list_reply_to_address = models.EmailField(max_length=254, blank=True)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.name
|
|
|
|
|
|
|
|
@property
|
|
|
|
def list_name(self):
|
2023-02-02 14:51:39 -05:00
|
|
|
if self.has_mailing_list:
|
|
|
|
return self.name.replace(" ", "_") + "-info"
|
|
|
|
else:
|
|
|
|
return None
|
2023-01-18 21:29:36 -05:00
|
|
|
|
2023-02-02 15:08:48 -05:00
|
|
|
@property
|
|
|
|
def list_address(self):
|
|
|
|
if self.has_mailing_list:
|
|
|
|
return self.list_name + "@claremontmakerspace.org"
|
|
|
|
else:
|
|
|
|
return None
|
|
|
|
|
2023-01-18 21:29:36 -05:00
|
|
|
|
2021-03-23 17:08:00 -04:00
|
|
|
class CertificationDefinition(models.Model):
|
2022-02-11 13:48:47 -05:00
|
|
|
certification_identifier = models.AutoField(
|
|
|
|
db_column="Certification Identifier", primary_key=True
|
|
|
|
)
|
|
|
|
certification_name = models.CharField(
|
|
|
|
db_column="Certification Name", max_length=255, blank=True, null=True
|
|
|
|
)
|
2023-01-18 21:29:36 -05:00
|
|
|
department = models.ForeignKey(Department, models.PROTECT)
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
def __str__(self):
|
2021-04-29 14:01:07 -04:00
|
|
|
return f"{self.certification_name} <{self.department}>"
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
class Meta:
|
2022-02-11 13:48:47 -05:00
|
|
|
db_table = "Certification Definitions"
|
|
|
|
ordering = ("certification_name", "department")
|
2021-03-23 17:08:00 -04:00
|
|
|
|
2022-11-07 13:49:39 -05:00
|
|
|
def latest_version(self) -> "CertificationVersion":
|
2023-02-01 00:11:28 -05:00
|
|
|
return self.certificationversion_set.latest()
|
|
|
|
|
|
|
|
|
|
|
|
class CertificationVersionManager(models.Manager):
|
|
|
|
def get_queryset(self):
|
|
|
|
qs = super().get_queryset()
|
2023-02-02 22:06:18 -05:00
|
|
|
latest = qs.filter(definition__pk=OuterRef("definition__pk")).reverse()
|
2023-02-01 00:11:28 -05:00
|
|
|
return qs.annotate(
|
2023-04-01 01:07:17 -04:00
|
|
|
is_latest=ExpressionWrapper(
|
|
|
|
Q(pk=Subquery(latest.values("pk")[:1])),
|
|
|
|
output_field=models.BooleanField(),
|
|
|
|
),
|
2023-02-01 00:11:28 -05:00
|
|
|
# TODO: should do a more correct comparison than just major version
|
2023-04-01 01:07:17 -04:00
|
|
|
is_current=ExpressionWrapper(
|
|
|
|
Q(major=Subquery(latest.values("major")[:1])),
|
|
|
|
output_field=models.BooleanField(),
|
|
|
|
),
|
2023-02-01 00:11:28 -05:00
|
|
|
)
|
2022-11-07 13:49:39 -05:00
|
|
|
|
2021-03-23 17:08:00 -04:00
|
|
|
|
2022-02-04 16:30:52 -05:00
|
|
|
class CertificationVersion(models.Model):
|
2023-02-01 00:11:28 -05:00
|
|
|
objects = CertificationVersionManager()
|
|
|
|
|
2022-02-11 13:48:47 -05:00
|
|
|
definition = models.ForeignKey(
|
|
|
|
CertificationDefinition, on_delete=models.PROTECT, db_column="Certification"
|
|
|
|
)
|
2023-01-31 18:53:36 -05:00
|
|
|
major = models.PositiveSmallIntegerField()
|
|
|
|
minor = models.PositiveSmallIntegerField()
|
|
|
|
patch = models.PositiveSmallIntegerField()
|
|
|
|
prerelease = models.CharField(max_length=255, blank=True)
|
|
|
|
approval_date = models.DateField(blank=True, null=True)
|
2022-02-04 16:30:52 -05:00
|
|
|
|
|
|
|
def __str__(self):
|
2023-01-31 18:53:36 -05:00
|
|
|
return f"{self.definition} [{self.semantic_version()}]"
|
2022-02-04 16:30:52 -05:00
|
|
|
|
|
|
|
class Meta:
|
|
|
|
constraints = [
|
|
|
|
models.UniqueConstraint(
|
2023-01-31 18:53:36 -05:00
|
|
|
fields=["definition", "major", "minor", "patch", "prerelease"],
|
|
|
|
name="unique_certification_version",
|
2022-02-04 16:30:52 -05:00
|
|
|
)
|
|
|
|
]
|
2023-03-30 12:27:51 -04:00
|
|
|
ordering = (
|
|
|
|
"definition",
|
|
|
|
"major",
|
|
|
|
"minor",
|
|
|
|
"patch",
|
|
|
|
"prerelease",
|
|
|
|
"approval_date",
|
|
|
|
)
|
2023-02-01 00:11:28 -05:00
|
|
|
get_latest_by = ("major", "minor", "patch", "prerelease", "approval_date")
|
|
|
|
base_manager_name = "objects"
|
2022-02-04 16:30:52 -05:00
|
|
|
|
2023-01-31 13:16:36 -05:00
|
|
|
def semantic_version(self) -> VersionInfo:
|
2023-01-31 18:53:36 -05:00
|
|
|
return VersionInfo(
|
|
|
|
self.major or 0,
|
|
|
|
self.minor or 0,
|
|
|
|
self.patch or 0,
|
|
|
|
re.sub(r"[^.a-zA-Z0-9]", "-", self.prerelease),
|
|
|
|
self.approval_date.isoformat() if self.approval_date is not None else None,
|
|
|
|
)
|
2022-11-07 13:49:39 -05:00
|
|
|
|
2022-02-04 16:30:52 -05:00
|
|
|
|
2021-03-23 17:08:00 -04:00
|
|
|
class Certification(models.Model):
|
2022-02-11 13:48:47 -05:00
|
|
|
number = models.AutoField(db_column="Number", primary_key=True)
|
|
|
|
certification_version = models.ForeignKey(
|
|
|
|
CertificationVersion, on_delete=models.PROTECT
|
|
|
|
)
|
|
|
|
name = models.CharField(db_column="Name", max_length=255)
|
|
|
|
member = models.ForeignKey(
|
|
|
|
Member,
|
|
|
|
on_delete=models.PROTECT,
|
|
|
|
to_field="uid",
|
|
|
|
db_column="uid",
|
|
|
|
blank=True,
|
|
|
|
null=True,
|
|
|
|
db_constraint=False,
|
|
|
|
)
|
|
|
|
certified_by = models.CharField(
|
|
|
|
db_column="Certified_By", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
date = models.DateField(db_column="Date", blank=True, null=True)
|
|
|
|
shop_lead_notified = models.DateTimeField(
|
|
|
|
db_column="Shop Lead Notified", blank=True, null=True
|
|
|
|
)
|
|
|
|
notes = models.CharField(db_column="Notes", max_length=255, blank=True, null=True)
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
def __str__(self):
|
2022-02-04 16:30:52 -05:00
|
|
|
return f"{self.name} - {self.certification_version}"
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
class Meta:
|
2022-02-11 13:48:47 -05:00
|
|
|
db_table = "Certifications"
|
2022-02-28 16:36:29 -05:00
|
|
|
permissions = [
|
|
|
|
(
|
|
|
|
"receive_certification_emails",
|
|
|
|
"Receives notifications of all new certifications",
|
|
|
|
),
|
|
|
|
]
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
|
|
|
|
class InstructorOrVendor(models.Model):
|
|
|
|
serial = models.AutoField(primary_key=True)
|
2022-02-11 13:48:47 -05:00
|
|
|
name = models.CharField(db_column="Name", max_length=255)
|
|
|
|
instructor_agreement_date = models.DateField(
|
|
|
|
db_column="Instructor Agreement Date", blank=True, null=True
|
|
|
|
)
|
|
|
|
w9_date = models.DateField(db_column="W9 date", blank=True, null=True)
|
2021-03-23 17:08:00 -04:00
|
|
|
phone = models.CharField(max_length=255, blank=True, null=True)
|
2022-02-11 13:48:47 -05:00
|
|
|
email_address = models.CharField(
|
|
|
|
db_column="email address", max_length=255, blank=True, null=True
|
|
|
|
)
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return f"{self.name}"
|
|
|
|
|
|
|
|
class Meta:
|
2022-02-11 13:48:47 -05:00
|
|
|
db_table = "Instructors and Vendors"
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
|
|
|
|
class SpecialProgram(models.Model):
|
2022-02-11 13:48:47 -05:00
|
|
|
program_name = models.CharField(
|
|
|
|
db_column="Program Name", primary_key=True, max_length=255
|
|
|
|
)
|
|
|
|
discount_percent = models.DecimalField(
|
|
|
|
db_column="Discount Percent",
|
|
|
|
max_digits=16,
|
|
|
|
decimal_places=0,
|
|
|
|
blank=True,
|
|
|
|
null=True,
|
|
|
|
)
|
|
|
|
discount_code = models.CharField(
|
|
|
|
db_column="Discount Code", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
membership_code = models.CharField(
|
|
|
|
db_column="Membership Code", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
start_date = models.DateField(db_column="Start Date", blank=True, null=True)
|
|
|
|
end_date = models.DateField(db_column="End Date", blank=True, null=True)
|
|
|
|
program_amount = models.DecimalField(
|
|
|
|
db_column="Program Amount",
|
|
|
|
max_digits=16,
|
|
|
|
decimal_places=0,
|
|
|
|
blank=True,
|
|
|
|
null=True,
|
|
|
|
)
|
|
|
|
program_status = models.CharField(
|
|
|
|
db_column="Program Status", max_length=16, blank=True, null=True
|
|
|
|
)
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return self.program_name
|
|
|
|
|
|
|
|
class Meta:
|
2022-02-11 13:48:47 -05:00
|
|
|
db_table = "Special_Programs"
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
|
|
|
|
class Waiver(models.Model):
|
2022-02-11 13:48:47 -05:00
|
|
|
number = models.AutoField(db_column="Number", primary_key=True)
|
|
|
|
name = models.CharField(db_column="Name", max_length=255)
|
|
|
|
date = models.DateField(db_column="Date")
|
|
|
|
emergency_contact_name = models.CharField(
|
|
|
|
db_column="Emergency Contact Name", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
emergency_contact_number = models.CharField(
|
|
|
|
db_column="Emergency Contact Number", max_length=25, blank=True, null=True
|
|
|
|
)
|
|
|
|
waiver_version = models.CharField(db_column="Waiver version", max_length=64)
|
|
|
|
guardian_name = models.CharField(
|
|
|
|
db_column="Guardian Name", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
guardian_relation = models.CharField(
|
|
|
|
db_column="Guardian Relation", max_length=255, blank=True, null=True
|
|
|
|
)
|
|
|
|
guardian_date = models.DateField(db_column="Guardian Date", blank=True, null=True)
|
2021-03-23 17:08:00 -04:00
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return f"{self.name} {self.date}"
|
|
|
|
|
|
|
|
class Meta:
|
2022-02-11 13:48:47 -05:00
|
|
|
db_table = "Waivers"
|