2023-10-17 20:00:25 +00:00
|
|
|
import logging
|
|
|
|
import uuid
|
|
|
|
|
|
|
|
from django.contrib.auth.models import AbstractUser
|
|
|
|
from django.db import models
|
|
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
2023-10-17 21:09:05 +00:00
|
|
|
SITE_CHOICES = (
|
|
|
|
("5HT2C", "5-HT2C"),
|
|
|
|
("5HT2A", "5-HT2A"),
|
|
|
|
("GABAB", "GABAB"),
|
|
|
|
("NMDA", "NMDA"),
|
|
|
|
)
|
|
|
|
|
|
|
|
MECHANISM_CHOICES = (
|
|
|
|
("AGONISM", "Agonism"),
|
|
|
|
("ANTAGONISM", "Antagomism"),
|
|
|
|
("MODULATION", "Modulation"),
|
|
|
|
)
|
|
|
|
|
|
|
|
SOURCE_TYPE_CHOICES = (
|
|
|
|
("PSITE", "Professional pharmaceutical data repository"),
|
|
|
|
("DWIKI", "Dedicated peer-reviewed community wiki"),
|
|
|
|
("CWIKI", "Peer-reviewed community wiki"),
|
|
|
|
("WIKI", "Private wiki"),
|
|
|
|
("DFORUM", "Dedicated community forum"),
|
|
|
|
("FORUM", "Community forum"),
|
|
|
|
)
|
|
|
|
|
|
|
|
DOSAGE_UNIT_CHOICES = (
|
|
|
|
("mg", "mg"),
|
|
|
|
("g", "g"),
|
|
|
|
("ug", "ug"),
|
|
|
|
)
|
|
|
|
|
|
|
|
DOSAGE_TIMING_CHOICES = (
|
|
|
|
("SECONDS", "Seconds"),
|
|
|
|
("MINUTES", "Minutes"),
|
|
|
|
("HOURS", "Hours"),
|
|
|
|
("DAYS", "Days :D"),
|
|
|
|
("WEEKS", "Weeks :O"),
|
|
|
|
("MONTHS", "Months :-|"),
|
|
|
|
("YEARS", "Years x_X"),
|
|
|
|
)
|
|
|
|
|
|
|
|
SEI_TYPE_CHOICES = (
|
|
|
|
("PHYSICAL", "Physical"),
|
|
|
|
("COGNITIVE", "Cognitive"),
|
|
|
|
("VISUAL", "Visual"),
|
|
|
|
("AUDITORY", "Auditory"),
|
|
|
|
("MULTISENSORY", "Multi-sensory"),
|
|
|
|
("TRANSPERSONAL", "Transpersonal"),
|
|
|
|
)
|
|
|
|
|
2023-10-17 20:00:25 +00:00
|
|
|
|
|
|
|
class User(AbstractUser):
|
|
|
|
# Stripe customer ID
|
|
|
|
stripe_id = models.CharField(max_length=255, null=True, blank=True)
|
|
|
|
customer_id = models.UUIDField(default=uuid.uuid4, null=True, blank=True)
|
|
|
|
billing_provider_id = models.CharField(max_length=255, null=True, blank=True)
|
|
|
|
email = models.EmailField(unique=True)
|
|
|
|
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self._original = self
|
|
|
|
|
|
|
|
def get_notification_settings(self):
|
|
|
|
return NotificationSettings.objects.get_or_create(user=self)[0]
|
|
|
|
|
|
|
|
|
|
|
|
class NotificationSettings(models.Model):
|
|
|
|
user = models.OneToOneField(User, on_delete=models.CASCADE)
|
|
|
|
ntfy_topic = models.CharField(max_length=255, null=True, blank=True)
|
|
|
|
ntfy_url = models.CharField(max_length=255, null=True, blank=True)
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
return f"Notification settings for {self.user}"
|
|
|
|
|
|
|
|
|
2023-10-17 21:09:05 +00:00
|
|
|
class Source(models.Model):
|
|
|
|
name = models.CharField(max_length=255, unique=True)
|
|
|
|
type = models.CharField(max_length=255, choices=SOURCE_TYPE_CHOICES)
|
|
|
|
endpoint = models.CharField(max_length=1024, blank=True, null=True)
|
|
|
|
score = models.IntegerField(blank=True)
|
|
|
|
|
|
|
|
|
|
|
|
class Entry(models.Model):
|
|
|
|
source = models.ForeignKey(Source)
|
|
|
|
slug = models.CharField(max_length=1024)
|
|
|
|
|
|
|
|
|
|
|
|
class Dosage(models.Model):
|
|
|
|
entry = models.ForeignKey("core.Entry")
|
|
|
|
unit = models.CharField(max_length=255, choices=DOSAGE_UNIT_CHOICES)
|
|
|
|
threshold = models.IntegerField()
|
|
|
|
light = models.IntegerField()
|
|
|
|
common = models.IntegerField()
|
|
|
|
strong = models.IntegerField()
|
|
|
|
heavy = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class Timing(models.Model):
|
|
|
|
entry = models.ForeignKey("core.Entry")
|
|
|
|
unit = models.CharField(
|
|
|
|
max_length=255, choices=DOSAGE_TIMING_CHOICES, default="HOURS"
|
|
|
|
)
|
|
|
|
onset = models.IntegerField()
|
|
|
|
comeup = models.IntegerField()
|
|
|
|
peak = models.IntegerField()
|
|
|
|
total = models.IntegerField()
|
|
|
|
|
|
|
|
|
|
|
|
class SEI(models.Model):
|
|
|
|
"""
|
|
|
|
Subjective Effect Index from Psychonaut Wiki.
|
|
|
|
"""
|
|
|
|
|
|
|
|
type = models.CharField(
|
|
|
|
max_length=255, choices=SEI_TYPE_CHOICES, default="PHYSICAL"
|
|
|
|
)
|
|
|
|
description = models.CharField(max_length=4096, blank=True, null=True)
|
|
|
|
|
|
|
|
|
|
|
|
class Effect(models.Model):
|
|
|
|
entry = models.ForeignKey("core.Entry")
|
|
|
|
subjective_effects = models.ManyToManyField(SEI)
|
|
|
|
|
|
|
|
|
|
|
|
class Action(models.Model):
|
|
|
|
"""
|
|
|
|
Site action record for a drug.
|
|
|
|
"""
|
|
|
|
|
|
|
|
site = models.CharField(max_length=255, choices=SITE_CHOICES)
|
|
|
|
mechanism = models.CharField(max_length=255, choices=MECHANISM_CHOICES)
|
|
|
|
affinity = models.IntegerField(blank=True)
|
|
|
|
|
|
|
|
|
|
|
|
class Drug(models.Model):
|
|
|
|
"""
|
|
|
|
Model of a drug. Not open to interpretation.
|
|
|
|
"""
|
|
|
|
|
|
|
|
# Lysergic acid diethylamide, Phenibut
|
|
|
|
name = models.CharField(max_length=255, unique=True)
|
|
|
|
|
|
|
|
# Psychedelic, Sedative
|
|
|
|
drug_class = models.CharField(max_length=255)
|
|
|
|
|
|
|
|
# LSD
|
|
|
|
common_name = models.CharField(max_length=1024, unique=True)
|
|
|
|
|
|
|
|
links = models.ManyToManyField(Entry)
|
|
|
|
dosages = models.ManyToManyField(Dosage)
|
|
|
|
timings = models.ManyToManyField(Timing)
|
|
|
|
effects = models.ManyToManyField(Effect)
|
|
|
|
actions = models.ManyToManyField(Action)
|
|
|
|
|
|
|
|
|
2023-10-17 20:00:25 +00:00
|
|
|
# class Perms(models.Model):
|
|
|
|
# class Meta:
|
|
|
|
# permissions = (
|
|
|
|
# ("bypass_hashing", "Can bypass field hashing"), #
|
|
|
|
# ("bypass_blacklist", "Can bypass the blacklist"), #
|
|
|
|
# ("bypass_encryption", "Can bypass field encryption"), #
|
|
|
|
# ("bypass_obfuscation", "Can bypass field obfuscation"), #
|
|
|
|
# ("bypass_delay", "Can bypass data delay"), #
|
|
|
|
# ("bypass_randomisation", "Can bypass data randomisation"), #
|
|
|
|
# ("post_irc", "Can post to IRC"),
|
|
|
|
# ("post_discord", "Can post to Discord"),
|
|
|
|
# ("query_search", "Can search with query strings"), #
|
|
|
|
# ("use_insights", "Can use the Insights page"),
|
|
|
|
# ("index_int", "Can use the internal index"),
|
|
|
|
# ("index_meta", "Can use the meta index"),
|
|
|
|
# ("restricted_sources", "Can access restricted sources"),
|
|
|
|
# )
|