spaceport/apiserver/apiserver/api/models.py

207 lines
9.4 KiB
Python

from datetime import date, datetime
from django.db import models
from django.contrib.auth.models import User
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.utils.timezone import now, pytz
from simple_history.models import HistoricalRecords
from simple_history import register
register(User)
IGNORE = '+'
def today_alberta_tz():
return datetime.now(pytz.timezone('America/Edmonton')).date()
class Member(models.Model):
user = models.OneToOneField(User, related_name='member', blank=True, null=True, on_delete=models.SET_NULL)
old_email = models.CharField(max_length=254, blank=True, null=True)
photo_large = models.CharField(max_length=64, blank=True, null=True)
photo_medium = models.CharField(max_length=64, blank=True, null=True)
photo_small = models.CharField(max_length=64, blank=True, null=True)
member_forms = models.CharField(max_length=64, blank=True, null=True)
set_details = models.BooleanField(default=False)
first_name = models.CharField(max_length=32)
last_name = models.CharField(max_length=32)
preferred_name = models.CharField(max_length=32)
phone = models.CharField(default='', max_length=32, null=True)
emergency_contact_name = models.CharField(default='', max_length=64, blank=True)
emergency_contact_phone = models.CharField(default='', max_length=32, blank=True)
birthdate = models.DateField(blank=True, null=True)
is_minor = models.BooleanField(default=False)
guardian_name = models.CharField(max_length=32, blank=True, null=True)
street_address = models.CharField(default='', max_length=32, null=True)
city = models.CharField(default='Calgary, AB', max_length=32)
postal_code = models.CharField(max_length=16, null=True)
public_bio = models.CharField(max_length=512, blank=True)
private_notes = models.CharField(max_length=512, blank=True)
is_director = models.BooleanField(default=False)
is_staff = models.BooleanField(default=False)
is_instructor = models.BooleanField(default=False)
status = models.CharField(max_length=32, blank=True, null=True)
expire_date = models.DateField(default=today_alberta_tz, null=True)
current_start_date = models.DateField(default=today_alberta_tz, null=True)
application_date = models.DateField(default=today_alberta_tz, null=True)
vetted_date = models.DateField(blank=True, null=True)
orientation_date = models.DateField(blank=True, null=True, default=None)
lathe_cert_date = models.DateField(blank=True, null=True, default=None)
mill_cert_date = models.DateField(blank=True, null=True, default=None)
wood_cert_date = models.DateField(blank=True, null=True, default=None)
wood2_cert_date = models.DateField(blank=True, null=True, default=None)
tormach_cnc_cert_date = models.DateField(blank=True, null=True, default=None)
precix_cnc_cert_date = models.DateField(blank=True, null=True, default=None)
rabbit_cert_date = models.DateField(blank=True, null=True, default=None)
trotec_cert_date = models.DateField(blank=True, null=True, default=None)
paused_date = models.DateField(blank=True, null=True)
monthly_fees = models.IntegerField(default=55, blank=True, null=True)
is_allowed_entry = models.BooleanField(default=True)
discourse_username = models.CharField(default='', max_length=40, blank=True, null=True)
allow_last_scanned = models.BooleanField(default=True)
history = HistoricalRecords(excluded_fields=['member_forms'])
class Transaction(models.Model):
user = models.ForeignKey(User, related_name='transactions', blank=True, null=True, on_delete=models.SET_NULL)
recorder = models.ForeignKey(User, related_name=IGNORE, blank=True, null=True, on_delete=models.SET_NULL)
member_id = models.IntegerField(blank=True, null=True)
date = models.DateField(default=today_alberta_tz)
amount = models.DecimalField(max_digits=7, decimal_places=2)
reference_number = models.CharField(max_length=32, blank=True, null=True)
memo = models.TextField(blank=True, null=True)
number_of_membership_months = models.IntegerField(blank=True, null=True)
payment_method = models.TextField(blank=True, null=True)
category = models.TextField(blank=True, null=True)
account_type = models.TextField(blank=True, null=True)
info_source = models.TextField(blank=True, null=True)
paypal_txn_id = models.CharField(max_length=17, blank=True, null=True, unique=True)
paypal_txn_type = models.CharField(max_length=64, blank=True, null=True)
paypal_payer_id = models.CharField(max_length=13, blank=True, null=True)
report_type = models.TextField(blank=True, null=True)
report_memo = models.TextField(blank=True, null=True)
history = HistoricalRecords()
class PayPalHint(models.Model):
user = models.ForeignKey(User, related_name='paypal_hints', blank=True, null=True, on_delete=models.SET_NULL)
account = models.CharField(unique=True, max_length=13)
member_id = models.IntegerField(null=True)
history = HistoricalRecords()
class IPN(models.Model):
datetime = models.DateTimeField(auto_now_add=True)
data = models.TextField()
status = models.CharField(max_length=32)
history = HistoricalRecords()
class Card(models.Model):
user = models.ForeignKey(User, related_name='cards', blank=True, null=True, on_delete=models.SET_NULL)
member_id = models.IntegerField(blank=True, null=True)
card_number = models.CharField(unique=True, max_length=16, blank=True, null=True)
notes = models.TextField(blank=True, null=True)
last_seen_at = models.DateField(blank=True, null=True)
last_seen = models.DateTimeField(blank=True, null=True)
active_status = models.CharField(max_length=32, blank=True, null=True)
history = HistoricalRecords(excluded_fields=['last_seen_at', 'last_seen'])
class Course(models.Model):
name = models.TextField(blank=True, null=True)
description = models.TextField(blank=True, null=True)
is_old = models.BooleanField(default=False)
tags = models.CharField(max_length=128, blank=True)
history = HistoricalRecords()
class Session(models.Model):
instructor = models.ForeignKey(User, related_name='teaching', blank=True, null=True, on_delete=models.SET_NULL)
course = models.ForeignKey(Course, related_name='sessions', blank=True, null=True, on_delete=models.SET_NULL)
is_cancelled = models.BooleanField(default=False)
old_instructor = models.TextField(blank=True, null=True)
datetime = models.DateTimeField(blank=True, null=True)
cost = models.DecimalField(max_digits=5, decimal_places=2)
max_students = models.IntegerField(blank=True, null=True)
history = HistoricalRecords()
class Training(models.Model):
user = models.ForeignKey(User, related_name='training', blank=True, null=True, on_delete=models.SET_NULL)
session = models.ForeignKey(Session, related_name='students', blank=True, null=True, on_delete=models.SET_NULL)
member_id = models.IntegerField(blank=True, null=True)
attendance_status = models.TextField(blank=True, null=True)
sign_up_date = models.DateField(default=today_alberta_tz, blank=True, null=True)
paid_date = models.DateField(blank=True, null=True)
history = HistoricalRecords()
class MetaInfo(models.Model):
backup_id = models.TextField()
class StatsMemberCount(models.Model):
date = models.DateField(default=today_alberta_tz)
member_count = models.IntegerField()
green_count = models.IntegerField()
six_month_plus_count = models.IntegerField()
vetted_count = models.IntegerField()
subscriber_count = models.IntegerField()
class StatsSignupCount(models.Model):
month = models.DateField()
signup_count = models.IntegerField()
retain_count = models.IntegerField(default=0)
vetted_count = models.IntegerField(default=0)
class StatsSpaceActivity(models.Model):
date = models.DateField(default=today_alberta_tz)
card_scans = models.IntegerField()
class Usage(models.Model):
user = models.ForeignKey(User, related_name='usages', blank=True, null=True, on_delete=models.SET_NULL)
username = models.CharField(max_length=64, blank=True) # incase of LDAP-Spaceport mismatch
device = models.CharField(max_length=64)
started_at = models.DateTimeField(auto_now_add=True)
finished_at = models.DateTimeField(null=True)
deleted_at = models.DateTimeField(null=True)
num_seconds = models.IntegerField()
num_reports = models.IntegerField()
memo = models.TextField(blank=True)
should_bill = models.BooleanField(default=True)
history = HistoricalRecords(excluded_fields=['num_reports'])
class HistoryIndex(models.Model):
content_type = models.ForeignKey(ContentType, null=True, on_delete=models.SET_NULL)
object_id = models.PositiveIntegerField()
history = GenericForeignKey('content_type', 'object_id')
owner_id = models.PositiveIntegerField()
owner_name = models.TextField()
object_name = models.TextField()
history_user = models.ForeignKey(User, null=True, on_delete=models.SET_NULL)
history_date = models.DateTimeField()
history_type = models.TextField()
revert_url = models.TextField()
is_system = models.BooleanField()
is_admin = models.BooleanField()
class HistoryChange(models.Model):
index = models.ForeignKey(HistoryIndex, related_name='changes', null=True, on_delete=models.SET_NULL)
field = models.TextField()
old = models.TextField()
new = models.TextField()