From cbca55ff49dd0aa742c7e990978377c79d550e57 Mon Sep 17 00:00:00 2001 From: Mark Veidemanis Date: Tue, 17 Oct 2023 22:09:05 +0100 Subject: [PATCH] Add model definitions --- core/models.py | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) diff --git a/core/models.py b/core/models.py index 1de46e0..58ca517 100644 --- a/core/models.py +++ b/core/models.py @@ -6,6 +6,53 @@ from django.db import models logger = logging.getLogger(__name__) +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"), +) + class User(AbstractUser): # Stripe customer ID @@ -31,6 +78,86 @@ class NotificationSettings(models.Model): return f"Notification settings for {self.user}" +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) + + # class Perms(models.Model): # class Meta: # permissions = (